# Changelog
Source: https://mkbrr.com/changelog
Latest updates and improvements to mkbrr
### Bug fixes
* [f32da2a](https://github.com/autobrr/mkbrr/commit/f32da2a258b4acd048d631c3bb656fadd68084c1): Normalize decomposed filenames to NFC ([#183](https://github.com/autobrr/mkbrr/pull/183)) (@s0up4200)
### Other work
* [786882e](https://github.com/autobrr/mkbrr/commit/786882e3f13607b4aeb635aa2a54cd2c26330bcb): Bump the github group with 2 updates ([#178](https://github.com/autobrr/mkbrr/pull/178)) (@dependabot\[bot])
* [cc3d21d](https://github.com/autobrr/mkbrr/commit/cc3d21d9c2e9705fc0de89ad001079beaa5834da): Bump Go to 1.26 ([#180](https://github.com/autobrr/mkbrr/pull/180)) (@s0up4200)
* [f3f9c1f](https://github.com/autobrr/mkbrr/commit/f3f9c1f2cecc64d4577f2684ea7daa55daaaa6e7): Migrate anacrolix/torrent to autobrr/go-torrent ([#181](https://github.com/autobrr/mkbrr/pull/181)) (@zze0s)
**Full Changelog**: [v1.24.0...v1.24.1](https://github.com/autobrr/mkbrr/compare/v1.24.0...v1.24.1)
### Contributors
* @dependabot\[bot]
* @s0up4200
* @zze0s
### New Features
* [299a21d](https://github.com/autobrr/mkbrr/commit/299a21d2a9cb72cace80db169934cf1128786cdf): Add drag and drop support ([#169](https://github.com/autobrr/mkbrr/pull/169)) (@gl0ryus)
### Bug fixes
* [b94721d](https://github.com/autobrr/mkbrr/commit/b94721d60b63539af171ce27652d47bba66440ae): Prevent blank screen in GUI when all presets are deleted ([#168](https://github.com/autobrr/mkbrr/pull/168)) (@gl0ryus)
* [156c996](https://github.com/autobrr/mkbrr/commit/156c996fc6f4316b650233ecbd2acfdb0e7f98ef): Harden GUI against blank-screen render crashes ([#170](https://github.com/autobrr/mkbrr/pull/170)) (@s0up4200)
* [c32116d](https://github.com/autobrr/mkbrr/commit/c32116d3fcd51a2347b815814add80e40571e6f5): Add missing skip\_prefix and fail\_on\_season\_warning to batch schema ([#171](https://github.com/autobrr/mkbrr/pull/171)) (@s0up4200)
* [2cf20a4](https://github.com/autobrr/mkbrr/commit/2cf20a46374c328a4bb2324f0f5852240081cd8c): Allow workers 0 (auto) and up to 64 to match CLI ([#176](https://github.com/autobrr/mkbrr/pull/176)) (@s0up4200)
### Other work
* [5b24d79](https://github.com/autobrr/mkbrr/commit/5b24d79a315774392a22ef68b65b2efcbd10432d): Bump the github group with 4 updates ([#167](https://github.com/autobrr/mkbrr/pull/167)) (@dependabot\[bot])
* [35daa3a](https://github.com/autobrr/mkbrr/commit/35daa3afeeb4866915857dd952b092f288b8d22b): Bump actions/checkout from 6 to 7 in the github group ([#172](https://github.com/autobrr/mkbrr/pull/172)) (@dependabot\[bot])
* [b038989](https://github.com/autobrr/mkbrr/commit/b038989e47a3c7bf13cfe58dd1783352b4087ecd): Bump github.com/schollz/progressbar/v3 from 3.19.0 to 3.19.1 in the golang group ([#174](https://github.com/autobrr/mkbrr/pull/174)) (@dependabot\[bot])
**Full Changelog**: [v1.23.0...v1.24.0](https://github.com/autobrr/mkbrr/compare/v1.23.0...v1.24.0)
### Contributors
* @dependabot\[bot]
* @gl0ryus
* @s0up4200
### New Features
* [d89efe2](https://github.com/autobrr/mkbrr/commit/d89efe2c5c500eecb78d9dd1f49ffbfb4923fa94): Add cross-platform desktop GUI using Wails ([#165](https://github.com/autobrr/mkbrr/pull/165)) (@sammy44nts)
### Other work
* [1f9149e](https://github.com/autobrr/mkbrr/commit/1f9149eb005382b715954214abebb26beb382dfd): Bump actions/checkout from 4 to 6 in the github group across 1 directory ([#160](https://github.com/autobrr/mkbrr/pull/160)) (@dependabot\[bot])
* [d93e9cb](https://github.com/autobrr/mkbrr/commit/d93e9cbf43119f5c86f674f06475d074c0773204): Streamline hashing and verification hot paths ([#164](https://github.com/autobrr/mkbrr/pull/164)) (@s0up4200)
**Full Changelog**: [v1.22.0...v1.23.0](https://github.com/autobrr/mkbrr/compare/v1.22.0...v1.23.0)
### Contributors
* @dependabot\[bot]
* @sammy44nts
* @s0up4200
### New Features
* [3f6f53e](https://github.com/autobrr/mkbrr/commit/3f6f53e2d636a64ee639a82241fe0b7585318db7): Update Aither piece size ranges ([#162](https://github.com/autobrr/mkbrr/pull/162)) (@spin-drift)
### Bug fixes
* [b16fb13](https://github.com/autobrr/mkbrr/commit/b16fb1312a64a97ce10f74b0f9bc654d9797c581): Increase TorrentLeech max piece length from 2^24 to 2^27 ([#161](https://github.com/autobrr/mkbrr/pull/161)) (@s0up4200)
**Full Changelog**: [v1.21.0...v1.22.0](https://github.com/autobrr/mkbrr/compare/v1.21.0...v1.22.0)
### Contributors
* @spin-drift
* @s0up4200
### New Features
* [9326b63](https://github.com/autobrr/mkbrr/commit/9326b63e07968744924eeb6d83df15cb421233df): Add name argument ([#141](https://github.com/autobrr/mkbrr/pull/141)) (@illutr0n)
* [89779bf](https://github.com/autobrr/mkbrr/commit/89779bf4de4edf7bf77a782c1beb1a712335af41): Add onlyencodes piece rules ([#150](https://github.com/autobrr/mkbrr/pull/150)) (@s0up4200)
* [34c8312](https://github.com/autobrr/mkbrr/commit/34c8312bb311b90e3dbad9e86969317e4a9311b2): Support path-based glob patterns ([#147](https://github.com/autobrr/mkbrr/pull/147)) (@tetrahydroc)
* [1c5affa](https://github.com/autobrr/mkbrr/commit/1c5affaa37f1899d3a3ae58a02d5e04e52e6861b): Add ability to remove private/source/comment fields ([#153](https://github.com/autobrr/mkbrr/pull/153)) (@s0up4200)
* [34606fc](https://github.com/autobrr/mkbrr/commit/34606fcaa5734e9c3d3e4d478245f1a641750a45): Add --target-piece-count option ([#156](https://github.com/autobrr/mkbrr/pull/156)) (@s0up4200)
### Bug fixes
* [62b1596](https://github.com/autobrr/mkbrr/commit/62b1596ec979e46d98ea886969f288eef33d4204): Use non-deprecated formats syntax in archives (@s0up4200)
* [cd5ba11](https://github.com/autobrr/mkbrr/commit/cd5ba11bea7830391afc85ab8613c1aa2c459e53): Apply entropy option from preset during modify ([#151](https://github.com/autobrr/mkbrr/pull/151)) (@s0up4200)
* [5466955](https://github.com/autobrr/mkbrr/commit/5466955518d832a8e17cc3b0699cf97c6d88682f): Add entropy support to batch mode ([#152](https://github.com/autobrr/mkbrr/pull/152)) (@s0up4200)
* [3ad0aee](https://github.com/autobrr/mkbrr/commit/3ad0aee53e88da0f03ab35637cfcf097818a9747): Use torrent-level byte offsets for multi-file verification ([#154](https://github.com/autobrr/mkbrr/pull/154)) (@s0up4200)
* [b9c78e1](https://github.com/autobrr/mkbrr/commit/b9c78e134d74ca4ad0cfa179270f329c3178efbc): Remove self-managed homebrew tap ([#157](https://github.com/autobrr/mkbrr/pull/157)) (@s0up4200)
### Other work
* [9f5cd2f](https://github.com/autobrr/mkbrr/commit/9f5cd2f54e66eaa35c6c960249e8867e3b4f4378): Add .pre-commit-config.yaml for code quality checks and update .gitignore to include .envrc (@s0up4200)
* [4a5481b](https://github.com/autobrr/mkbrr/commit/4a5481b860d75da35c23647740c524d0e86cdd55): Bump the github group with 2 updates ([#129](https://github.com/autobrr/mkbrr/pull/129)) (@dependabot\[bot])
* [1e167db](https://github.com/autobrr/mkbrr/commit/1e167dbf0b241998d6d695bd937e91e244cbcd23): Bump the golang group with 4 updates ([#130](https://github.com/autobrr/mkbrr/pull/130)) (@dependabot\[bot])
* [6e8c93c](https://github.com/autobrr/mkbrr/commit/6e8c93c6cb6052fe35a1b398f52f4a5567f532bb): Include Buy Me a Coffee and Ko-fi links (@s0up4200)
* [79cef17](https://github.com/autobrr/mkbrr/commit/79cef171b91d26965fce16181a59f91f398e0baa): Replace custom min/max with go1.21+ native builtins ([#142](https://github.com/autobrr/mkbrr/pull/142)) (@fabricionaweb)
* [ad74e56](https://github.com/autobrr/mkbrr/commit/ad74e5652ecd9c011f50717aa73cfccf3930cba5): Bump the github group with 3 updates ([#143](https://github.com/autobrr/mkbrr/pull/143)) (@dependabot\[bot])
* [7d59bca](https://github.com/autobrr/mkbrr/commit/7d59bca59d0e8eadebf709165bbde508ed3d46e1): Bump github.com/anacrolix/torrent in the golang group ([#144](https://github.com/autobrr/mkbrr/pull/144)) (@dependabot\[bot])
* [b46ed88](https://github.com/autobrr/mkbrr/commit/b46ed882ce308cbee8790ed746a7bd090259f193): Add new tracker configuration for torrentleech.org ([#139](https://github.com/autobrr/mkbrr/pull/139)) (@illutr0n)
* [c3ac2c5](https://github.com/autobrr/mkbrr/commit/c3ac2c5f3ad7c38870da872b7015140dd72cf222): Bump the github group with 5 updates ([#145](https://github.com/autobrr/mkbrr/pull/145)) (@dependabot\[bot])
* [a06c966](https://github.com/autobrr/mkbrr/commit/a06c9661f1416f48917d6ffa1c363d50f008638b): Update installation instructions for Homebrew ([#146](https://github.com/autobrr/mkbrr/pull/146)) (@chrisfinazzo)
* [61efa7d](https://github.com/autobrr/mkbrr/commit/61efa7d15a23dce3ec02859b9c37f8dc309fdf44): Bump github.com/fatih/color from 1.18.0 to 1.19.0 in the golang group ([#155](https://github.com/autobrr/mkbrr/pull/155)) (@dependabot\[bot])
* [4c952ed](https://github.com/autobrr/mkbrr/commit/4c952ed23a00726294212a3a1cafb8b1542fd88a): Add Claude Code GitHub Workflow ([#158](https://github.com/autobrr/mkbrr/pull/158)) (@s0up4200)
**Full Changelog**: [v1.20.0...v1.21.0](https://github.com/autobrr/mkbrr/compare/v1.20.0...v1.21.0)
### Contributors
* @s0up4200
* @dependabot\[bot]
* @fabricionaweb
* @illutr0n
* @chrisfinazzo
* @tetrahydroc
### New Features
* [2528c79](https://github.com/autobrr/mkbrr/commit/2528c79d20457df94e02a713f4a8251592758954): Add homebrew formula generation to goreleaser ([#135](https://github.com/autobrr/mkbrr/pull/135)) (@s0up4200)
### Bug fixes
* [dc7cb4c](https://github.com/autobrr/mkbrr/commit/dc7cb4c3ce0b76c9c64190221ce6ef2d9bb0d6ba): Use HOMEBREW\_TAP\_GITHUB\_TOKEN for tap access (@s0up4200)
* [e37bab6](https://github.com/autobrr/mkbrr/commit/e37bab634faa07106a24e1e29e8d995804de7d14): Pass HOMEBREW\_TAP\_GITHUB\_TOKEN to goreleaser (@s0up4200)
**Full Changelog**: [v1.19.0...v1.20.0](https://github.com/autobrr/mkbrr/compare/v1.19.0...v1.20.0)
### Contributors
* @s0up4200
### New Features
* [577f795](https://github.com/autobrr/mkbrr/commit/577f795867616b0230224cdc3499c2f562b3acd7): Show magnet link in inspect output ([#120](https://github.com/autobrr/mkbrr/pull/120)) (@IonBazan)
### Other work
* [43ba795](https://github.com/autobrr/mkbrr/commit/43ba795d7ce97f47f4480a857ffc77cf497b9d25): Use separate tiers for multiple trackers ([#124](https://github.com/autobrr/mkbrr/pull/124)) (@s0up4200)
* [9ce168b](https://github.com/autobrr/mkbrr/commit/9ce168bdf9875449e4bcd2c073c45f841c9b2769): Bump actions/checkout from 5 to 6 in the github group ([#125](https://github.com/autobrr/mkbrr/pull/125)) (@dependabot\[bot])
**Full Changelog**: [v1.18.0...v1.19.0](https://github.com/autobrr/mkbrr/compare/v1.18.0...v1.19.0)
### Contributors
* @IonBazan
* @s0up4200
* @dependabot\[bot]
### Bug fixes
* [c336c1d](https://github.com/autobrr/mkbrr/commit/c336c1d7c7aed00826c75b1089ee1c0e3dd40eb2): Ignore synology metadata directories ([#122](https://github.com/autobrr/mkbrr/pull/122)) (@s0up4200)
### Other work
* [c73d213](https://github.com/autobrr/mkbrr/commit/c73d213ecb942b09fdbf84877104548888cc2ba6): Bump the github group with 2 updates ([#121](https://github.com/autobrr/mkbrr/pull/121)) (@dependabot\[bot])
* [0d83712](https://github.com/autobrr/mkbrr/commit/0d8371230ad262891a4bd8690f83de60a5221e62): Update funding information in FUNDING.yml (@s0up4200)
**Full Changelog**: [v1.17.0...v1.18.0](https://github.com/autobrr/mkbrr/compare/v1.17.0...v1.18.0)
### Contributors
* @dependabot\[bot]
* @s0up4200
### Bug fixes
* [d7872be](https://github.com/autobrr/mkbrr/commit/d7872be8d441547b34a2f6a82379e3c940d2a745): Set default workers in profile ([#119](https://github.com/autobrr/mkbrr/pull/119)) (@IonBazan)
### Other work
* [98ae784](https://github.com/autobrr/mkbrr/commit/98ae78468068071360c6e485e49ec5c3df724d5c): Update types.go (@s0up4200)
* [e26ee58](https://github.com/autobrr/mkbrr/commit/e26ee58151cbd226be8072e9da7118d9c12aee50): Bump actions/setup-go from 5 to 6 in the github group ([#110](https://github.com/autobrr/mkbrr/pull/110)) (@dependabot\[bot])
* [bebfd8c](https://github.com/autobrr/mkbrr/commit/bebfd8c5a96b5ca9e51c443e90dbdad349da0760): Allow inspecting multiple torrent files ([#118](https://github.com/autobrr/mkbrr/pull/118)) (@IonBazan)
* [a1e30b5](https://github.com/autobrr/mkbrr/commit/a1e30b583a873d2e9c46eb8a4529613644505a47): Do not create announce list for single tracker ([#117](https://github.com/autobrr/mkbrr/pull/117)) (@IonBazan)
* [4381d8d](https://github.com/autobrr/mkbrr/commit/4381d8de1568d8fbcfb99ef2d21641f385736c45): Update to Go 1.25 ([#109](https://github.com/autobrr/mkbrr/pull/109)) (@s0up4200)
* [59b6edc](https://github.com/autobrr/mkbrr/commit/59b6edce60f5d1ded2b9faf47a841656c74d4414): Bump the golang group across 1 directory with 4 updates ([#113](https://github.com/autobrr/mkbrr/pull/113)) (@dependabot\[bot])
**Full Changelog**: [v1.16.0...v1.17.0](https://github.com/autobrr/mkbrr/compare/v1.16.0...v1.17.0)
### Contributors
* @s0up4200
* @dependabot\[bot]
* @IonBazan
### New Features
* [814682d](https://github.com/autobrr/mkbrr/commit/814682d95592203842db63155561ded9af514a21): Add sources and more trackers ([#107](https://github.com/autobrr/mkbrr/pull/107)) (@fabricionaweb)
* [0df5fee](https://github.com/autobrr/mkbrr/commit/0df5fee3f525ecfa962aa6e96a46b8fa9c898095): Make mkbrr usable as Go library ([#111](https://github.com/autobrr/mkbrr/pull/111)) (@s0up4200)
### Other work
* [0d5983d](https://github.com/autobrr/mkbrr/commit/0d5983d1e2c668556b1d9103c17fbf194069fbf8): Bump the github group across 1 directory with 2 updates ([#106](https://github.com/autobrr/mkbrr/pull/106)) (@dependabot\[bot])
**Full Changelog**: [v1.15.0...v1.16.0](https://github.com/autobrr/mkbrr/compare/v1.15.0...v1.16.0)
### Contributors
* @dependabot\[bot]
* @fabricionaweb
* @s0up4200
### New Features
* [448873b](https://github.com/autobrr/mkbrr/commit/448873b3e028227205f4bfd9162b14726543ad02): Add -q shortcut and --info-only flag ([#102](https://github.com/autobrr/mkbrr/pull/102)) (@s0up4200)
**Full Changelog**: [v1.14.0...v1.15.0](https://github.com/autobrr/mkbrr/compare/v1.14.0...v1.15.0)
### Contributors
* @s0up4200
### New Features
* [a737bdc](https://github.com/autobrr/mkbrr/commit/a737bdc86c7167358422ad4de1a7bf247afef90a): Add multiple tracker support to create command ([#99](https://github.com/autobrr/mkbrr/pull/99)) (@s0up4200)
### Bug fixes
* [15e50d1](https://github.com/autobrr/mkbrr/commit/15e50d183e5e76f3dc33a2867d589b9746806d49): Season pack detection for single episodes and file tree display ([#100](https://github.com/autobrr/mkbrr/pull/100)) (@s0up4200)
**Full Changelog**: [v1.13.1...v1.14.0](https://github.com/autobrr/mkbrr/compare/v1.13.1...v1.14.0)
### Contributors
* @s0up4200
### Bug fixes
* [f8c455c](https://github.com/autobrr/mkbrr/commit/f8c455cc33735e4b5d33a9a6f0807c22cc86194a): Accurate duration display without rounding ([#96](https://github.com/autobrr/mkbrr/pull/96)) (@s0up4200)
**Full Changelog**: [v1.13.0...v1.13.1](https://github.com/autobrr/mkbrr/compare/v1.13.0...v1.13.1)
### Contributors
* @s0up4200
### New Features
* [a4e362f](https://github.com/autobrr/mkbrr/commit/a4e362f1ce1558d67987ba54a01ae527d18fe858): Add fail-on-season-warning flag ([#94](https://github.com/autobrr/mkbrr/pull/94)) (@s0up4200)
**Full Changelog**: [v1.12.1...v1.13.0](https://github.com/autobrr/mkbrr/compare/v1.12.1...v1.13.0)
### Contributors
* @s0up4200
### Bug fixes
* [fb4f8b9](https://github.com/autobrr/mkbrr/commit/fb4f8b9c54702e5e2b68a193363a18df8a47f36c): Multiple trackers cannot be added ([#93](https://github.com/autobrr/mkbrr/pull/93)) (@luckylittle)
**Full Changelog**: [v1.12.0...v1.12.1](https://github.com/autobrr/mkbrr/compare/v1.12.0...v1.12.1)
### Contributors
* @luckylittle
### New Features
* [ebc5e05](https://github.com/autobrr/mkbrr/commit/ebc5e054cfd76fb87075c315206ff2c6971cd4a7): Add AlphaRatio ([#90](https://github.com/autobrr/mkbrr/pull/90)) (@s0up4200)
* [18b5884](https://github.com/autobrr/mkbrr/commit/18b58846c7d408a291efa85e2c52c0f4cba644c2): Add output directory support to preset ([#91](https://github.com/autobrr/mkbrr/pull/91)) (@s0up4200)
### Other work
* [2dcfdbe](https://github.com/autobrr/mkbrr/commit/2dcfdbe5b542d722f8d52f184edaa5ab6e2c52aa): Upgrade Go to v1.24 ([#88](https://github.com/autobrr/mkbrr/pull/88)) (@s0up4200)
**Full Changelog**: [v1.11.0...v1.12.0](https://github.com/autobrr/mkbrr/compare/v1.11.0...v1.12.0)
### Contributors
* @s0up4200
### New Features
* [4fc96e4](https://github.com/autobrr/mkbrr/commit/4fc96e41b0b8d8147e8864b5b76232582e672063): Add --output-dir flag ([#86](https://github.com/autobrr/mkbrr/pull/86)) (@s0up4200)
* [bed4819](https://github.com/autobrr/mkbrr/commit/bed4819b76e4898f43de149d9bb29867dbd19e90): Use metadata title for output name ([#87](https://github.com/autobrr/mkbrr/pull/87)) (@s0up4200)
* [c790990](https://github.com/autobrr/mkbrr/commit/c7909904f7669451cbc7ac001f6d7e19e67c0141): Add Docker builds ([#85](https://github.com/autobrr/mkbrr/pull/85)) (@s0up4200)
### Other work
* [53516c1](https://github.com/autobrr/mkbrr/commit/53516c1be81eaacb2f40752febfe5ad42548c0e0): Bump github.com/creativeprojects/go-selfupdate ([#83](https://github.com/autobrr/mkbrr/pull/83)) (@dependabot\[bot])
**Full Changelog**: [v1.10.0...v1.11.0](https://github.com/autobrr/mkbrr/compare/v1.10.0...v1.11.0)
### Contributors
* @dependabot\[bot]
* @s0up4200
### New Features
* [1683103](https://github.com/autobrr/mkbrr/commit/1683103d0b72e207b1194c34c70100d47bc32bda): Add workers flag ([#74](https://github.com/autobrr/mkbrr/pull/74)) (@s0up4200)
* [9a5a850](https://github.com/autobrr/mkbrr/commit/9a5a850f4d0f5985ba4c5444025b0ffa9d4bc668): Add default source setting ([#82](https://github.com/autobrr/mkbrr/pull/82)) (@s0up4200)
### Bug fixes
* [b73489e](https://github.com/autobrr/mkbrr/commit/b73489e60e9ac25d89bd88e2f3c29e6cc29bd287): Prevent filename collisions ([#76](https://github.com/autobrr/mkbrr/pull/76)) (@s0up4200)
* [12e674b](https://github.com/autobrr/mkbrr/commit/12e674b4a9adbc67208dae4437413685ae72a99a): Remove unnecessary season pack suspicion check ([#80](https://github.com/autobrr/mkbrr/pull/80)) (@s0up4200)
### Other work
* [a9be98f](https://github.com/autobrr/mkbrr/commit/a9be98f801e0db0e858f3f27e05a0db492983984): Update documentation ([#75](https://github.com/autobrr/mkbrr/pull/75)) (@s0up4200)
* [51fbe55](https://github.com/autobrr/mkbrr/commit/51fbe55b880c6e31e8ee8ebb2b4c6a610e722cee): Other(makefile): add PGO installation target (@s0up4200)
* [ac76819](https://github.com/autobrr/mkbrr/commit/ac7681960f1b9225c37a014c401454d6707c850e): Helper functions and structs ([#77](https://github.com/autobrr/mkbrr/pull/77)) (@s0up4200)
**Full Changelog**: [v1.9.0...v1.10.0](https://github.com/autobrr/mkbrr/compare/v1.9.0...v1.10.0)
### Contributors
* @s0up4200
### New Features
* [f932554](https://github.com/autobrr/mkbrr/commit/f932554137aa29a033b8765ccee98d601f4cfe00): Struct alignment with betteralign ([#69](https://github.com/autobrr/mkbrr/pull/69)) (@s0up4200)
* [4333558](https://github.com/autobrr/mkbrr/commit/4333558493f88bb575ef21763663691167d58c1a): Add zone.identifier to patterns ([#70](https://github.com/autobrr/mkbrr/pull/70)) (@s0up4200)
* [fb9a2c4](https://github.com/autobrr/mkbrr/commit/fb9a2c484681589930ea26d678b918011e2288d6): Add seedpool ([#71](https://github.com/autobrr/mkbrr/pull/71)) (@s0up4200)
* [788fff5](https://github.com/autobrr/mkbrr/commit/788fff5e755eaa12c6812f0322aac7ebcecb8237): Support entropy flag in presets ([#72](https://github.com/autobrr/mkbrr/pull/72)) (@s0up4200)
### Bug fixes
* [301128b](https://github.com/autobrr/mkbrr/commit/301128b112cbe3d84420588aae8f9513d7db26d8): Entropy flag when not using preset ([#73](https://github.com/autobrr/mkbrr/pull/73)) (@s0up4200)
* [7ed87de](https://github.com/autobrr/mkbrr/commit/7ed87deeaa480456f35713d9db6af60e25ad6730): Only display file tree if verbose (@s0up4200)
* [ba56ae3](https://github.com/autobrr/mkbrr/commit/ba56ae3dc9eae1bae956316b1eefbff7a8c19ebc): Suppress files when over limit (@s0up4200)
* [217f128](https://github.com/autobrr/mkbrr/commit/217f1286e4e0043f71afd7be967ce3a8f0cdf004): Show top directory for file listings (@s0up4200)
### Other work
* [8dbb299](https://github.com/autobrr/mkbrr/commit/8dbb299ce65841c1cfb1e7c53919e29c31144757): Set file tree to verbose only ([#68](https://github.com/autobrr/mkbrr/pull/68)) (@s0up4200)
**Full Changelog**: [v1.8.1...v1.9.0](https://github.com/autobrr/mkbrr/compare/v1.8.1...v1.9.0)
### Contributors
* @s0up4200
### Bug fixes
* [595c76d](https://github.com/autobrr/mkbrr/commit/595c76dc2661f8fe00434c462c8218ad47263335): Recalculate file offsets after sorting ([#65](https://github.com/autobrr/mkbrr/pull/65)) (@s0up4200)
* [3eb2bb7](https://github.com/autobrr/mkbrr/commit/3eb2bb7de879602c07287341b004f673fff7b8bb): Handle symlinks during creation ([#66](https://github.com/autobrr/mkbrr/pull/66)) (@s0up4200)
**Full Changelog**: [v1.8.0...v1.8.1](https://github.com/autobrr/mkbrr/compare/v1.8.0...v1.8.1)
### Contributors
* @s0up4200
### New Features
* [3b46cde](https://github.com/autobrr/mkbrr/commit/3b46cde083824242ad73c3d3d84eb1f04a575525): Add check command ([#58](https://github.com/autobrr/mkbrr/pull/58)) (@s0up4200)
### Bug fixes
* [0427550](https://github.com/autobrr/mkbrr/commit/04275509a2a9a76421866f852d25a8231bf987ee): Correct multi-episode season pack detection ([#56](https://github.com/autobrr/mkbrr/pull/56)) (@s0up4200)
* [505feed](https://github.com/autobrr/mkbrr/commit/505feed2f6046a4427c388e0e0a43f759afa5c2c): Handle filepath.Match errors ([#57](https://github.com/autobrr/mkbrr/pull/57)) (@s0up4200)
### Other work
* [4d6b8f7](https://github.com/autobrr/mkbrr/commit/4d6b8f76fe6b60e5b51badea32e4f2f5451bb7d6): Setup goreleaser-pro ([#54](https://github.com/autobrr/mkbrr/pull/54)) (@s0up4200)
* [1f78ae4](https://github.com/autobrr/mkbrr/commit/1f78ae4531ae68ccdb3ba5453e019829c909d4c0): Revert "build: setup goreleaser-pro" (#61) ([#54](https://github.com/autobrr/mkbrr/pull/54)) (@s0up4200)
**Full Changelog**: [v1.7.0...v1.8.0](https://github.com/autobrr/mkbrr/compare/v1.7.0...v1.8.0)
### Contributors
* @s0up4200
### New Features
* [cc43305](https://github.com/autobrr/mkbrr/commit/cc43305): Support include patterns ([#51](https://github.com/autobrr/mkbrr/pull/51)) (@s0up4200)
### Other work
* [964c41c](https://github.com/autobrr/mkbrr/commit/964c41c): Update README.md ([#49](https://github.com/autobrr/mkbrr/pull/49)) (@s0up4200)
* [cc4f0ee](https://github.com/autobrr/mkbrr/commit/cc4f0ee): Add benchmarks to readme ([#52](https://github.com/autobrr/mkbrr/pull/52)) (@s0up4200)
**Full Changelog**: [v1.6.1...v1.7.0](https://github.com/autobrr/mkbrr/compare/v1.6.1...v1.7.0)
### Contributors
* @s0up4200
### Bug fixes
* [cba577a](https://github.com/autobrr/mkbrr/commit/cba577a): Fix update: replace selfupdater lib with fork ([#48](https://github.com/autobrr/mkbrr/pull/48)) (@s0up4200)
**Full Changelog**: [v1.6.0...v1.6.1](https://github.com/autobrr/mkbrr/compare/v1.6.0...v1.6.1)
### Contributors
* @s0up4200
### New Features
* [1ee35d9](https://github.com/autobrr/mkbrr/commit/1ee35d9): Add skip-prefix flag ([#43](https://github.com/autobrr/mkbrr/pull/43)) (@s0up4200)
* [b1d16e6](https://github.com/autobrr/mkbrr/commit/b1d16e6): Support explicit tracker selection ([#47](https://github.com/autobrr/mkbrr/pull/47)) (@s0up4200)
**Full Changelog**: [v1.3.0...v1.6.0](https://github.com/autobrr/mkbrr/compare/v1.3.0...v1.6.0)
### Contributors
* @s0up4200
### New Features
* [534c9f1](https://github.com/autobrr/mkbrr/commit/534c9f1): Use tracker domain as prefix ([#30](https://github.com/autobrr/mkbrr/pull/30)) (@s0up4200)
* [1e6d445](https://github.com/autobrr/mkbrr/commit/1e6d445): Add torrent-syndikat tracker ([#28](https://github.com/autobrr/mkbrr/pull/28)) (@s0up4200)
* [ba506ba](https://github.com/autobrr/mkbrr/commit/ba506ba): Add incomplete season pack detection ([#29](https://github.com/autobrr/mkbrr/pull/29)) (@s0up4200)
### Other work
* [72bf690](https://github.com/autobrr/mkbrr/commit/72bf690): Improve readme ([#31](https://github.com/autobrr/mkbrr/pull/31)) (@s0up4200)
**Full Changelog**: [v1.2.0...v1.3.0](https://github.com/autobrr/mkbrr/compare/v1.2.0...v1.3.0)
### Contributors
* @s0up4200
### New Features
* [2675b8f](https://github.com/autobrr/mkbrr/commit/2675b8f): Add Homebrew formula ([#16](https://github.com/autobrr/mkbrr/pull/16)) (@s0up4200)
* [726fc73](https://github.com/autobrr/mkbrr/commit/726fc73): Add v flag for extra metadata ([#18](https://github.com/autobrr/mkbrr/pull/18)) (@s0up4200)
* [12d2392](https://github.com/autobrr/mkbrr/commit/12d2392): Add limits per tracker ([#17](https://github.com/autobrr/mkbrr/pull/17)) (@s0up4200)
* [f89a5a1](https://github.com/autobrr/mkbrr/commit/f89a5a1): Optimize piece hashing and buffer management ([#20](https://github.com/autobrr/mkbrr/pull/20)) (@s0up4200)
### Bug fixes
* [753a3e8](https://github.com/autobrr/mkbrr/commit/753a3e8): Add option to omit creator string in torrent file ([#24](https://github.com/autobrr/mkbrr/pull/24)) (@s0up4200)
### Other work
* [df97a71](https://github.com/autobrr/mkbrr/commit/df97a71): Implement PGO ([#21](https://github.com/autobrr/mkbrr/pull/21)) (@s0up4200)
* [2562cf5](https://github.com/autobrr/mkbrr/commit/2562cf5): Bump the golang group with 2 updates ([#25](https://github.com/autobrr/mkbrr/pull/25)) (@dependabot\[bot])
**Full Changelog**: [v1.1.0...v1.2.0](https://github.com/autobrr/mkbrr/compare/v1.1.0...v1.2.0)
### Contributors
* @s0up4200
* @dependabot
### New Features
* [5915059](https://github.com/autobrr/mkbrr/commit/5915059): Add modify command ([#12](https://github.com/autobrr/mkbrr/pull/12)) (@s0up4200)
* [722220b](https://github.com/autobrr/mkbrr/commit/722220b): Add self-update command ([#11](https://github.com/autobrr/mkbrr/pull/11)) (@zze0s)
* [f982c4e](https://github.com/autobrr/mkbrr/commit/f982c4e): Add max\_piece\_length flag ([#8](https://github.com/autobrr/mkbrr/pull/8)) (@martylukyy)
### Bug fixes
* [5d70d7e](https://github.com/autobrr/mkbrr/commit/5d70d7e): Disable cgo for build process ([#14](https://github.com/autobrr/mkbrr/pull/14)) (@s0up4200)
* [ecfc1dd](https://github.com/autobrr/mkbrr/commit/ecfc1dd): Silence help text after error ([#9](https://github.com/autobrr/mkbrr/pull/9)) (@martylukyy)
### Other work
* [cf059cb](https://github.com/autobrr/mkbrr/commit/cf059cb): Display sizes in IEC units ([#7](https://github.com/autobrr/mkbrr/pull/7)) (@martylukyy)
* [6f08a62](https://github.com/autobrr/mkbrr/commit/6f08a62): Skip heavy file tests on Windows to improve CI speed ([#15](https://github.com/autobrr/mkbrr/pull/15)) (@s0up4200)
**Full Changelog**: [v1.0.0...v1.1.0](https://github.com/autobrr/mkbrr/compare/v1.0.0...v1.1.0)
### Contributors
* @s0up4200
* @martylukyy
* @zze0s
### Bug fixes
* [4db1876](https://github.com/autobrr/mkbrr/commit/4db1876): Improve install target (@s0up4200)
### Other work
* [777aabf](https://github.com/autobrr/mkbrr/commit/777aabf): Update preset examples (@s0up4200)
**Full Changelog**: [v0.2.0...v1.0.0](https://github.com/autobrr/mkbrr/compare/v0.2.0...v1.0.0)
### Contributors
* @s0up4200
### New Features
* [43994e1](https://github.com/autobrr/mkbrr/commit/43994e1): Improve output duration ([#4](https://github.com/autobrr/mkbrr/pull/4)) (@s0up4200)
* [39b80ac](https://github.com/autobrr/mkbrr/commit/39b80ac): Add preset support ([#6](https://github.com/autobrr/mkbrr/pull/6)) (@s0up4200)
* [57de4e3](https://github.com/autobrr/mkbrr/commit/57de4e3): Batch processing ([#3](https://github.com/autobrr/mkbrr/pull/3)) (@s0up4200)
### Bug fixes
* [88c2f04](https://github.com/autobrr/mkbrr/commit/88c2f04): Remove name option ([#5](https://github.com/autobrr/mkbrr/pull/5)) (@s0up4200)
### Other work
* [4696484](https://github.com/autobrr/mkbrr/commit/4696484): Update readme (@s0up4200)
* [12ef3cd](https://github.com/autobrr/mkbrr/commit/12ef3cd): Readme cleanup (@s0up4200)
* [e234434](https://github.com/autobrr/mkbrr/commit/e234434): Update readme (@s0up4200)
**Full Changelog**: [v0.1.0...v0.2.0](https://github.com/autobrr/mkbrr/compare/v0.1.0...v0.2.0)
### Contributors
* @s0up4200
# check
Source: https://mkbrr.com/cli-reference/check
Verify the integrity of content against a torrent file.
## Usage
```bash theme={null}
mkbrr check [flags]
```
## Arguments
* ``: Path to the `.torrent` file. (Required)
* ``: Path to the directory or file containing the data to check. (Required)
## Flags
Be verbose.
When enabled, shows detailed information about the verification process including any bad piece indices.
Enable quiet mode, printing only the completion percentage. Useful for scripts.
Useful for automated scripts or when you only need the verification status.
Manually specify the number of concurrent goroutines used for hashing.
Experimenting with different worker values *might* yield better performance than the default automatic setting.
## Examples
### Basic Check
Verify the content in `my_download_folder` against `my_torrent.torrent`:
### Verbose Check
Verify content and show indices of any bad pieces:
### Quiet Check
# create
Source: https://mkbrr.com/cli-reference/create
Create a new torrent file from a file or directory.
## Usage
```bash theme={null}
mkbrr create /path/to/content [flags]
```
Create torrents in two modes:
* Single file/directory mode (default)
* [Batch mode](/features/batch-mode) using a YAML config file
Common settings can be saved and reused with [presets](/features/presets).
By default, when a tracker URL is provided, the output filename will be prefixed with the tracker domain (e.g. "example\_filename.torrent"). Use `--skip-prefix` to disable this behavior.
## Arguments
* `/path/to/content`: (Required unless using `-b`) The path to the source file or directory.
## Flags
### Input & Output
Tracker URL. Can be specified multiple times to add several trackers. Optional.
Set torrent name (default: source filename).
Optional. Set output path (default: `.torrent` or `_.torrent`).
Output directory for created torrent.
Don't add tracker domain prefix to output filename.
### Advanced Input (Batch & Presets)
Batch config file (YAML). Cannot be used with a path argument.
For creating multiple torrents in one go. See the [Batch Mode](/features/batch-mode) documentation for details.
Use preset from config.
For reusing common settings across torrents. See the [Presets](/features/presets) documentation for details.
Preset config file (default `~/.config/mkbrr/presets.yaml`).
Set custom path to presets.yaml. See the [Presets](/features/presets) documentation for details.
### Content Selection
Exclude files matching these patterns (e.g., `"*.nfo,*.jpg"` or `--exclude "*.nfo" --exclude "*.jpg"`).
Use this to filter out unwanted files like NFOs, samples, or extras that shouldn't be in the torrent. See the [filtering guide](/features/filtering) for detailed pattern rules and examples.
Include only files matching these patterns (e.g., `"*.mkv,*.mp4"` or `--include "*.mkv" --include "*.mp4"`).
Using include patterns activates whitelist mode. See the [filtering guide](/features/filtering) for detailed pattern rules and examples.
### Torrent Internals
Make torrent private.
Private flag is enabled by default for tracker compliance. Only disable if you're creating a public torrent.
Set piece length to 2^n bytes (16-27, automatic if not specified).
Let mkbrr automatically calculate the piece size unless you have specific requirements. The automatic calculation optimizes for both performance and compatibility.
Limit maximum automatically calculated piece length to 2^n bytes (14-27).
Target approximate number of pieces. Calculates optimal piece length automatically.
Mutually exclusive with `--piece-length`.
Randomize the torrent's info hash by adding or updating a unique, random `entropy` key in the info dictionary before hashing.
Cross-seeding is the practice of seeding the same content on multiple trackers. Using the entropy flag helps avoid conflicts between trackers.
### Seeding & Metadata
Specify web seed URLs. Can be used multiple times.
Web seeds provide an HTTP fallback source for the torrent content, improving availability.
Specify the source string.
Some trackers require or recommend specific source tags. Check your tracker's rules.
Specify a comment.
Omit the creation date from the torrent metadata.
Omit the creator string from the torrent metadata.
### Season Pack Detection
Exit with error if season pack completeness check detects missing episodes.
### Execution & Output Control
Manually specify the number of concurrent goroutines used for hashing.
Experimenting with different worker values *might* yield better performance than the default automatic setting.
Be verbose.
Enable quiet mode, printing only the final torrent file path upon success. Useful for scripts.
Display only torrent info without progress (implies verbose).
# inspect
Source: https://mkbrr.com/cli-reference/inspect
Inspect a torrent file and display its metadata and file structure.
## Usage
```bash theme={null}
mkbrr inspect [flags]
```
## Arguments
* ``: (Required) Path to the `.torrent` file to inspect.
## Flags
Show all metadata fields, including non-standard ones.
# CLI Reference
Source: https://mkbrr.com/cli-reference/introduction
Overview of mkbrr command-line interface commands.
Available commands:
* `create`: Create a new torrent file.
* `check`: Verify the integrity of content against a torrent file.
* `inspect`: Inspect the metadata of a torrent file.
* `modify`: Modify an existing torrent file.
* `update`: Update mkbrr to the latest version.
* `version`: Show the current version of mkbrr.
# modify
Source: https://mkbrr.com/cli-reference/modify
Modify existing torrent files using a preset or flags.
## Usage
```bash theme={null}
mkbrr modify [flags] [torrent files...]
```
Existing metadata is preserved during modification — only the fields you explicitly change are updated.
## Arguments
* `[torrent files...]`: (Required) One or more paths to the `.torrent` files to modify.
## Flags
### Input & Output
Tracker URLs (can be specified multiple times).
Set the torrent's internal name.
Output directory for modified files.
Custom output filename (without extension).
When modifying multiple torrents, using `--output` with a fixed filename will cause subsequent files to overwrite the previous ones. Use `--output-dir` instead for batch modifications to preserve all modified files with unique names.
### Advanced Input (Presets)
Use preset from config.
For reusing common settings across torrents. See the [Presets](/features/presets) documentation for details.
Preset config file (default `~/.config/mkbrr/presets.yaml`).
Set custom path to presets.yaml. See the [Presets](/features/presets) documentation for details.
### Torrent Internals
Make torrent private.
Private flag is enabled by default for tracker compliance. Only disable if you're creating a public torrent.
Remove the private flag entirely.
Randomize the torrent's info hash by adding or updating a unique, random `entropy` key in the info dictionary before hashing.
Cross-seeding is the practice of seeding the same content on multiple trackers. Using the entropy flag helps avoid conflicts between trackers.
### Seeding & Metadata
Specify web seed URLs. Can be used multiple times.
Web seeds provide an HTTP fallback source for the torrent content, improving availability.
Specify the source string.
Some trackers require or recommend specific source tags. Check your tracker's rules.
Specify a comment.
Omit the creation date from the torrent metadata.
If omitted, the creation date is updated to the current time during modification.
Omit the creator string from the torrent metadata.
### Execution & Output Control
Be verbose.
Enable quiet mode, printing only the final torrent file path upon success. Useful for scripts.
Don't add tracker domain prefix to output filename.
Show what would be modified without making changes.
When modifying multiple torrents, using `--output` with a fixed filename will cause subsequent files to overwrite the previous ones. Use `--output-dir` instead for batch modifications to preserve all modified files with unique names.
# update
Source: https://mkbrr.com/cli-reference/update
Update mkbrr to the latest version from GitHub.
## Usage
```bash theme={null}
mkbrr update
```
## Flags
This command has no flags.
# version
Source: https://mkbrr.com/cli-reference/version
Prints the version and build time information for mkbrr.
## Usage
```bash theme={null}
mkbrr version
```
## Flags
This command has no flags.
# Development & Contribution
Source: https://mkbrr.com/development
Information on building mkbrr from source, running tests, and contributing.
## Prerequisites
Before you begin, ensure you have the following installed on your system:
Install Go version 1.23.4 or higher
```bash macOS theme={null}
brew install go
```
```bash Linux (apt) theme={null}
sudo apt install golang
```
```bash Windows theme={null}
choco install golang
```
Verify installation:
```bash theme={null}
go version
```
Required for version control and building from source
```bash macOS theme={null}
brew install git
```
```bash Linux (apt) theme={null}
sudo apt install git
```
```bash Windows theme={null}
choco install git
```
Required for running build commands
```bash macOS theme={null}
# Included with Xcode Command Line Tools
xcode-select --install
```
```bash Linux (apt) theme={null}
sudo apt install make
```
```bash Windows theme={null}
choco install make
```
For other package managers or installation methods, please refer to the official documentation:
* [Go Installation Guide](https://golang.org/doc/install)
* [Git Installation Guide](https://git-scm.com/downloads)
* [Make Installation Guide](https://www.gnu.org/software/make/)
## Building from Source
1. **Clone Repository**
```bash theme={null}
git clone https://github.com/autobrr/mkbrr.git
```
2. **Change Directory**
```bash theme={null}
cd mkbrr
```
3. **Build Binary**
```bash theme={null}
make build
```
The binary will be created in the `build/` directory with version information from git tags
## Development Commands
### Build Commands
```bash theme={null}
make build # Build the binary
make clean # Remove build artifacts
make all # Clean, build, and install the binary
make install # Install the binary in GOPATH
```
### PGO (Profile-Guided Optimization)
```bash theme={null}
make profile # Generate a PGO profile (run before build-pgo)
make build-pgo # Build the binary with PGO optimization
make install-pgo # Install the PGO-optimized binary
```
### GUI Commands
```bash theme={null}
make install-wails # Install the Wails CLI (one-time requirement)
make gui-dev # Run the GUI in development mode
make gui-build # Build the GUI for the current platform
make gui-build-all # Build the GUI for all platforms
make gui-clean # Clean GUI build artifacts
```
### Testing Commands
```bash theme={null}
make test # Run tests (excluding large tests)
make test-race # Run all tests with race detector
make test-race-short # Run quick tests with race detector
make test-large # Run large tests (resource intensive)
make test-coverage # Run tests with coverage report
```
### Quality Tools
```bash theme={null}
make lint # Run golangci-lint
```
Run `make help` to see all available commands and their descriptions
## Contributing
Thanks for taking interest in contributing! We welcome anyone who wants to contribute. If you have an idea for a bigger feature or a change, please discuss it first by opening an issue or joining our [Discord](https://discord.gg/WQ2eUycxyT).
You can contribute to either:
* [Main repository](https://github.com/autobrr/mkbrr) - Core functionality and features
* [Documentation repository](https://github.com/s0up4200/mkbrr.com) - Documentation improvements
* New features and improvements
* Bug fixes and reports
* Documentation updates
* Community support
1. Fork the [mkbrr repository](https://github.com/autobrr/mkbrr/fork)
2. Clone your fork: `git clone github.com/YOURNAME/mkbrr`
3. Create a feature branch: `git checkout -b feat/your-feature`
4. Make your changes following our guidelines
* Reference related issues
* Mark as Draft if work in progress
* Keep changes focused and atomic
* Be responsive to review feedback
### Commit Guidelines
We follow [Conventional Commit Guidelines](https://www.conventionalcommits.org/en/v1.0.0/#summary):
* `feat(core): add new torrent validation`
* `fix(filter): correct pattern matching`
* `docs(api): update endpoint documentation`
No need for force pushing or rebasing - we squash commits on merge.
### Code Style
* Try to follow Go best practices and idioms
* Use meaningful variable and function names
* Add comments for complex logic
* Keep functions focused and concise
* Run `go fmt` or `gofumpt` before committing
## License
mkbrr is licensed under the **GNU General Public License v2.0**.
See the [LICENSE](https://github.com/autobrr/mkbrr/blob/main/LICENSE) file for full details.
# Batch mode
Source: https://mkbrr.com/features/batch-mode
Batch mode allows you to create multiple torrents from different source paths with varying settings in a single command execution.
Batch mode is ideal for creating multiple torrents in one go.
## Configuration File (`batch.yaml`)
Batch operations are defined in a YAML file, typically named `batch.yaml`.
```bash Command theme={null}
mkbrr create -b /path/to/your/batch.yaml
```
```yaml Example batch.yaml theme={null}
# yaml-language-server: $schema=https://raw.githubusercontent.com/autobrr/mkbrr/main/schema/batch.json
version: 1
jobs:
- output: /torrents/movie1.torrent
path: /media/movies/movie1.mkv
trackers:
- https://tracker-one.com/announce/abc
private: true
comment: "4K HDR Release"
source: "UHD"
- output: /torrents/movie2.torrent
path: /media/movies/movie2.mkv
trackers:
- https://tracker-one.com/announce/abc
private: true
comment: "1080p Release"
source: "BluRay"
```
While `batch.yaml` is a common convention, you can use any filename. Just be sure to specify it with `-b`.
### Configuration Structure
```yaml theme={null}
jobs:
- output: /torrents/movie1.torrent
path: /media/movies/movie1.mkv
trackers:
- https://tracker-one.com/announce/abc
private: true
comment: "4K HDR Release"
source: "UHD"
- output: /torrents/movie2.torrent
path: /media/movies/movie2.mkv
trackers:
- https://tracker-one.com/announce/abc
private: true
comment: "1080p Release"
source: "BluRay"
- output: /torrents/movie3.torrent
path: /media/movies/movie3.mkv
trackers:
- https://tracker-one.com/announce/abc
private: true
comment: "720p Release"
source: "WEB"
```
```yaml theme={null}
jobs:
- output: /torrents/show_s01.torrent
path: /media/tv/Show/Season 1/
trackers:
- udp://tracker-two.org:6969/announce
private: true
piece_length: 18 # 256 KiB pieces
comment: "Complete Season 1"
exclude_patterns:
- "*.nfo"
- "*.jpg"
- output: /torrents/show_s02.torrent
path: /media/tv/Show/Season 2/
trackers:
- udp://tracker-two.org:6969/announce
private: true
piece_length: 18
comment: "Complete Season 2"
exclude_patterns:
- "*.nfo"
- "*.jpg"
```
```yaml theme={null}
jobs:
- output: /torrents/album.torrent
path: /media/music/Artist/Album/
trackers:
- udp://tracker-three.org:6969/announce
private: false
piece_length: 18
webseeds:
- http://seed.example.com/album/
exclude_patterns:
- "*.log"
- "folder.jpg"
- output: /torrents/game.torrent
path: /media/games/Game.iso
trackers:
- https://tracker-four.com/announce
private: true
piece_length: 22 # 4 MiB pieces
source: "RETAIL"
- output: /torrents/ebook.torrent
path: /media/books/Book.pdf
trackers:
- https://tracker-five.com/announce
private: true
comment: "PDF + Extras"
```
### Configuration Options
* **version**: Must be `1`
* **jobs**: List of torrent creation tasks
* **output**: Path for the `.torrent` file
* **path**: Source file/directory path
* **trackers**: Announce URLs list
* **webseeds**: Web seed URLs list
* **private**: Set to `true` or `false`
* **piece\_length**: Piece size exponent
* **target\_piece\_count**: Target number of pieces (mutually exclusive with piece\_length)
* **comment**: Torrent comment string
* **source**: Source tag string
* **entropy**: Set `true` to randomize info hash for cross-seeding
* **no\_date**: Set `true` to omit creation date
* **skip\_prefix**: Set `true` to prevent adding tracker domain prefix to output filename
* **fail\_on\_season\_warning**: Set `true` to exit with error on missing episodes in season packs
* **exclude\_patterns**: Glob patterns to exclude files
* **include\_patterns**: Glob patterns to include files
You can find the formal JSON schema for validation [here](https://raw.githubusercontent.com/autobrr/mkbrr/main/schema/batch.json).
You cannot provide a source path argument directly to `mkbrr create` when using the `-b` flag. All source paths must be defined within the batch file jobs.
# Filtering
Source: https://mkbrr.com/features/filtering
Control which files are included in your torrent using glob patterns for inclusion and exclusion rules.
Use glob patterns with `--include` and `--exclude` flags to precisely control which files are included in your torrent.
## Built-in Exclusions
mkbrr automatically excludes these common system files and directories (case-insensitive):
```plaintext theme={null}
.torrent
.ds_store
thumbs.db
desktop.ini
zone.identifier
@eadir (Synology NAS metadata directory)
```
## Filter Flags
Specify patterns for files to **exclude** from the torrent:
```bash Single Pattern theme={null}
mkbrr create . -t ... --exclude "*.nfo"
```
```bash Multiple Flags theme={null}
mkbrr create . -t ... --exclude "*.nfo" --exclude "*sample*"
```
```bash Comma List theme={null}
mkbrr create . -t ... --exclude "*.nfo,*sample*,*.txt"
```
Exclude patterns are useful when you want to keep most files but skip specific types.
Specify patterns for files to **include** in the torrent:
```bash Single Pattern theme={null}
mkbrr create . -t ... --include "*.mkv"
```
```bash Multiple Flags theme={null}
mkbrr create . -t ... --include "*.mkv" --include "*.mp4"
```
```bash Comma List theme={null}
mkbrr create . -t ... --include "*.mkv,*.mp4,*.avi"
```
Using `--include` activates whitelist mode - only matching files will be considered for inclusion.
## Pattern Rules
* Simple patterns (no `/`) match by filename at any depth
* Path-aware glob with `**` matches the full relative path
* Case-insensitive matching
* Uses [glob patterns](https://en.wikipedia.org/wiki/Glob_\(programming\))
* Supports comma-separated lists
* `*.nfo` # All NFO files
* `*sample*` # Any file with 'sample'
* `*.{mkv,mp4}` # MKV and MP4 files
## Processing Order
1. **Built-in Exclusions**
System files (`.torrent`, `.ds_store`, etc.) are always excluded first
2. **Include Check**
If `--include` patterns exist:
* Keep files matching any include pattern
* Skip all other files
3. **Exclude Check**
If no `--include` patterns:
* Skip files matching any exclude pattern
* Keep all other files
4. **Default Behavior**
Keep files not affected by above rules
## Configuration Files
Both filtering options can be defined in configuration files:
```yaml presets.yaml theme={null}
presets:
movies:
include_patterns:
- "*.mkv"
- "*.mp4"
exclude_patterns:
- "*sample*"
- "*.nfo"
```
```yaml batch.yaml theme={null}
jobs:
- output: movie.torrent
path: /path/to/movie/
include_patterns:
- "*.mkv"
exclude_patterns:
- "*sample*"
```
Command-line flags (`--include`, `--exclude`) will add to any patterns defined in your preset or batch configuration.
# Presets
Source: https://mkbrr.com/features/presets
Presets allow you to define and reuse common sets of options for creating or modifying torrents. This is particularly useful if you frequently create torrents for specific trackers with consistent settings.
Learn about the presets.yaml file structure
Available preset configuration options
How to use presets in commands
Command-line flag precedence
## Configuration File (`presets.yaml`)
Presets are defined in a YAML file named `presets.yaml`. `mkbrr` searches for this file in the following locations, using the first one it finds:
1. Path specified by the `--preset-file` flag (if used)
2. The current working directory (`./presets.yaml`)
3. `~/.config/mkbrr/presets.yaml` (or equivalent user config directory)
4. `~/.mkbrr/presets.yaml` (legacy location)
### Structure
The `presets.yaml` file follows this structure:
```yaml presets.yaml theme={null}
# yaml-language-server: $schema=https://raw.githubusercontent.com/autobrr/mkbrr/main/schema/presets.json
version: 1
# Optional: Default settings applied to ALL presets unless overridden
default:
private: true
no_date: true
no_creator: false
skip_prefix: false
# comment: "Default comment"
# source: "DEFAULT_SRC"
# exclude_patterns: ["*.bak", "temp.*"]
# include_patterns: ["*.mkv", "*.mp4"]
presets:
preset-name-1: # Name of the preset (used with -P flag)
trackers:
- "https://tracker-one.com/announce/..."
source: "TRACKER1"
comment: "Uploaded via mkbrr"
private: true
exclude_patterns:
- "*.nfo"
- "*sample*"
preset-name-2:
trackers:
- "udp://tracker-two.org:6969/announce"
private: false # Make these torrents public
piece_length: 18 # Use 256 KiB pieces for this preset
include_patterns:
- "*.mkv"
- "*.mp4"
- "*.avi"
```
```yaml presets.yaml (minimal example) theme={null}
version: 1
presets:
ptp:
trackers:
- "https://tracker.example.com/announce"
private: false
source: "EXAMPLE"
```
Must be `1`
Optional settings applied to *all* presets unless explicitly overridden within a specific preset
A map where each key is the preset name (e.g., `ptp`, `public`) and the value contains the options for that preset
### Available Options
The following options can be used within the `default` section or any specific preset:
List of announce URLs. The first one is used as the primary tracker.
Whether the torrent should be private.
Source tag string.
Torrent comment string.
Piece size exponent (e.g., `18` for 256 KiB). Mutually exclusive with `target_piece_count`.
Target approximate number of pieces (e.g., `600` or `900`). Calculates the optimal piece length automatically. Mutually exclusive with `piece_length`.
Maximum piece size exponent for automatic calculation.
List of glob patterns to exclude files.
List of glob patterns to include files (takes precedence over exclude).
Whether to prevent adding the tracker domain prefix to the output filename.
Output directory for created torrents.
List of web seed URLs.
Manually specify the number of concurrent goroutines used for hashing.
Experimenting with different values might yield better performance than the default automatic setting.
Whether to randomize the torrent's info hash by adding a unique, random key to the info dictionary.
Useful for cross-seeding identical content on trackers that reject duplicate info hashes.
Whether to omit creation date.
Whether to omit creator string.
Exit with error if season pack completeness check detects missing episodes.
You can find the formal JSON schema for validation [here](https://raw.githubusercontent.com/autobrr/mkbrr/main/schema/presets.json).
## Using Presets
Specify the preset name using the `-P` (or `--preset`) flag with the `create` or `modify` commands:
```bash Create theme={null}
mkbrr create /path/to/content -P preset-name-1
```
```bash Modify theme={null}
mkbrr modify *.torrent -P preset-name-2
```
## Overriding Presets
Command-line flags take precedence over preset settings. Most flags completely override their preset counterparts, but filtering options have special behavior:
* **Filtering patterns are additive**: Command-line patterns combine with preset patterns
```yaml Preset Definition theme={null}
presets:
movies:
include_patterns:
- "*.mkv"
- "*.mp4"
exclude_patterns:
- "*sample*"
```
```bash Command with Additional Filters theme={null}
# This combines the preset patterns with command-line patterns
mkbrr create /path/to/content -P movies --include "*.srt" --exclude "*.nfo"
# Effective filters applied:
# include_patterns: ["*.mkv", "*.mp4", "*.srt"]
# exclude_patterns: ["*sample*", "*.nfo"]
```
Standard command-line flags (like `--private` or `--source`) completely override their preset values, while filtering patterns combine additively.
For complete details on filter processing and pattern syntax, see the [Filtering documentation](/features/filtering).
```bash Override source flag theme={null}
mkbrr create /path/to/content -P preset-name-1 -s "CUSTOM_SRC"
```
```bash Override private flag theme={null}
mkbrr modify existing.torrent -P preset-name-2 --private=true
```
# Season packs
Source: https://mkbrr.com/features/season-packs
When creating a torrent from a directory, `mkbrr` includes a feature to help detect potentially incomplete TV season packs.
mkbrr analyzes video files in your directory to detect missing episodes in TV season packs, helping prevent incomplete uploads.
Only analyzes files with these extensions:
* `.mkv`
* `.mp4`
Detects episode numbers from:
* Single: `S01E01`
* Range: `S01E01-E03`
* Multi: `S01E01E02`
mkbrr looks for season numbers in directory and file names using these patterns:
```plaintext theme={null}
Show.S01.Complete
Show.Season.01
Show.S01
Show-S01-1080p
/Season 01/
/S01/
Show.S01.1080p
Season 01/
```
Season detection is case-insensitive and handles various separators (dots, dashes, underscores, spaces).
mkbrr determines if a season pack is suspicious by:
Scan all video files to determine the highest episode number in the pack
Count unique episodes found across all valid video files
Compare episode numbers to identify any missing episodes in the sequence
The detection focuses on standard episode numbering. Special episodes (S01E00) and unconventional naming may affect accuracy.
```plaintext theme={null}
Warning: Possible incomplete season pack detected
Season number: 1
Highest episode number found: 4
Episodes found: 3
Missing: episode 3
This may be an incomplete season pack. Check files before uploading.
```
This feature helps catch common packaging mistakes but isn't foolproof. Always verify your files manually before uploading to trackers.
# Tracker rules
Source: https://mkbrr.com/features/tracker-rules
mkbrr includes built-in knowledge about the specific requirements of various private trackers to help ensure the torrents you create are compliant. When you provide a tracker URL (`-t` flag or via presets/batch), `mkbrr` checks if it matches a known tracker and applies relevant rules automatically.
mkbrr automatically detects tracker requirements based on the announce URL and applies the appropriate rules to ensure your torrents are compliant.
## How it Works
When creating a torrent, `mkbrr` compares the provided tracker URL against an internal list of configurations. If a match is found, it applies the corresponding rules:
Enforces maximum piece size limits specific to each tracker (e.g., 16 MiB, 8 MiB).
Selects optimal piece sizes based on content size using tracker-specific guidelines.
Ensures the .torrent file stays within tracker size limits by adjusting piece length.
Tracker-specific rules override manual settings (`-l` or `-m` flags) to ensure compliance. mkbrr always prioritizes tracker requirements.
## Implemented Trackers
Below is a list of implemented trackers and their specific requirements:
The tracker rules are maintained in the [mkbrr source code](https://github.com/autobrr/mkbrr/blob/main/internal/trackers/trackers.go). Contributions to keep rules updated are welcome via pull requests.
| Tracker | Piece Ranges | Max Piece Size | Max Torrent Size | Default Source |
| ------------ | ------------ | -------------- | ---------------- | ---------------- |
| ANT | Default | - | 250 KiB | ANT |
| NBL | Default | - | 1 MiB | NBL |
| HDB | Default | 16 MiB | - | - |
| SBS | Default | 16 MiB | - | - |
| SP | Default | 16 MiB | - | - |
| BHD | Default | 16 MiB | - | BHD |
| PTP | Custom | 16 MiB | - | PTP |
| MTV | Default | 8 MiB | - | MTV |
| EMP | Default | 8 MiB | - | Emp |
| GGN | Custom | 64 MiB | 1 MiB | GGn |
| AlphaRatio | Custom | 64 MiB | 2 MiB | AlphaRatio |
| seedpool.org | Custom | 128 MiB | - | seedpool.org |
| NB | Custom | 16 MiB | - | - |
| BTN | Custom | 16 MiB | - | - |
| TSYNDIKAT | Custom | 16 MiB | - | - |
| OE | Custom | 16 MiB | - | - |
| lst.gg | Custom | 16 MiB | - | lst.gg |
| Aither | Custom | 128 MiB | - | Aither |
| ULCX | Default | - | - | ULCX |
| CapybaraBR | Default | - | - | CapybaraBR |
| HUNO | Default | - | - | HUNO |
| TorrentLeech | Custom | 128 MiB | - | TorrentLeech.org |
# GUI Application
Source: https://mkbrr.com/gui/overview
mkbrr's graphical user interface for desktop users
mkbrr includes a graphical user interface built with [Wails](https://wails.io/) for users who prefer a visual experience over the command line.
## Features
The GUI provides the same core functionality as the CLI with additional usability enhancements:
Create torrent files with tracker support, presets, and real-time progress tracking with hash rate display.
View torrent metadata with a searchable, collapsible file tree.
Verify torrent data integrity with detailed results showing good, bad, and missing pieces.
Edit torrent metadata without needing the original source files.
### Settings
The Settings page allows you to:
* Configure default worker count for hashing operations
* Manage presets (create, edit, delete)
* View and reload the preset file location
## Additional Features
Choose between light, dark, or system appearance modes, plus five color themes: Default, Autobrr (the default), Nightwalker, Swizzin, and Amethyst Haze.
Drag a file or folder onto any page to fill its path automatically — drop content to set the source on Create, a `.torrent` or content on Check, or a `.torrent` to Inspect or Modify.
When creating torrents, the GUI automatically detects tracker-specific requirements and suggests optimal piece sizes based on your content size and tracker rules.
Form state is automatically saved across sessions. If you close the app while filling out a form, your inputs will be restored when you return.
Full preset management with validation. Create, edit, and delete presets directly from the GUI without manually editing YAML files.
The Inspect page features an advanced file tree viewer with:
* Search functionality with auto-expand
* Collapsible folder structure
* File count per folder
* Smart expansion for smaller torrents
## Installation
Download the GUI binary for your platform from the [GitHub Releases page](https://github.com/autobrr/mkbrr/releases).
Download `mkbrr-gui_*_darwin_*.zip` and extract the `.app` bundle.
The app is not notarized, so macOS will block it by default. Use one of these methods:
**Option 1: Remove quarantine attribute (recommended)**
```bash theme={null}
xattr -cr /path/to/mkbrr-gui.app
```
**Option 2: Right-click to open**
1. Right-click (or Control-click) on the app
2. Select "Open" from the context menu
3. Click "Open" in the dialog
**Option 3: System Settings**
1. Try to open the app (it will be blocked)
2. Open System Settings > Privacy & Security
3. Click "Open Anyway" next to the mkbrr-gui message
Download `mkbrr-gui_*_windows_amd64.zip` and extract `mkbrr-gui.exe`.
Run the executable directly - no installation required.
Download `mkbrr-gui_*_linux_amd64.tar.gz` and extract the binary.
```bash theme={null}
tar -xzf mkbrr-gui_*_linux_amd64.tar.gz
chmod +x mkbrr-gui
./mkbrr-gui
```
### Building from Source
If you prefer to build the GUI yourself:
```bash theme={null}
# Clone the repository
git clone https://github.com/autobrr/mkbrr.git
cd mkbrr
# Install Wails CLI (one-time requirement)
make install-wails
# Build GUI for your current platform
make gui-build
# Or build for all platforms
make gui-build-all
```
The built application will be in `gui/build/bin/`.
## GUI vs CLI
Both interfaces provide the same core torrent operations. Choose based on your workflow:
| Feature | CLI | GUI |
| -------------------- | ----------- | ------------------------ |
| Create torrents | Yes | Yes |
| Inspect metadata | Yes | Yes |
| Check integrity | Yes | Yes |
| Modify metadata | Yes | Yes |
| Batch operations | Yes | No |
| Preset support | Yes | Yes |
| Preset management | Manual YAML | Visual editor |
| Progress display | Text | Visual with progress bar |
| File tree view | Text | Interactive & searchable |
| Scripting/automation | Yes | No |
| Theme customization | No | Yes |
| Drag and drop | No | Yes |
# Checking data integrity
Source: https://mkbrr.com/guides/checking-data
Learn how to verify local files against .torrent files using the mkbrr check command
The `mkbrr check` command verifies if the local files or directory match the data defined in a `.torrent` file. This is useful for confirming the integrity of downloaded content or checking files after moving them.
```bash theme={null}
mkbrr check [flags]
```
Required command arguments
Available verification options
Understanding verification results
Common usage examples
## Arguments
The path to the `.torrent` file containing the expected piece hashes.
The path to the local file or directory containing the data to be checked.
The command exits with an error code if verification fails (bad pieces > 0 or missing files > 0).
## Flags
Be verbose.
When enabled, shows detailed information about the verification process including any bad piece indices.
Enable quiet mode, printing only the completion percentage. Useful for scripts.
Useful for automated scripts or when you only need the verification status.
Manually specify the number of concurrent goroutines used for hashing.
Experimenting with different worker values *might* yield better performance than the default automatic setting.
## Output
By default, the command provides a summary including:
* **Completion:** Percentage of pieces successfully verified against the local data.
* **Good pieces:** Number of pieces that match the hash in the torrent file.
* **Bad pieces:** Number of pieces where the local data hash does not match the torrent file.
* **Missing files:** Lists any files specified in the torrent that are missing locally. Files that exist but have an incorrect size will be listed with ` (size mismatch)` appended to their name.
* **Check time:** Duration of the verification process.
## Examples
Check a downloaded directory:
```bash theme={null}
mkbrr check MyShow.S01.torrent /path/to/downloads/MyShow.S01/
```
Check a single file:
```bash theme={null}
mkbrr check MyMovie.mkv.torrent /path/to/downloads/MyMovie.mkv
```
Check with verbose output to see bad piece indices:
```bash theme={null}
mkbrr check data.zip.torrent /data/files/data.zip -v
```
Check in quiet mode for scripting:
```bash theme={null}
mkbrr check archive.rar.torrent /backups/archive.rar --quiet
# Output example: 99.50%
```
# Creating torrents
Source: https://mkbrr.com/guides/creating-torrents
Learn how to create .torrent files from local files or directories using the mkbrr create command
The `mkbrr create` command is used to generate new `.torrent` files from local files or directories.
```bash theme={null}
mkbrr create [path] [flags]
```
This command supports creating torrents for single files or entire directories. It also integrates with [Presets](/features/presets) and [Batch Mode](/features/batch-mode) for more advanced workflows.
Required and optional command arguments
Available command flags and options
Automatic optimizations and settings
Common usage examples
## Smart Defaults
mkbrr automatically optimizes several settings for you:
Automatically calculated based on content size for optimal performance and tracker compatibility
Generated from tracker domain and content name if not specified (e.g., `tracker-domain_content-name.torrent`)
Enabled by default for private tracker compatibility. Use `--private=false` for public trackers
Automatically enforces piece size limits and other requirements based on tracker URL. See [Tracker Rules](/features/tracker-rules) for details.
When you provide a tracker URL via the `-t` flag or presets, mkbrr automatically detects and applies the appropriate tracker-specific rules to ensure your torrents are compliant.
## Arguments
* `[path]`: (Required unless using `-b`) The path to the source file or directory you want to create a torrent from.
## Flags
### Input & Output
Tracker URL. Can be specified multiple times to add several trackers. Optional.
Set torrent name (default: source filename).
Optional. Set output path (default: `.torrent` or `_.torrent`).
Output directory for created torrent.
Don't add tracker domain prefix to output filename.
### Advanced Input (Batch & Presets)
Batch config file (YAML). Cannot be used with a path argument.
For creating multiple torrents in one go. See the [Batch Mode](/features/batch-mode) documentation for details.
Use preset from config.
For reusing common settings across torrents. See the [Presets](/features/presets) documentation for details.
Preset config file (default `~/.config/mkbrr/presets.yaml`).
Set custom path to presets.yaml. See the [Presets](/features/presets) documentation for details.
### Content Selection
Exclude files matching these patterns (e.g., `"*.nfo,*.jpg"` or `--exclude "*.nfo" --exclude "*.jpg"`).
Use this to filter out unwanted files like NFOs, samples, or extras that shouldn't be in the torrent. See the [filtering guide](/features/filtering) for detailed pattern rules and examples.
Include only files matching these patterns (e.g., `"*.mkv,*.mp4"` or `--include "*.mkv" --include "*.mp4"`).
Using include patterns activates whitelist mode. See the [filtering guide](/features/filtering) for detailed pattern rules and examples.
### Torrent Internals
Make torrent private.
Private flag is enabled by default for tracker compliance. Only disable if you're creating a public torrent.
Set piece length to 2^n bytes (16-27, automatic if not specified).
Let mkbrr automatically calculate the piece size unless you have specific requirements. The automatic calculation optimizes for both performance and compatibility.
Limit maximum automatically calculated piece length to 2^n bytes (14-27).
Target approximate number of pieces. Calculates optimal piece length automatically.
Mutually exclusive with `--piece-length`.
Randomize the torrent's info hash by adding or updating a unique, random `entropy` key in the info dictionary before hashing.
Cross-seeding is the practice of seeding the same content on multiple trackers. Using the entropy flag helps avoid conflicts between trackers.
### Seeding & Metadata
Specify web seed URLs. Can be used multiple times.
Web seeds provide an HTTP fallback source for the torrent content, improving availability.
Specify the source string.
Some trackers require or recommend specific source tags. Check your tracker's rules.
Specify a comment.
Omit the creation date from the torrent metadata.
Omit the creator string from the torrent metadata.
### Season Pack Detection
Exit with error if season pack completeness check detects missing episodes.
### Execution & Output Control
Manually specify the number of concurrent goroutines used for hashing.
Experimenting with different worker values *might* yield better performance than the default automatic setting.
Be verbose.
Enable quiet mode, printing only the final torrent file path upon success. Useful for scripts.
Display only torrent info without progress (implies verbose).
## Handling Symbolic Links
When `mkbrr create` encounters symbolic links (symlinks) within the source path:
* **Links are followed:** `mkbrr` reads the content of the file or directory the link points to (the target).
* **Target content is hashed:** The torrent pieces will contain the hash data of the *target* file's content.
* **Link path is stored:** The file path recorded inside the `.torrent` file's metadata will be the path of the *symbolic link itself*, relative to the source path, not the path of the target.
This means the created torrent represents the file structure as it appears with the links, but the data integrity check (`mkbrr check`) will verify against the actual content pointed to by those links at the time of creation.
Important: When checking a torrent created with symlinks using `mkbrr check`, the check verifies against the *original target content* that was hashed during creation, not necessarily what the link points to currently if the target file has changed or been moved.
## Examples
Create a private torrent for a single file:
```bash theme={null}
mkbrr create /path/to/movie.mkv -t https://private-tracker.com/announce -s "MyTracker"
```
Create a public torrent for a directory:
```bash theme={null}
mkbrr create /path/to/album-folder -t udp://public-tracker.org:6969/announce --private=false -c "Awesome Album"
```
Create using a preset:
```bash theme={null}
mkbrr create /path/to/content -P mypreset
```
Create with specific piece size and web seeds:
```bash theme={null}
mkbrr create /path/to/large-file.iso -t https://tracker.net/a -l 24 -w http://seed.example.com/large-file.iso
```
Create with entropy for cross-seeding:
```bash theme={null}
mkbrr create /path/to/content -t https://another-tracker.com/announce -e
```
Create excluding certain files:
```bash theme={null}
mkbrr create /path/to/project/ -t https://tracker.net/a --exclude ".*,*.tmp,node_modules"
```
Create including only video files:
```bash theme={null}
mkbrr create /path/to/mixed-folder/ -t https://tracker.net/a --include "*.mkv,*.mp4,*.avi"
```
# Inspecting torrents
Source: https://mkbrr.com/guides/inspecting-torrents
Learn how to view and analyze .torrent file metadata using the mkbrr inspect command
The `mkbrr inspect` command allows you to view the metadata and file structure contained within a `.torrent` file without needing the actual content files.
```bash theme={null}
mkbrr inspect [flags]
```
Required command arguments
Available command options
Understanding the inspection results
Usage examples
## Arguments
The path to the `.torrent` file you want to inspect.
## Flags
Show all metadata fields found in the torrent file, including non-standard ones in both the root and info dictionaries.
Use verbose mode when you need to inspect custom or non-standard metadata fields that might be present in the torrent.
## Output
The command displays the following information by default:
* **Name:** The root name of the torrent content
* **Hash:** The info hash of the torrent
* **Size:** Total size of the content
* **Piece length:** Size of each piece
* **Pieces:** Total number of pieces
* **Trackers:** Announce URLs
* **Web seeds:** Any web seed URLs included
* **Private:** Whether the private flag is set
* **Source:** The source tag, if present
* **Comment:** The comment, if present
* **Created by:** The tool used to create the torrent
* **Created on:** The creation date, if specified
* **Files:** Number of files (for multi-file torrents)
For multi-file torrents, a file tree is displayed showing the path and size of each file within the torrent structure.
## Examples
Inspect a torrent file with default output:
```bash theme={null}
mkbrr inspect my-release.torrent
```
Show all metadata fields including non-standard ones:
```bash theme={null}
mkbrr inspect another.torrent -v
```
```bash theme={null}
mkbrr inspect [flags]
```
## Arguments
* ``: (Required) The path to the `.torrent` file you want to inspect.
## Flags
Show all metadata fields found in the torrent file, including non-standard ones in both the root and info dictionaries.
## Output
The command displays the following information by default:
* **Name:** The root name of the torrent content.
* **Hash:** The info hash of the torrent.
* **Size:** Total size of the content.
* **Piece length:** Size of each piece.
* **Pieces:** Total number of pieces.
* **Trackers:** Announce URLs.
* **Web seeds:** Any web seed URLs included.
* **Private:** Whether the private flag is set.
* **Source:** The source tag, if present.
* **Comment:** The comment, if present.
* **Created by:** The tool used to create the torrent, if specified.
* **Created on:** The creation date, if specified.
* **Files:** Number of files (for multi-file torrents).
If the torrent contains multiple files, a file tree is also displayed, showing the path and size of each file within the torrent structure.
## Examples
**Inspect a torrent file:**
```bash theme={null}
mkbrr inspect my-release.torrent
```
**Inspect a torrent file with verbose output to see all metadata:**
```bash theme={null}
mkbrr inspect another.torrent -v
```
# Modifying torrents
Source: https://mkbrr.com/guides/modifying-torrents
Learn how to update metadata in existing .torrent files using the mkbrr modify command
The `mkbrr modify` command allows you to update metadata in existing `.torrent` files without needing access to the original content files. This is useful for mass-updating trackers, source tags, comments, or other metadata.
```bash theme={null}
mkbrr modify [torrent files...] [flags]
```
Required command arguments
Available modification options
Common usage examples
By default, the original torrent files are preserved. New, modified files are created with a prefix based on the tracker domain (e.g., `tracker-domain_original-name.torrent`). You can customize the output filename or directory.
The `modify` command preserves existing metadata, including custom info-dict keys. Only the fields you explicitly change (name, tracker, source, comment, private flag, entropy) are updated.
## Arguments
One or more paths to the `.torrent` files you want to modify. Glob patterns (like `*.torrent`) can be used if your shell supports them.
## Flags
### Input & Output
Tracker URLs (can be specified multiple times).
Set the torrent's internal name.
Output directory for modified files.
Custom output filename (without extension).
When modifying multiple torrents, using `--output` with a fixed filename will cause subsequent files to overwrite the previous ones. Use `--output-dir` instead for batch modifications to preserve all modified files with unique names.
### Advanced Input (Presets)
Use preset from config.
For reusing common settings across torrents. See the [Presets](/features/presets) documentation for details.
Preset config file (default `~/.config/mkbrr/presets.yaml`).
Set custom path to presets.yaml. See the [Presets](/features/presets) documentation for details.
### Torrent Internals
Make torrent private.
Private flag is enabled by default for tracker compliance. Only disable if you're creating a public torrent.
Remove the private flag entirely.
Randomize the torrent's info hash by adding or updating a unique, random `entropy` key in the info dictionary before hashing.
Cross-seeding is the practice of seeding the same content on multiple trackers. Using the entropy flag helps avoid conflicts between trackers.
### Seeding & Metadata
Specify web seed URLs. Can be used multiple times.
Web seeds provide an HTTP fallback source for the torrent content, improving availability.
Specify the source string.
Some trackers require or recommend specific source tags. Check your tracker's rules.
Specify a comment.
Omit the creation date from the torrent metadata.
If omitted, the creation date is updated to the current time during modification.
Omit the creator string from the torrent metadata.
### Execution & Output Control
Be verbose.
Enable quiet mode, printing only the final torrent file path upon success. Useful for scripts.
Don't add tracker domain prefix to output filename.
Show what would be modified without making changes.
## Examples
Update the tracker for a single torrent:
```bash theme={null}
mkbrr modify original.torrent --tracker https://new-tracker.com/announce
```
Outputs: `new-tracker_original.torrent`
Make multiple torrents public:
```bash theme={null}
mkbrr modify *.torrent --private=false
```
Outputs: `modified_file1.torrent`, `modified_file2.torrent`, etc.
Add a source tag and save to a specific directory:
```bash theme={null}
mkbrr modify /downloads/*.torrent --source "MySource" --output-dir /modified-torrents/
```
Apply a preset and then add entropy:
```bash theme={null}
mkbrr modify old-preset.torrent -P newpreset -e
```
Preview changes without saving:
```bash theme={null}
mkbrr modify my.torrent --tracker https://new.co/a --comment "Updated" --dry-run
```
```bash theme={null}
mkbrr modify [torrent files...] [flags]
```
By default, the original torrent files are preserved. New, modified files are created with a prefix based on the tracker domain (e.g., `tracker-domain_original-name.torrent`). You can customize the output filename or directory.
The `modify` command preserves existing metadata, including custom info-dict keys. Only the fields you explicitly change are updated.
# Installation
Source: https://mkbrr.com/installation
How to install mkbrr using various methods.
Select the installation method that best suits your system and preferences:
Download and install pre-compiled CLI binaries
Desktop application for visual torrent management
Install using your preferred package manager
Install using Docker
Download the appropriate binary for your system from the [GitHub Releases page](https://github.com/autobrr/mkbrr/releases/latest) or use the commands below.
Make sure the extraction directory (e.g., `/usr/local/bin`) is included in your system's `PATH` environment variable so you can run `mkbrr` from any location.
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_linux_x86_64.tar.gz mkbrr
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_arm64.tar.gz | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_linux_arm64.tar.gz mkbrr
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_arm.tar.gz | grep -v arm64 | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_linux_arm.tar.gz mkbrr
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_amd64.deb | cut -d\" -f4)
sudo dpkg -i mkbrr_*_linux_amd64.deb
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_arm64.deb | cut -d\" -f4)
sudo dpkg -i mkbrr_*_linux_arm64.deb
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_armv6.deb | cut -d\" -f4)
sudo dpkg -i mkbrr_*_linux_armv6.deb
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_amd64.rpm | cut -d\" -f4)
sudo rpm -i mkbrr_*_linux_amd64.rpm
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_arm64.rpm | cut -d\" -f4)
sudo rpm -i mkbrr_*_linux_arm64.rpm
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_armv6.rpm | cut -d\" -f4)
sudo rpm -i mkbrr_*_linux_armv6.rpm
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_amd64.apk | cut -d\" -f4)
sudo apk add --allow-untrusted mkbrr_*_linux_amd64.apk
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_arm64.apk | cut -d\" -f4)
sudo apk add --allow-untrusted mkbrr_*_linux_arm64.apk
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep linux_armv6.apk | cut -d\" -f4)
sudo apk add --allow-untrusted mkbrr_*_linux_armv6.apk
```
Ensure the extraction directory (e.g., `/usr/local/bin`) is included in your system's `PATH` environment variable so you can run `mkbrr` from any location.
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep darwin_arm64.tar.gz | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_darwin_arm64.tar.gz mkbrr
```
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep darwin_x86_64.tar.gz | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_darwin_x86_64.tar.gz mkbrr
```
If you encounter issues with macOS Gatekeeper preventing `mkbrr` from running, execute the following command to remove the quarantine attribute: `xattr -d com.apple.quarantine /usr/local/bin/mkbrr`. You might also need to grant execution permissions: `chmod +x /usr/local/bin/mkbrr`.
Make sure the extraction directory (e.g., `/usr/local/bin`) is included in your system's `PATH` environment variable so you can run `mkbrr` from any location.
```bash theme={null}
wget $(curl -s https://api.github.com/repos/autobrr/mkbrr/releases/latest | grep download | grep freebsd_x86_64.tar.gz | cut -d\" -f4)
sudo tar -C /usr/local/bin -xzf mkbrr_*_freebsd_x86_64.tar.gz mkbrr
```
Download the `mkbrr_*_windows_x86_64.zip` file from the [GitHub Releases page](https://github.com/autobrr/mkbrr/releases/latest).
Alternatively, using PowerShell (requires `curl`):
```powershell theme={null}
# Download (Uses Invoke-RestMethod for reliable JSON parsing)
$releaseInfo = Invoke-RestMethod -Uri "https://api.github.com/repos/autobrr/mkbrr/releases/latest"
$url = $releaseInfo.assets | Where-Object { $_.name -like '*windows_x86_64.zip' } | Select-Object -ExpandProperty browser_download_url
curl -L -o mkbrr_latest_windows_x86_64.zip $url
# Extract
Expand-Archive -Path mkbrr_latest_windows_x86_64.zip -DestinationPath .\\mkbrr_extracted -Force
```
To run `mkbrr` from any terminal after extracting `mkbrr.exe`, you need to make it accessible via your system's `PATH`:
1. Move `mkbrr.exe` to a directory already in your `PATH` (e.g., create `C:\Program Files\mkbrr` and move it there).
2. **Or**, add the directory where you extracted `mkbrr.exe` to your system or user `PATH` environment variable (accessible via System Properties -> Environment Variables).
If you use Homebrew, you can install `mkbrr` with these commands:
```bash theme={null}
brew tap autobrr/mkbrr
brew install mkbrr
```
For Arch Linux users, `mkbrr` is available in the Arch User Repository (AUR):
```bash theme={null}
yay -S mkbrr
```
You can also install it manually:
```bash theme={null}
git clone https://aur.archlinux.org/mkbrr.git
cd mkbrr
makepkg -si
```
The version in the AUR might be outdated. After installing via AUR, it is **highly recommended** to immediately run `mkbrr update` to get the latest official release directly from GitHub.
`mkbrr` is available in the official Alpine `edge/testing` repository:
```bash theme={null}
sudo apk update
sudo apk add mkbrr
```
The version in the Alpine testing repository might be outdated. After installing via `apk add mkbrr`, it is **highly recommended** to immediately run `mkbrr update` to get the latest official release directly from GitHub.
Pull the image:
```bash theme={null}
docker pull ghcr.io/autobrr/mkbrr
```
Tag it for convenience:
```bash theme={null}
docker tag ghcr.io/autobrr/mkbrr mkbrr
```
Run and mount your input/output directories:
```bash theme={null}
docker run -v ~/Downloads:/downloads mkbrr mkbrr create /downloads/your-file --output-dir /downloads
```
Replace `~/Downloads` with the path on your host containing the files you want to process.
For convenience, add an alias to your shell configuration (e.g., `.zshrc` or `.bashrc`):
`alias mkbrr='docker run -v ~/Downloads:/downloads mkbrr mkbrr'`
If you want mkbrr to automatically discover your presets.yaml or other config files, mount your config directory and set the working directory (-w) to it. mkbrr searches the current working directory and the standard config path (\$HOME/.config/mkbrr, which resolves to /config/.config/mkbrr inside the official image, since it sets HOME=/config).
For example, if your config is in /mnt/user/appdata/mkbrr on your host:
```bash theme={null}
alias mkbrr='docker run --rm \
-v /mnt/user/data/complete/Music:/music \
-v /mnt/user/data/torrentfiles/created:/torrentfiles \
-v /mnt/user/appdata/mkbrr:/config \
-w /config \
ghcr.io/autobrr/mkbrr mkbrr'
```
When running Docker in rootless mode, you may encounter permission issues when writing torrent files. To fix this, use the `--user` flag to run the container as your current user:
```bash theme={null}
docker run --user $(id -u):$(id -g) -v ~/Downloads:/downloads ghcr.io/autobrr/mkbrr mkbrr create /downloads/your-file --output-dir /downloads
```
For your alias:
```bash theme={null}
alias mkbrr='docker run --rm --user $(id -u):$(id -g) -v ~/Downloads:/downloads ghcr.io/autobrr/mkbrr mkbrr'
```
If you have Go installed (version 1.23 or later recommended), you can install `mkbrr` using:
```bash theme={null}
go install github.com/autobrr/mkbrr@latest
```
Ensure that your Go binary path (`$(go env GOPATH)/bin`) is included in your system's `PATH` environment variable so the `mkbrr` command can be found. You might need to add this line to your shell profile (e.g., `.bashrc`, `.zshrc`, `.profile`):
```bash theme={null}
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc && source ~/.zshrc
```
mkbrr includes a graphical user interface for those who prefer a visual experience. Download the GUI binary for your platform from the [GitHub Releases page](https://github.com/autobrr/mkbrr/releases/latest).
Download `mkbrr-gui_*_darwin_*.zip` and extract the `.app` bundle.
The app is not notarized, so macOS will block it by default. Use one of these methods:
**Option 1: Remove quarantine attribute (recommended)**
```bash theme={null}
xattr -cr /path/to/mkbrr-gui.app
```
**Option 2: Right-click to open**
1. Right-click (or Control-click) on the app
2. Select "Open" from the context menu
3. Click "Open" in the dialog
**Option 3: System Settings**
1. Try to open the app (it will be blocked)
2. Open System Settings > Privacy & Security
3. Click "Open Anyway" next to the mkbrr-gui message
Download `mkbrr-gui_*_windows_amd64.zip` and extract `mkbrr-gui.exe`.
Run the executable directly - no installation required.
Download `mkbrr-gui_*_linux_amd64.tar.gz` and extract the binary.
```bash theme={null}
tar -xzf mkbrr-gui_*_linux_amd64.tar.gz
chmod +x mkbrr-gui
./mkbrr-gui
```
For detailed GUI features and usage, see the [GUI Application guide](/gui/overview).
After installation, verify that mkbrr is working correctly:
```bash theme={null}
mkbrr version
```
If you see the version number, mkbrr is installed correctly!
If you encounter any issues during installation:
If you installed mkbrr through a package manager (Homebrew, AUR, Alpine) and notice it's not the latest version:
```bash theme={null}
mkbrr update
```
This will update mkbrr to the latest version directly from GitHub.
If macOS prevents mkbrr from running due to security settings:
```bash theme={null}
xattr -d com.apple.quarantine /usr/local/bin/mkbrr
chmod +x /usr/local/bin/mkbrr
```
If you get a "command not found" error after installation, ensure the installation directory is in your PATH:
```bash theme={null}
# For Go installations
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc && source ~/.zshrc
# For binary installations
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.zshrc && source ~/.zshrc
```
Need help? Join our [Discord](https://discord.gg/WehFCZxq5B) community or open an issue on [GitHub](https://github.com/autobrr/mkbrr).
# Introduction
Source: https://mkbrr.com/introduction
mkbrr: Fast, Simple Torrent Creation & Management
## What is mkbrr?
**mkbrr** (pronounced "make-burr") is a simple yet powerful tool designed for creating, inspecting, and modifying `.torrent` files. Available as both a CLI and a desktop GUI, it intelligently handles specific requirements for various private trackers.
## Why use mkbrr?
Optimized hashing performance that consistently beats other tools in benchmarks. See [Performance](/performance/benchmarks).
Use the command line for automation or the [desktop GUI](/gui/overview) for visual torrent management.
Includes support for reusable [presets](/features/presets) and [batch mode](/features/batch-mode) operations.
Distributed as a single, dependency-free binary for easy deployment across platforms.
## Technical Highlights
Standard deviation between runs is only 0.25-3.7%, compared to up to 39% variance with other tools.
21 GiB torrent creation in 7.24 seconds on Leaseweb SSD server, 6.27× faster than mktorrent.
Automated detection of missing episodes in TV season collections. [Learn more](/features/season-packs).
Built-in compliance with requirements for major private trackers. [Learn more](/features/tracker-rules).
## Getting Started
Follow our [installation guide](/installation) to set up the CLI or [GUI application](/gui/overview) on your system.
**CLI:**
```bash theme={null}
# Basic usage
mkbrr create "path/to/data" -o my.torrent
# With a tracker
mkbrr create "path/to/data" -o my.torrent --tracker "http://tracker.url"
```
**GUI:** Open the application and use the Create page to select files and configure your torrent visually.
Check out our [guides](/guides) to learn about advanced features:
* [Creating torrents](/guides/creating-torrents)
* [Using presets](/features/presets)
* [Batch operations](/features/batch-mode)
* [GUI Application](/gui/overview)
mkbrr is actively maintained and regularly updated. Join our [Discord](https://discord.gg/WQ2eUycxyT) community and check the [Changelog](/changelog) for updates.
# Benchmarks
Source: https://mkbrr.com/performance/benchmarks
Performance comparison with other popular torrent creation tools.
All benchmarks were performed using [hyperfine](https://github.com/sharkdp/hyperfine) with 5 runs per tool after a warm-up run.
## Performance Overview
mkbrr consistently outperforms other torrent creation tools across various hardware configurations. The benchmarks show that mkbrr is not only faster but also maintains better consistency, especially on mechanical drives where other tools struggle with variance.
**2.86s** for 15 GiB
**7.24s** for 21 GiB
**41.02s** for 14 GiB
**9.71s** for 30 GiB
## Detailed Results
**Hetzner Dedicated Server**
* AMD Ryzen 9 7950X3D
* 128GB DDR5 RAM @ 3600 MT/s
* 2× KIOXIA KCD8XRUG1T92 in SW RAID-0
15 GiB 1080p season pack
* mkbrr: **2.86s**
* torf: 3.06s
* torrenttools: 3.11s
* mktorrent: 16.83s
**Leaseweb Dedicated Server**
* Intel Xeon E-2274G @ 4.00GHz
* 32GB RAM
* SAMSUNG MZQL21T9HCJR-00A07 1.92TB SSD
21 GiB 1080p season pack:
* mkbrr: **7.24s**
* torf: 8.85s
* torrenttools: 9.07s
* mktorrent: 45.41s
**Hetzner Dedicated Server**
* AMD Ryzen 5 3600 (12) @ 4.71GHz
* 64GB RAM
* 4 × TOSHIBA MG08ACA16TEY in RAID0
14 GiB 1080p season pack:
* mkbrr: **41.02s**
* torrenttools: 47.97s
* torf: 58.19s
* mktorrent: 68.17s
**Macbook Pro M4**
* Apple M4
* 16GB RAM
* 512GB NVME
30 GiB 1080p season pack:
* mkbrr: **9.71s**
* torf: 9.78s
* mktorrent: 10.90s
## Performance Consistency
mkbrr maintains good consistency across all platforms, with variance ranging from 0.25% to 2.4%. It particularly excels on storage-heavy workloads, where other tools can show up to 39% variance.
All tools showed good consistency on high-end hardware:
* mktorrent: **1.62% variance**
* mkbrr: 1.75% variance
* torf: 2.29% variance
* torrenttools: 2.93% variance
Other tools showed significant fluctuations on HDD:
* mkbrr: **2.4% variance**
* torf: 9.9% variance
* torrenttools: 22.0% variance
* mktorrent: 39.1% variance
All tools performed consistently on SSD:
* mkbrr: **0.25% variance**
* mktorrent: 0.36% variance
* torf: 0.87% variance
* torrenttools: 1.02% variance
## Detailed Benchmark Data
### Leaseweb Server (21 GiB 1080p season pack)
```bash theme={null}
hyperfine --warmup 1 --runs 5 \
--setup 'sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"' \
--prepare 'sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" && rm -f /home/user/Show.S01.DL.1080p.WEB.H264-GROUP.torrent' \
'mkbrr create /home/user/torrents/qbittorrent/Show.S01.DL.1080p.WEB.H264-GROUP' \
'mktorrent /home/user/torrents/qbittorrent/Show.S01.DL.1080p.WEB.H264-GROUP' \
'torrenttools create --threads 8 ~/torrents/qbittorrent/Show.S01.DL.1080p.WEB.H264-GROUP' \
'torf --threads 8 /home/user/torrents/qbittorrent/Show.S01.DL.1080p.WEB.H264-GROUP'
```
```plaintext theme={null}
# Benchmark 1: mkbrr create ...
# Time (mean ± σ): 7.244 s ± 0.018 s [User: 31.245 s, System: 7.554 s]
# Range (min … max): 7.225 s … 7.270 s 5 runs
#
# Benchmark 2: mktorrent ...
# Time (mean ± σ): 45.407 s ± 0.163 s [User: 36.495 s, System: 4.983 s]
# Range (min … max): 45.135 s … 45.539 s 5 runs
#
# Benchmark 3: torrenttools create ...
# Time (mean ± σ): 9.074 s ± 0.093 s [User: 29.248 s, System: 5.228 s]
# Range (min … max): 8.908 s … 9.122 s 5 runs
#
# Benchmark 4: torf --threads 8 ...
# Time (mean ± σ): 8.854 s ± 0.077 s [User: 25.829 s, System: 5.136 s]
# Range (min … max): 8.771 s … 8.937 s 5 runs
#
# Summary
# 'mkbrr create ...' ran
# 1.22 ± 0.01 times faster than 'torf --threads 8 ...'
# 1.25 ± 0.01 times faster than 'torrenttools create ...'
# 6.27 ± 0.03 times faster than 'mktorrent ...'
```
### Hetzner Server (14 GiB 1080p season pack)
```bash theme={null}
hyperfine --warmup 1 --runs 5 \
--setup 'sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"' \
--prepare 'sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" && rm -f /home/user/mkbrr/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP.torrent' \
'mkbrr create ~/torrents/qbittorrent/tv/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'mktorrent ~/torrents/qbittorrent/tv/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'torrenttools create --threads 12 ~/torrents/qbittorrent/tv/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'torf --threads 12 ~/torrents/qbittorrent/tv/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP'
```
```plaintext theme={null}
# Benchmark 1: mkbrr create ...
# Time (mean ± σ): 41.022 s ± 0.979 s [User: 13.691 s, System: 6.747 s]
# Range (min … max): 39.938 s … 42.467 s 5 runs
#
# Benchmark 2: mktorrent ...
# Time (mean ± σ): 68.168 s ± 26.654 s [User: 17.934 s, System: 6.543 s]
# Range (min … max): 39.268 s … 97.574 s 5 runs
#
# Benchmark 3: torrenttools create ...
# Time (mean ± σ): 47.968 s ± 10.552 s [User: 7.052 s, System: 6.551 s]
# Range (min … max): 39.460 s … 66.296 s 5 runs
#
# Benchmark 4: torf --threads 12 ...
# Time (mean ± σ): 58.187 s ± 5.787 s [User: 7.185 s, System: 6.511 s]
# Range (min … max): 50.125 s … 65.807 s 5 runs
#
# Summary
# 'mkbrr create ...' ran
# 1.17 ± 0.26 times faster than 'torrenttools create ...'
# 1.42 ± 0.15 times faster than 'torf --threads 12 ...'
# 1.66 ± 0.65 times faster than 'mktorrent ...'
```
### Macbook Pro M4 (30 GiB 1080p season pack)
```bash theme={null}
hyperfine --warmup 1 --runs 5 \
--prepare 'rm -f Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP.torrent' \
'mkbrr create ~/Desktop/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'mktorrent ~/Desktop/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'torf --threads 10 ~/Desktop/Show.S01.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP'
```
```plaintext theme={null}
# Benchmark 1: mkbrr create ...
# Time (mean ± σ): 9.708 s ± 0.355 s [User: 10.823 s, System: 4.297 s]
# Range (min … max): 9.479 s … 10.323 s 5 runs
#
# Benchmark 2: mktorrent ...
# Time (mean ± σ): 10.897 s ± 0.701 s [User: 11.021 s, System: 3.038 s]
# Range (min … max): 9.950 s … 11.620 s 5 runs
#
# Benchmark 3: torf --threads 10 ...
# Time (mean ± σ): 9.779 s ± 0.749 s [User: 10.776 s, System: 5.253 s]
# Range (min … max): 9.383 s … 11.112 s 5 runs
#
# Summary
# 'mkbrr create ...' ran
# 1.01 ± 0.09 times faster than 'torf --threads 10 ...'
# 1.12 ± 0.08 times faster than 'mktorrent ...'
```
### Hetzner Ryzen 9 7950X3D (15 GiB season pack)
```bash theme={null}
hyperfine --warmup 1 --runs 5 \
'mkbrr create The.Show.S02.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP --workers 64' \
'mktorrent -l 24 The.Show.S02.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'torrenttools create --threads 64 The.Show.S02.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP' \
'torf --threads 64 The.Show.S02.1080p.SRC.WEB-DL.DDP5.1.H.264-GRP'
```
```plaintext theme={null}
# Benchmark 1: mkbrr create ...
# Time (mean ± σ): 2.858 s ± 0.050 s [User: 16.465 s, System: 55.272 s]
# Range (min … max): 2.817 s … 2.940 s 5 runs
#
# Benchmark 2: mktorrent ...
# Time (mean ± σ): 16.825 s ± 0.273 s [User: 14.784 s, System: 1.669 s]
# Range (min … max): 16.491 s … 17.112 s 5 runs
#
# Benchmark 3: torrenttools create ...
# Time (mean ± σ): 3.111 s ± 0.091 s [User: 2.532 s, System: 2.796 s]
# Range (min … max): 2.951 s … 3.169 s 5 runs
#
# Benchmark 4: torf ...
# Time (mean ± σ): 3.063 s ± 0.070 s [User: 10.254 s, System: 2.806 s]
# Range (min … max): 2.976 s … 3.172 s 5 runs
#
# Summary
# 'mkbrr create ...' ran
# 1.07 ± 0.03 times faster than 'torf --threads 64 ...'
# 1.09 ± 0.04 times faster than 'torrenttools create ...'
# 5.89 ± 0.14 times faster than 'mktorrent ...'
```