pack-doctor
The IDs in your modpack that silently do nothing
A quest that rewards yourpack:cooked_caned_fish. A diet tag
pointing at cooked_canned_rabit_soup. A recipe for an item from a
mod you removed last week.
None of these crash. None of them log an error. They quietly give the player nothing, and you find out when someone complains three weeks later.
$ pack-doctor check "MyServer/mods" --against "MyServer/kubejs"
mods indexed 233
known IDs 14794 (188 defined by the pack itself)
IDS THAT MATCH NOTHING INSTALLED — 3 ID(s)
------------------------------------------------------------
yourpack:cooked_caned_fish
server_scripts/tags/diet.js:45
yourpack:cooked_canned_rabit_soup
server_scripts/tags/diet.js:46
yourpack:stampler
startup_scripts/removals.js:368
It reads every jar in your mods folder, builds an index of every ID that actually exists, then checks every ID your datapacks, KubeJS scripts, quests and configs reference against it. An ID that matches nothing installed is doing nothing, and you can confirm that yourself in a few seconds.
It also knows that KubeJS startup scripts register new content, so the items your own pack creates are not reported as dead.
It also reports
NAMESPACES WITH NO INSTALLED MOD -- grouped with a reference count rather than listed one by one. Some are genuinely missing mods. Others are group names a mod's own script API invents; KubeJS does this constantly. You judge.
Honest limits
- IDs come from translation keys. That covers every item, block and
entity a player can see, but a registry entry with no lang key
cannot be confirmed either way, and lands in UNVERIFIED
(
--verbose) rather than being called dead. - It reads what the files say, not what the game does. It cannot know a recipe is unreachable or a quest unwinnable.
forge:andc:are skipped -- those are tag namespaces, and treating them as registries produced nothing but noise.
Install
pip install pack-doctor
One module, Python 3.8+, no dependencies -- it imports nothing outside the standard library.
More
What the paid edition adds: the suggestion engine -- "did you
mean cooked_canned_fish?" -- and the confidence tiering that
keeps fuzzy-match noise out of the list. On a real 233-mod pack that
was the difference between 169 candidates and 63 worth reading.
Knowing an ID is dead is worth having for free; being handed the ID
you meant, without wading through false positives, is the paid part.
Developed against two real servers: 92 jars / 9,635 IDs and 233 jars / 14,755 IDs. Comparing ID paths rather than whole IDs matters -- a shared namespace inflates every similarity score.
Diagnostic pages for every finding: https://jaakoby.github.io/fix/ Source: https://github.com/jaakoby/pack-doctor Full edition: https://kaiven.gumroad.com/l/pack-doctor
Built by Jakoby Tuckta with Claude. Every claim above is something the tool does on a real log; see the repo's tests.
Metadata
Release files for pack-doctor 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pack_doctor-1.0.0.tar.gz | 10.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pack_doctor-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.3 kB
Release files / pack_doctor-1.0.0.tar.gz
| Download URL | pack_doctor-1.0.0.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
95dec398da9a1b8794fccf4551d3f67fdd7569ba93b1c6f8d38dd5311bb07003
|
|
BLAKE2b-256 checksum How to use checksums |
33e1f82e2bf591a377fa7725e7fdbde4db25f876658714ca3b260a6b94475bf6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / pack_doctor-1.0.0-py3-none-any.whl
| Download URL | pack_doctor-1.0.0-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45e24eb2775e8b1e2f7ff5ad52cd9f01422942cb21e6e073dd280509f9b202cd
|
|
BLAKE2b-256 checksum How to use checksums |
1ed03cf716dbaa41d24ad9f42ed1cb8c15f67a731dfd73068c7111c727fa4b70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|