A WinUI 3 desktop application for running Minecraft Java servers. Tekkit 1.6.4 remains the first-class baseline, while imported profiles can identify a server's executable JAR and create safe launch settings for the current PC.
- Windows 10 version 1809 or later
- Visual Studio 2022 with the .NET desktop development tools, or the .NET 10 SDK
- The Windows App SDK runtime is bundled by this unpackaged x64 build
- A compatible x64 Java runtime for each imported server; the app can optionally download managed Eclipse Temurin runtimes
The starter profile is src/MinecraftServerManager/Profiles/tekkit.json. It currently points to:
- Server:
%USERPROFILE%\OneDrive\Tekkit Server - Java:
%USERPROFILE%\OneDrive\jre-legacy\bin\java.exe - JAR:
TekkitServer.jar
You can choose any server folder from the app's Profiles page. The importer inspects JAR manifests and class signatures to distinguish Vanilla, Forge, NeoForge, Fabric, Quilt, Bukkit-family, and genuine hybrid launchers. Top-level .bat, .cmd, and .sh files are only hints when several JARs are present: their Java path, memory values, and miscellaneous arguments are not copied. Modern Forge's main win_args.txt or unix_args.txt file is retained without importing user_jvm_args.txt.
The launch-settings card lets you review the selected JAR, Java executable, initial/maximum memory, JVM arguments, and server arguments. Use recommended settings calculates a conservative memory allocation from installed RAM and the selected profile's mod/plugin count. Profile-specific settings are stored under %LocalAppData%\Kidda.MinecraftServerManager\UserProfiles, so an app update does not overwrite them.
Older generic profiles are upgraded on first load and re-detected from their server folder, so an existing import picks up JAR-first detection without being deleted and imported again. Stop a server before saving changes to its launch profile.
The Settings page offers separate optional choices for Java 8 (Minecraft 1.16.5 and older), Java 16 (Minecraft 1.17 only), Java 17 (Minecraft 1.18–1.20.4), and Java 21 (Minecraft 1.20.5 and newer). Java 16 is clearly marked as an archived end-of-support runtime; the other choices use the latest Eclipse Temurin release in that maintained line.
Nothing downloads automatically. Selecting Install retrieves the official x64 ZIP metadata from Adoptium, shows download and checksum progress, verifies the archive's published SHA-256 checksum, and extracts it under %LocalAppData%\Kidda.MinecraftServerManager\Runtimes. This location is outside Velopack's replaceable current folder, so app updates do not remove managed Java installations. Settings also lists every usable managed, system, and profile-specific Java runtime the app detects, including its exact version, vendor, architecture, source, and executable path. The one-click Velopack installer cannot display optional component pages, so the same choices are presented safely in Settings and beside an imported profile instead.
Java 7 and older are not downloaded automatically. Very old vanilla server classes are generally accepted by newer JVMs, while a small number of historical Forge/coremod stacks can depend on legacy Java behaviour. Those exceptional profiles can still point to a user-supplied runtime, but unsupported Java releases are kept out of the normal managed-install choices and should not be exposed to untrusted server code or the public internet.
The Modpacks page searches Modrinth, Technic, and Feed The Beast together while keeping each provider's catalogue and import rules behind its own adapter. Results show their source, exact Minecraft versions, mod loaders, server compatibility, recommended Java line, and available server-package verification before an import is allowed. A provider outage is reported on its own without hiding healthy results from the other catalogues.
Choose an install location and the app creates a new, named server folder without overwriting an existing folder. The package and every included server-side file are verified against their published SHA-512 checksums; client-only files are skipped, paths are constrained to the new folder, and server-overrides are applied after normal overrides. The final folder name is committed only after the staged import succeeds.
Vanilla packs use Mojang's version manifest and checksum-verified dedicated-server JAR. Fabric packs use the exact loader declared by the pack and an executable server launcher generated by Fabric's official metadata service. Forge and NeoForge packs use their exact published loader version and verify the official installer against the repository's published SHA-256 sidecar; historical Forge releases that publish only SHA-1 use that same-host fallback rather than failing on a nonexistent .sha256 URL. Quilt packs verify both the requested loader and Quilt's current official installer metadata, verify the installer against its live Maven SHA-256 file, run it in an isolated staging folder, and merge only non-conflicting generated server files. Successful imports become normal reusable profiles with the pack's authoritative Minecraft and loader metadata; the manager does not invent launch commands or create broken profiles.
Technic imports are limited to server archives published by Technic's own server-pack host. The service does not publish archive checksums, so the app states that limitation and applies bounded, traversal-safe extraction instead of claiming checksum verification. Feed The Beast imports use its first-party manifests, verify every listed file against the supplied SHA-512 digest, and install the exact supported server baseline before creating the profile. No provider's server-specific behaviour is placed in the core Java process service.
The Profiles page can duplicate any stopped server into the manager's persistent Instances folder or another chosen location. A clean copy keeps the launcher, mods, plugins, and configuration while leaving out logs, crash reports, backups, caches, worlds, player data, and the previous EULA acceptance. Worlds and player data can be included explicitly. The original folder is never modified, existing destination folders are never overwritten, and the copied profile returns to the same explicit EULA review used by a fresh import.
The Build a pack page creates an in-memory plan for a client pack, a dedicated server, or a linked client-and-server pair. Minecraft version is selected first, followed by guided client-loader and server-platform choices. Vanilla, Fabric, Quilt, Forge, NeoForge, Paper, and an explicitly experimental hybrid option explain what each platform is best for and whether it supports mods, plugins, or both.
A search is sent concurrently to every configured catalogue adapter. Modrinth works without credentials. Official builds can include an app-specific CurseForge API key only after Overwolf approves that distribution model for Minecraft Server Manager and the repository release workflow is configured with the CURSEFORGE_API_KEY Actions secret. This follows the application-key pattern used by Prism Launcher: requests go directly from the desktop app, and an embedded application key must be considered extractable rather than treated as a private user secret. A user may instead enter their own separately approved developer key as a local override; it is validated directly with CurseForge and stored only in Windows Credential Manager for the current Windows account. This is developer API access, not a CurseForge website login or access to a personal CurseForge library.
The app-specific key is never committed to the repository or written to profiles, logs, or manifests; if configured for an approved official build, it is injected from the GitHub Actions secret into that build. Personal overrides are never compiled into the app, installer, or update packages. Each provider reports its own availability, so a missing key or one provider outage does not hide results from another. Searches can be filtered by mod/plugin type and category, while every compatible published version remains selectable rather than assuming the newest file is always correct.
Selecting Add to draft resolves the whole plan once and automatically adds every compatible required dependency with the selected item. If the chosen project version has an impossible dependency chain, the builder checks its other compatible published versions and can offer an explicit one-click alternative; it never silently downgrades. Search results stay in place after selection and are marked In draft, preventing accidental duplicate additions without losing the user's scroll position. Compatible older dependency versions can be selected, cycles are bounded, optional dependencies remain notices, and declared incompatibilities block the addition. Provider environment and loader metadata determine whether each item belongs on the client, server, both, or needs manual placement review. In particular, client-only content is not copied to the server automatically.
After reviewing the draft, Build reviewed output can create a new pack in the manager's persistent Instances folder or another selected folder. Immediately before download, the app rebuilds the dependency graph from fresh provider metadata and stops for a new review if required versions or placement changed. It downloads only through each provider's supported route, follows only bounded HTTPS redirects between approved CurseForge CDN hosts, verifies every file against its published hash and size, and stages the result before atomically committing a new folder. Shared mods are copied to both sides, client-only content stays out of the server, plugins stay server-only, required dependencies follow their resolved placement, and an auditable JSON manifest records the exact provider versions and hashes. Existing output folders are never overwritten.
Vanilla, Fabric, Quilt, Forge, and NeoForge choices now resolve an exact version from the platform's official catalogue. For a supported server target, the builder installs that exact baseline inside the same rollback-safe staging operation, records the recommended Java line, imports the completed Server folder as a normal machine-tuned profile, and opens the existing explicit EULA review. Any staged eula=true is rejected and rolls the output back. Paper and experimental hybrid servers remain clearly labelled content-only until equally safe baselines exist; providers without a supported API or permitted download route are reported instead of being scraped.
For a client output, the app offers an explicit second step to install the official Prism Launcher portable build and add the client as a separate managed instance. The release metadata and Windows portable archive come from Prism Launcher's official GitHub release, the archive is checked against GitHub's published SHA-256 digest, and extraction is bounded against path traversal, links, oversized archives, and partial installs. Prism's accounts, instances, libraries, and settings stay under %LocalAppData%\Kidda.MinecraftServerManager\Launcher\Prism; the normal Minecraft Launcher and %APPDATA%\.minecraft are not read or changed. Microsoft sign-in occurs only inside Prism Launcher. Existing managed instances are never overwritten when another build is added.
The Overview page shows the selected launcher, Java runtime, memory allocation, and Minecraft EULA state before Start is enabled. After a modpack import, the manager offers an intermediary EULA step with a link to the official agreement and keeps confirmation disabled until the user ticks the agreement box. The same action remains available from Overview when setup is deferred. Only that explicit confirmation writes eula=true; cancelling leaves the profile installed without accepting on the user's behalf.
The Players page begins tracking when a player joins a server launched by the manager. Tekkit's profile supplies the join and leave patterns; the generic process service contains no Minecraft-specific log rules. Each profile has an independent history, while All servers adds a player's profile totals together. Existing history is not backfilled.
Completed time and 30-second live checkpoints are stored under %LocalAppData%\Kidda.MinecraftServerManager\PlayerPlaytime. Duplicate join/leave messages are ignored, and any open sessions are closed when that profile's Java process exits.
Player rows and map markers use the player's Minecraft skin face when Mojang's public profile and texture services can resolve it. Downloaded skins are cached for seven days under %LocalAppData%\Kidda.MinecraftServerManager\PlayerSkins; initials remain available when the player is offline-mode, unknown, or the network is unavailable.
The Map page renders a read-only overhead view directly from saved Anvil region files, so it does not install a server plugin, alter a world, or expose a web port. The renderer supports legacy block-ID worlds through Minecraft 1.12.2, including Tekkit's Minecraft 1.6.4 baseline, and modern palette worlds from Minecraft 1.13 onward. Both the older Level.Sections[].Palette layout and the current lower-case sections[].block_states layout are decoded, including the negative section heights introduced in Minecraft 1.18.
The map discovers the configured level-name, Overworld, Nether, End, legacy custom DIM* folders, and namespaced modern dimensions under dimensions. It keeps the Nether view below the roof and reads world spawn from level.dat.
Maps can be panned and zoomed, centred on spawn or a selected player, and refreshed manually or every 5, 15, 30, or 60 seconds. Region headers and parsed chunks are cached incrementally under %LocalAppData%\Kidda.MinecraftServerManager\MapCache, outside every server folder. Online player markers are taken from the manager's per-profile session tracker. Saved positions are read from modern playerdata files or the legacy players directory, with usercache.json used locally to recover modern player names; optional offline markers are also available. Because those coordinates are saved by the server rather than streamed telemetry, every marker states how recently its player file was written.
The Dashboard page discovers editable files from the selected profile's configurationSources. A profile can describe core settings, mod configuration folders, plugin folders, or any combination, so hybrid mod-and-plugin servers do not need special cases in the editor service. The packaged Tekkit profile scans server.properties, supported text files under config, and an optional plugins folder when one is present.
Supported scalar settings can be switched between User Friendly controls and the exact Text Editor. Boolean values use toggles, numeric values use number boxes, known choices use drop-downs or radio buttons, and declared minimum/maximum values are shown beside the control. Tekkit's main server.properties guidance is supplied by the profile; Forge mod limits are also detected from nearby minimum and maximum comments. When a safe limit cannot be established, the app says so rather than inventing one, and complex lists remain available in Text Editor mode.
Configuration files are read-only while that profile's Java process is active. Saving validates JSON and XML where applicable, refuses to overwrite a file that changed after it was opened, writes through a same-folder temporary file, and first stores the previous bytes under %LocalAppData%\Kidda.MinecraftServerManager\ConfigurationBackups\<profile>. Files over 2 MB, binary files, reparse points, and configuration paths outside the server root are not editable.
The Mods & plugins page builds a separate content inventory for every server profile. It detects the profile's actual Minecraft version and loader family, scans only its contained mods and plugins folders, and reads common Fabric, Quilt, Forge, NeoForge, Bukkit, Spigot, Paper, and legacy mcmod.info metadata directly from JAR or ZIP archives. Disabled files remain visible, and a Forge-only Tekkit server is not labelled Hybrid merely because unrelated plugin-like files exist elsewhere.
Compatible additions can be searched through Modrinth without hardcoding provider behaviour into the process service. Searches are constrained to the selected Minecraft version, detected loader, server environment, and Mods or Plugins target. Before installation, the app resolves required dependencies into one reviewable plan and reports optional or incompatible dependencies as warnings.
Installation is available only while the selected server is stopped. Every file must be a bounded HTTPS JAR from Modrinth's CDN with a published SHA-512 hash; downloads are staged inside the server folder, size and checksum verified, and moved into place only when the complete plan succeeds. Existing files are never overwritten automatically, paths and reparse points are checked, and newly moved files are rolled back if a later move fails.
dotnet build MinecraftServerManager.sln -c Debug -p:Platform=x64The dependency-free configuration, pack-builder, content-management, map-parsing, launcher-detection, and Java-compatibility checks can be run with:
dotnet run --project tests\MinecraftServerManager.ConfigurationTests -c ReleaseCurseForge access is available from Build a pack → Sources & accounts when an official build contains a separately approved app-specific key or after CurseForge approves a user's own developer application. Prepare application gives the project owner or personal applicant suggested wording that asks Overwolf to approve the relevant distribution model and the minimal local audit manifest; every answer must be reviewed for accuracy before submission. Without either key, CurseForge is reported as unavailable and Modrinth continues working normally. Removing a personal override returns to app-specific access when it is present.
The app validates the configured paths and Java runtime before enabling Start. Java 8 is recommended through Minecraft 1.16.5, Java 16 for 1.17, Java 17 from 1.18, and Java 21 from 1.20.5; the profile page warns when the selected runtime does not match that baseline. It sends the profile's stop command and waits up to 60 seconds for a safe exit; it does not force-kill Java after a timeout. Emergency stop explicitly terminates the full process tree when Java is stuck.
Build a versioned per-user installer with:
.\scripts\build-release.ps1 -Version 0.1.0Install the newest locally built release with:
.\scripts\install-local.ps1The one-click installer places the app under %LocalAppData%\Kidda.MinecraftServerManager and creates Desktop and Start Menu shortcuts. It also installs a stable launcher and Update.exe, so shortcuts continue to work after an update.
The installed app checks GitHub Releases on launch and then at the interval selected in Settings (from 5 minutes to daily). When a newer version exists, it downloads the update in the background and enables Restart to update. The update experience is controlled from the app; Update.exe is only the installed helper that replaces files after the app closes, and you do not need to run it manually. If Tekkit is running, the app sends the safe stop command first and will not apply the update unless the server exits.
Theme, accent colour, update interval, and last selected profile are stored under %LocalAppData%\Kidda.MinecraftServerManager for the current Windows account.
The update source is the public repository at https://github.com/Kiddabob/MinecraftServerManager. Raw source commits are not installed directly; the release workflow turns each push to main into a versioned Velopack release first.
Once this folder is pushed to GitHub, every push to main automatically publishes a new 0.1.<run number> GitHub Release. You can also run the Build and publish installer workflow manually and optionally supply a semantic version such as 0.2.0. These release assets are what the installed app detects and downloads.