RepoPilotOpen in app →

Querz/mcaselector

A tool to select chunks from Minecraft worlds for deletion or export.

Mixed

Single-maintainer risk — review before adopting

weakest axis
Use as dependencyMixed

top contributor handles 95% of recent commits; no tests detected

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 4w ago
  • 6 active contributors
  • MIT licensed
Show all 6 evidence items →
  • CI configured
  • Single-maintainer risk — top contributor 95% of recent commits
  • No test directory detected
What would change the summary?
  • Use as dependency MixedHealthy if: diversify commit ownership (top <90%)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/querz/mcaselector?axis=fork)](https://repopilot.app/r/querz/mcaselector)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/querz/mcaselector on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Querz/mcaselector

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Querz/mcaselector shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Single-maintainer risk — review before adopting

  • Last commit 4w ago
  • 6 active contributors
  • MIT licensed
  • CI configured
  • ⚠ Single-maintainer risk — top contributor 95% of recent commits
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live Querz/mcaselector repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Querz/mcaselector.

What it runs against: a local clone of Querz/mcaselector — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in Querz/mcaselector | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | Last commit ≤ 61 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>Querz/mcaselector</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Querz/mcaselector. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/Querz/mcaselector.git
#   cd mcaselector
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of Querz/mcaselector and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Querz/mcaselector(\\.git)?\\b" \\
  && ok "origin remote is Querz/mcaselector" \\
  || miss "origin remote is not Querz/mcaselector (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 61 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~31d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Querz/mcaselector"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

MCA Selector is a JavaFX-based GUI tool that lets players surgically select and delete or export chunks from Minecraft Java Edition world saves (.mca region files). It reads NBT-format chunk data, renders a visual grid of regions/chunks overlaid on a map, and applies modifications (biome changes, entity deletion, block replacement, lightmap fixes) via a Groovy-powered scripting engine before writing the modified chunks back to disk. Single-module Gradle project: src/main/java/net/querz/mcaselector/ contains the JavaFX GUI (Main.java entry point), with changer/ subpackage providing a plugin-like field system (Field, ChangeParser) and 15+ field implementations (BiomeField, DeleteEntitiesField, ReplaceBlocksField, etc.). NBT chunk I/O is delegated to the external Querz/NBT library. Groovy script evaluation happens via JSR223 for user-defined chunk transformations.

👥Who it's for

Minecraft Java Edition players who need to reset terrain (post-update chunks, unwanted terrain generation), clean up lag-inducing entities, or surgically export/delete specific regions without regenerating entire worlds. Also appeals to modders and server admins managing large world files.

🌱Maturity & risk

Actively maintained and production-ready. The project supports Minecraft versions through 1.21.5+ (DataVersion 3953-4125+), has a clear release pipeline (v2.7 current), multi-platform installers (Windows .exe, macOS, Linux), and GitHub Actions CI. Last activity visible in the workflow and installer configs suggests ongoing support.

Low risk: single maintainer (Querz) but stable release cadence, solid dependency set (NBT library, Gson, Log4j2, JavaFX all well-maintained). No test suite visible in file list (no src/test directory shown) is a quality gap. Tool directly modifies user world files—any bug causes data loss, so thorough manual testing before release is critical but not automated.

Active areas of work

No PR/milestone data visible in file list, but the presence of gradle.properties, gradle/wrapper, and release.yml suggests active CI/release automation. The supported versions table in README goes to 1.21.5+, indicating recent compatibility maintenance.

🚀Get running

./gradlew build && ./gradlew run

Daily commands: ./gradlew run (launches JavaFX GUI); ./gradlew build produces a fat JAR (via shadow plugin); installer/windows/init builds .exe via inno.iss

🗺️Map of the codebase

🛠️How to make changes

New chunk field transformation? Add a class under src/main/java/net/querz/mcaselector/changer/fields/ extending Field, implement parse() and apply(). New UI feature? Modify src/main/java/net/querz/mcaselector/Main.java or add a controller class. Chunk I/O logic is in the external Querz/NBT dependency, not in this repo.

🪤Traps & gotchas

  1. JavaFX version pinning to Java 21 (java.sourceCompatibility = JavaVersion.VERSION_21)—must build/run on JDK 21+. 2) Shadow plugin fat JAR includes all transitive deps; if testing locally, ensure gradle-wrapper.jar is present. 3) NBT library is a custom GitHub-hosted JAR (com.github.Querz:NBT via JitPack), not Maven Central—network access required during build. 4) Chunk modifications are destructive and write directly to .mca region files; no built-in undo, users must manage backups themselves. 5) No explicit test suite means integration testing relies on manual GUI testing against real world files.

💡Concepts to learn

  • NBT (Named Binary Tag) format — Minecraft's binary serialization format for chunk and world data; understanding NBT structure (tags, compound nesting, endianness) is essential to grasp how this tool reads and modifies .mca region files
  • Region (.mca) file structure — Minecraft splits worlds into 32×32 chunk regions stored as .mca files; MCA Selector must parse region headers (chunk offsets/timestamps) before decompressing individual chunks
  • Chunk format and DataVersion versioning — Chunk NBT structure changes across Minecraft versions (height limits, Y-sections, block states); DataVersion field exists to track and convert between versions, visible in the supported versions table
  • JavaFX scene graph and event handling — The entire GUI is built on JavaFX; understanding scene graphs, event bubbling, and FXML (if used) is needed to add UI features or optimize rendering of large chunk grids
  • Groovy JSR223 scripting and reflection — ScriptField uses Groovy's JSR223 engine to evaluate user scripts at runtime; developers need to understand Groovy syntax, classpath binding, and NBT object introspection to support custom transformations
  • Gradle shadow/fat JAR packaging — The project uses the shadow plugin to bundle all dependencies into a single executable JAR; understanding uber JAR generation is critical for distribution and avoiding classpath issues in the installer
  • Zlib/GZip chunk compression — Region files store chunks compressed with GZip; decompression happens during I/O and recompression after modification; the LZ4 dependency suggests support for alternate compression schemes in newer versions
  • Querz/NBT — The external library providing chunk NBT serialization and deserialization; this repo imports it as a JitPack dependency
  • mcjava/minecraft-launcher — Launcher ecosystem; MCA Selector users often need to manage multiple world saves which relate to launcher version isolation
  • InventivetalentDev/MapDownloader — Related Minecraft world manipulation tool; users of MCA Selector often need to also export/inspect map data
  • NickAcPT/worldedit-cli — CLI-based world editing alternative; overlaps in use-case (bulk chunk manipulation) but with different UX (CLI vs GUI)
  • Querz/minecraft-java-edition-data — Data repository possibly maintained by same author; likely contains Minecraft version metadata and DataVersion mappings used by field implementations

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add unit tests for changer field implementations

The src/main/java/net/querz/mcaselector/changer/fields/ directory contains 16+ field modifier classes (BiomeField, DeleteEntitiesField, ReplaceBlocksField, etc.) with no corresponding test files visible in the repo structure. These are critical for data integrity when modifying Minecraft chunk NBT data. Adding comprehensive unit tests would prevent regressions and ensure each field type correctly parses and applies changes.

  • [ ] Create src/test/java/net/querz/mcaselector/changer/fields/ test directory
  • [ ] Add unit tests for ChangeParser.java to verify parsing logic
  • [ ] Implement field-specific tests: BiomeFieldTest, DeleteEntitiesFieldTest, ReplaceBlocksFieldTest, and others covering edge cases (null inputs, invalid values, boundary conditions)
  • [ ] Add integration test for FieldType enum to ensure all field types are discoverable via classindex annotation processor
  • [ ] Run tests in CI/CD workflow (GitHub Actions)

Add GitHub Actions workflow for automated cross-platform builds and testing

While release.yml exists in .github/workflows/, there's no visible CI workflow for validating pull requests on multiple platforms. Given the multi-platform nature (Windows installer, macOS .icns, Linux .desktop files in installer/), a CI workflow would ensure builds succeed on Ubuntu, macOS, and Windows before merging.

  • [ ] Create .github/workflows/ci.yml with matrix strategy for ubuntu-latest, macos-latest, windows-latest
  • [ ] Configure Java 21 setup and Gradle caching
  • [ ] Add build step: ./gradlew clean build test
  • [ ] Add runtime build step: ./gradlew runtime (leveraging org.beryx.runtime plugin already in build.gradle)
  • [ ] Add artifact upload for built distributions to validate packaging works per platform

Add integration tests for CLI functionality with mock world data

The src/main/java/net/querz/mcaselector/cli/ module (CLIJFX, ParamExecutor, CustomCommandParser) is critical for users who need headless/batch processing. No test directory exists for these classes. Adding integration tests with minimal fixture NBT data would validate CLI argument parsing, chunk selection, and changer operations without requiring real world saves.

  • [ ] Create src/test/java/net/querz/mcaselector/cli/ and src/test/resources/fixtures/ directories
  • [ ] Create minimal test MCA region files (using NBT library already in dependencies) representing a few chunks
  • [ ] Add ParamExecutorTest validating: chunk selection syntax, changer command parsing, export/delete operations
  • [ ] Add CustomCommandParserTest for complex filter expressions
  • [ ] Add end-to-end CLI tests invoking Main.main() with test arguments and verifying output

🌿Good first issues

  • Add unit tests for ChangeParser (src/main/java/net/querz/mcaselector/changer/ChangeParser.java) to validate filter syntax parsing and Field instantiation without launching the GUI—currently there's no src/test directory and this class has high complexity.
  • Document the Groovy ScriptField syntax and available NBT/chunk APIs with code examples in a wiki page or docs/ folder; currently ScriptField.java lacks inline Javadoc explaining how users write custom chunk transformation scripts.
  • Implement missing field types for 1.21+ features (e.g., new block states, tricky heights); check the DataVersion table and cross-reference src/main/java/net/querz/mcaselector/changer/fields/ against Minecraft wiki 1.21 changes to identify gaps.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 0557557 — update mappings for Minecraft 26.2-snapshot-1 (Querz)
  • dd65417 — add .dmg, .deb and .rpm installers to improved release workflow (Querz)
  • f55766a — clean up app directory when installing and uninstalling (Querz)
  • 1c023cd — add jpackage directories to inno installer recursively (Querz)
  • e7d4acb — switch to use zulu with jfx in github action (Querz)
  • 8a779cb — set module path for javafx (Querz)
  • 053bcf1 — switch to jpackage (Querz)
  • 05bf5c6 — Merge pull request #545 from Andypsl8/master (Querz)
  • 2985567 — Merge branch 'master' into master (Querz)
  • 33a29f3 — Merge pull request #544 from mpustovoi/patch-1 (Querz)

🔒Security observations

  • High · Groovy Script Execution - Code Injection Risk — src/main/java/net/querz/mcaselector/changer/fields/ScriptField.java, build.gradle (groovy-jsr223 dependency). The codebase includes 'org.apache.groovy:groovy-jsr223:4.0.26' which enables dynamic script execution. The presence of ScriptField.java suggests user-supplied scripts are being evaluated. This creates a significant code injection vulnerability if user input is not properly sanitized before execution. Fix: Implement strict input validation and sandboxing for script execution. Consider using a restrictive SecurityManager or evaluating if groovy scripting is necessary. If required, use a restricted DSL with limited exposed APIs rather than full script evaluation.
  • High · Unsafe Deserialization - NBT Data Handling — build.gradle (NBT dependency), src/main/java/net/querz/mcaselector/ (NBT processing). The application processes NBT (Named Binary Tag) data from Minecraft world files through 'com.github.Querz:NBT:13516d666a'. NBT files are binary formats that could potentially be crafted maliciously. The use of a GitHub commit hash instead of a stable version makes dependency tracking difficult and may indicate use of an unstable or unvetted version. Fix: Use a stable, versioned release of the NBT library rather than a commit hash. Implement strict validation of NBT data structure and types before processing. Add input size limits and handle parsing exceptions gracefully.
  • Medium · LevelDB Native Library - Potential Exploitation Vector — build.gradle (leveldb dependency). The dependency 'org.iq80.leveldb:leveldb:0.12' includes JNI bindings to native code. This introduces potential risks from native library vulnerabilities and platform-specific exploits. The version 0.12 is relatively old. Fix: Update to the latest stable version of leveldb-jni. Ensure the native libraries are loaded from trusted sources only. Consider running with restricted JVM permissions if using JNI code.
  • Medium · Outdated and Unmaintained Dependency - RichTextFX — build.gradle (richtextfx dependency). The dependency 'org.fxmisc.richtext:richtextfx:0.11.7' appears to be from an older release. JavaFX text rendering components may have known security issues if not kept current. Fix: Update RichTextFX to the latest available version. Monitor for security advisories on JavaFX components and maintain regular dependency updates.
  • Medium · Custom Command Parser - Input Validation Risk — src/main/java/net/querz/mcaselector/cli/CustomCommandParser.java, src/main/java/net/querz/mcaselector/changer/ChangeParser.java. The presence of 'CustomCommandParser.java' and 'ChangeParser.java' in the CLI module suggests custom parsing logic that may process user input. Custom parsers are prone to injection and parsing vulnerabilities if not carefully implemented. Fix: Review parser implementations for proper input validation, whitelist expected inputs, implement length limits, and use well-tested parsing libraries where possible. Add comprehensive input fuzzing tests.
  • Medium · Filter Processing - Potential Expression Injection — src/main/java/net/querz/mcaselector/filter/FilterParser.java, src/main/java/net/querz/mcaselector/filter/filters/. The FilterParser and related filter classes process user-supplied filter expressions. If these filters support expression evaluation or pattern matching, there's a risk of expression injection attacks. Fix: Implement strict grammar-based parsing with whitelist validation. Avoid using regex or expression evaluation engines on untrusted input. Use defensive programming with bounds checking on all filter operations.
  • Low · Logging Configuration - Potential Information Disclosure — build.gradle (log4j-api and log4j-core dependencies), src/main/java/net/querz/mcaselector/. Log4j is configured in the application. If logging levels are set to DEBUG or TRACE in production, sensitive information about file paths, chunk data, or world structure could be exposed. Fix: Ensure production builds use INFO or WARN log levels. Review logging statements to avoid logging sensitive data. Implement log rotation and ensure logs

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · Querz/mcaselector — RepoPilot