6 Commits
10 changed files with 411 additions and 48 deletions
+182
View File
@@ -0,0 +1,182 @@
# Minecraft Modpacks
Packwiz-managed Minecraft modpacks used by the AGS Minecraft infrastructure.
The repository is the source of truth for both client and server modpack configuration. Packs are deployed through Gitea Actions and served as static Packwiz repositories for Pterodactyl.
## Packs
### Forever World
Long-lived NeoForge survival world with a deliberately conservative mod selection.
- Minecraft: 1.21.1
- NeoForge: 21.1.248
- Packwiz: managed
- Production: release-based
Development:
```text
https://mc.ahmza.com/forever/dev/pack.toml
```
Stable:
```text
https://mc.ahmza.com/forever/stable/pack.toml
```
### Playground
Disposable environment for testing mods, updates and configuration changes before considering them for Forever World.
Development:
```text
https://mc.ahmza.com/playground/dev/pack.toml
```
## Repository Structure
```text
mc-modpacks/
├── .gitea/
│ └── workflows/
├── forever/
│ ├── pack.toml
│ ├── index.toml
│ ├── mods/
│ ├── config/
│ ├── defaultconfigs/
│ └── README.md
├── playground/
│ ├── pack.toml
│ ├── index.toml
│ ├── mods/
│ ├── config/
│ ├── defaultconfigs/
│ └── README.md
└── deploy/
└── kubernetes/
```
## Development Model
`main` represents the current development state.
Normal changes are committed directly to `main`:
```bash
git switch main
cd forever
packwiz update <mod>
packwiz refresh
git add .
git commit -m "Update <mod>"
git push
```
A push to `main` publishes the pack to its `dev` endpoint.
Production is **not** updated by normal commits.
### Branches
Branches are reserved for substantial or experimental work, for example:
```text
mc-26-migration
create-major-upgrade
worldgen-experiment
test-new-content-mod
```
Small mod updates and configuration changes do not require branches.
## Releases
Test the development pack before creating a release.
Forever World releases use annotated tags:
```bash
git tag -a forever-v1.0.1 -m "Forever World v1.0.1"
git push origin forever-v1.0.1
```
A release publishes an immutable copy to:
```text
/forever/releases/v1.0.1/
```
and promotes the same build to:
```text
/forever/stable/
```
Production Pterodactyl servers always consume the stable endpoint rather than individual release URLs.
### Versioning
Approximately follow semantic versioning:
| Version | Use |
|---|---|
| `v1.0.1` | Bug fixes, configs and routine mod updates |
| `v1.1.0` | New functionality or compatible mods |
| `v2.0.0` | Major Minecraft/modpack/world dependency changes |
Release tags are immutable. Never move or recreate an existing release tag.
## Deployment Flow
```text
Gitea
│
push to main
│
▼
Gitea Actions
│
▼
/forever/dev/pack.toml
│
▼
Staging Server
│
Test
│
forever-v1.x.x tag
│
▼
Gitea Actions
┌────┴────┐
▼ ▼
releases/ stable/
│
▼
Production Server
```
Packwiz is responsible for modpack contents and side filtering.
Pterodactyl is responsible for Java, server process management and resources.
Kubernetes/SWS provides static hosting for the published Packwiz repositories.
## Rollback
Release directories are immutable.
If a release causes problems, production can be pointed temporarily at an earlier release:
```text
https://mc.ahmza.com/forever/releases/v1.0.1/pack.toml
```
Do not rewrite an existing release or tag. Fix the issue on `main` and publish a new release.
+4
View File
@@ -0,0 +1,4 @@
on:
push:
branches:
- main
+4
View File
@@ -0,0 +1,4 @@
on:
push:
tags:
- "forever-v*"
+14
View File
@@ -0,0 +1,14 @@
# Pack exports
*.mrpack
*.zip
# Local/editor junk
.DS_Store
.idea/
.vscode/
*.swp
*~
# Temporary build output
.build/
dist/
+1 -1
View File
@@ -7,7 +7,7 @@
"exported_at": "2026-08-22T18:28:00+01:00", "exported_at": "2026-08-22T18:28:00+01:00",
"name": "NeoForge + Packwiz", "name": "NeoForge + Packwiz",
"author": "hamza@ahmza.com", "author": "hamza@ahmza.com",
"description": "Reusable NeoForge Minecraft server egg with Packwiz server-side synchronization. Handles Pterodactyl memory=0 as unlimited by omitting -Xmx.", "description": "Reusable NeoForge Minecraft server egg with Packwiz server-side synchronization.",
"features": [ "features": [
"eula", "eula",
"java_version", "java_version",
-10
View File
@@ -1,10 +0,0 @@
# Generated exports
*.mrpack
*.zip
# Temporary/local files
.DS_Store
*.tmp
# packwiz cache if created locally
.packwiz/
+118
View File
@@ -0,0 +1,118 @@
# Forever World
The Forever World pack is the long-lived Minecraft survival modpack.
The goal is to expand Minecraft without turning the world into a disposable modpack save. Mods are selected with long-term compatibility, maintainability and world-save safety in mind.
## Platform
```text
Minecraft: 1.21.1
NeoForge: 21.1.248
Packwiz: managed
```
## Philosophy
The pack is intentionally conservative.
Content mods should provide meaningful additions while avoiding unnecessary permanent dependencies on abandoned or experimental mods.
The core gameplay additions currently centre around:
- Create
- Create: Bells & Whistles
- Create: Connected
- Create: Copycats+
- Farmer's Delight
- Handcrafted
Additional mods provide mapping, building, performance, diagnostics and quality-of-life improvements.
Axiom is provided through Sinytra Connector and Forgified Fabric API.
## Client and Server Mods
Packwiz `side` metadata determines deployment.
```toml
side = "client"
side = "server"
side = "both"
```
Pterodactyl installs the server pack using:
```bash
packwiz-installer-bootstrap.jar -g -s server <pack.toml>
```
This automatically excludes client-only mods such as Iris and Sodium.
Some optional client-oriented mods are intentionally installed server-side where their server functionality is useful and does not create an undesirable world dependency.
## Development
Current development builds are published at:
```text
https://mc.ahmza.com/forever/dev/pack.toml
```
Production uses:
```text
https://mc.ahmza.com/forever/stable/pack.toml
```
Changes pushed to `main` are tested against the development/staging server before release.
## Releases
Forever World releases use repository tags:
```text
forever-v1.0.0
forever-v1.0.1
forever-v1.1.0
```
A tagged release is published to both:
```text
/forever/releases/v1.x.x/
/forever/stable/
```
Release tags and release directories are immutable.
Major mod additions, Minecraft migrations and other potentially disruptive changes should be tested on Playground or a feature branch before being introduced here.
## Updating a Mod
```bash
cd forever
packwiz update <mod>
packwiz refresh
git add .
git commit -m "Update <mod>"
git push
```
Test the resulting development deployment before creating a release tag.
## World Safety
Before introducing or removing a content mod, consider:
- Does it add blocks or entities that become part of the world save?
- Does it modify world generation?
- What happens if development stops?
- Can the mod be removed without damaging the world?
- Is it likely to survive future Minecraft migrations?
The objective is not zero world dependencies; Create and other content mods deliberately become part of the world.
The objective is to keep those dependencies intentional.
-35
View File
@@ -2,175 +2,140 @@ hash-format = "sha256"
[[files]] [[files]]
file = "mods/appleskin.pw.toml" file = "mods/appleskin.pw.toml"
hash = "716d930feff599bf9ce732e05979fbae8025dc8a3c13ccf4f1cb207a70883bc6"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/axiom.pw.toml" file = "mods/axiom.pw.toml"
hash = "d96e1e5aa63a1a6023578fc3d8f4de1239da8bd105769c43ed2798082ff0acf3"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/bellsandwhistles.pw.toml" file = "mods/bellsandwhistles.pw.toml"
hash = "e1f4a53e3e52b534add5dd018597fefd345d9bd6350b9c46ef0ec281fc62af8e"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/bluemap.pw.toml" file = "mods/bluemap.pw.toml"
hash = "f33a4720ef4f315b6d1f778039e9f7bdb8f5ef1b58a57d565c30fd1d8adee207"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/chunky.pw.toml" file = "mods/chunky.pw.toml"
hash = "68cc51e721e993a8b7a2cbaf45369933b22b07a9c82327ab14757ee10684aa81"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/clumps.pw.toml" file = "mods/clumps.pw.toml"
hash = "c7f15ebcab95f04c71940715f09ced4caad2775a91ef34389431f91bc1c7be71"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/connector.pw.toml" file = "mods/connector.pw.toml"
hash = "a38d72ca403e9064338be6e0cf69532768b0c1aba8f88703a8ce74c2734da522"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/controlling.pw.toml" file = "mods/controlling.pw.toml"
hash = "65c8086d2ec3d39acc7bd36c7a0306ccc43b602b38fa07d13291bc478ef7dfff"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/copycats.pw.toml" file = "mods/copycats.pw.toml"
hash = "fd62a69cda114a6a7c969d4a7ab9604c39acb31a11bdaa8f8618ed922745d2b9"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/create-connected.pw.toml" file = "mods/create-connected.pw.toml"
hash = "61afa588fd3156a29418aef463c527308b014e72d86b5ca7c03f2f28973ca27a"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/create.pw.toml" file = "mods/create.pw.toml"
hash = "dcaf5f2e28db0b9a127d0167456832341045ddc9aec058c3d9fcf53f618d2404"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/distanthorizons.pw.toml" file = "mods/distanthorizons.pw.toml"
hash = "d5b9c23df79ef871a70032567db2512904251347bdf13da80fbb8b00a846a79a"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/dynamic-fps.pw.toml" file = "mods/dynamic-fps.pw.toml"
hash = "ae6fd52d8bdcbeca5bbe6db840f22f92c1928fe0fda22017b19612b9b00a245a"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/entityculling.pw.toml" file = "mods/entityculling.pw.toml"
hash = "4fbe037c1ec3570be84f68e075c3e8293b15f64dda22bca4735924705fb38236"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/farmers-delight.pw.toml" file = "mods/farmers-delight.pw.toml"
hash = "7f837101645afe275564c75605e3950352db2e3dc18e0ebcf7460bac272afde4"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/ferrite-core.pw.toml" file = "mods/ferrite-core.pw.toml"
hash = "73360e397134d238ee8fd21d33fd7f9275e9441f74f8f1b6ed92278877c0b9f1"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/forgified-fabric-api.pw.toml" file = "mods/forgified-fabric-api.pw.toml"
hash = "e3c62164f1eed254aa04629bce3d62b34a65bf15801d2ffb1bf1373a0b97c544"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/handcrafted.pw.toml" file = "mods/handcrafted.pw.toml"
hash = "0004feab868f7b873c12db05aae0d0dac6c87b497490b48bb66480e7c8d0f340"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/immediatelyfast.pw.toml" file = "mods/immediatelyfast.pw.toml"
hash = "6828b28c310ae427da625473c55b79eb0c7ca42acc76591948644af0c04e3933"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/iris.pw.toml" file = "mods/iris.pw.toml"
hash = "db1c1e6382878b78e994dba1b9026935f8d1c5ca685c89d2437858e0a0dcab58"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/jade-addons-forge.pw.toml" file = "mods/jade-addons-forge.pw.toml"
hash = "8cd8400cb4e2c5ba60c8a359a7b6ff501078d2056eab0aba7f6b0ac77b7a0694"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/jade.pw.toml" file = "mods/jade.pw.toml"
hash = "4de3e4a1a49e332c1ad313283e0403c4273b628d634c17a9ff0c9da3d6b67f9a"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/jei.pw.toml" file = "mods/jei.pw.toml"
hash = "1eb4094b466679316208fa85e5a855fc71945cfd639ff7f831586452b0cc3ad3"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/lithium.pw.toml" file = "mods/lithium.pw.toml"
hash = "51e129832b04acd57da470fc41725bad5e101b6a6b1d4901fd8ea7a92b14e13d"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/modernfix.pw.toml" file = "mods/modernfix.pw.toml"
hash = "6d3ff3b7bbcc97fa06bdddcf2b3b7646168497ba6d7104bdea376f1bc65f9a93"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/mouse-tweaks.pw.toml" file = "mods/mouse-tweaks.pw.toml"
hash = "6bc414cc0f2d4c078fe83f384d786343f701f371d657c5279b5b0df1595804bd"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/resourceful-lib.pw.toml" file = "mods/resourceful-lib.pw.toml"
hash = "c0b066684294c33972d562e0cb08ea17b2d31bcf86cd1d6c63b8e968f0eac7a2"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/searchables.pw.toml" file = "mods/searchables.pw.toml"
hash = "ce9ddada6ffd55a512149cc474c6a453281a997a5fdf1b7b4a2cc73f875e704a"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/shulkerboxtooltip.pw.toml" file = "mods/shulkerboxtooltip.pw.toml"
hash = "0bef7b3dd4758a661d3e6827bd390c12ff8a3ede4a66bb2e01e3c760f02bd509"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/simple-voice-chat.pw.toml" file = "mods/simple-voice-chat.pw.toml"
hash = "8eae737eb20a0488e9b57b6a59f0681d142732bcb22fc896ad4e5ff924ec5683"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/sodium.pw.toml" file = "mods/sodium.pw.toml"
hash = "abc285fb28b8df872e4c2bb31e04fc23e2724d9c84b4cb6fbc4320fc569c758f"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/sound-physics-remastered.pw.toml" file = "mods/sound-physics-remastered.pw.toml"
hash = "258a77de0a6db4c9ab045cbb240bcf4eac0dbbca3f6bc981fb461e55c247f23f"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/spark.pw.toml" file = "mods/spark.pw.toml"
hash = "5995decc8738d7ddccec218dfa1ed95db9eca5bb64c98fd2cede8bf9bbc837c2"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/xaeros-minimap.pw.toml" file = "mods/xaeros-minimap.pw.toml"
hash = "4c336c9a00838ff5b5bbf6cd8ae35927186fdfa42258ca15513835e1b12ced2f"
metafile = true metafile = true
[[files]] [[files]]
file = "mods/xaeros-world-map.pw.toml" file = "mods/xaeros-world-map.pw.toml"
hash = "69df708c9b3980d96c953eaa0f98a9cb82ce7679872d1364da5ca4c116dc40b1"
metafile = true metafile = true
+3 -1
View File
@@ -6,8 +6,10 @@ pack-format = "packwiz:1.1.0"
[index] [index]
file = "index.toml" file = "index.toml"
hash-format = "sha256" hash-format = "sha256"
hash = "7c301d5e22c499b42d533cbb4d3a778295419c1328c58f363a049894467cf0b8"
[versions] [versions]
minecraft = "1.21.1" minecraft = "1.21.1"
neoforge = "21.1.248" neoforge = "21.1.248"
[options]
no-internal-hashes = true
+84
View File
@@ -0,0 +1,84 @@
# Playground
Playground is the experimental Minecraft environment.
Unlike Forever World, this pack is intentionally disposable and exists for testing mods, updates and configuration changes without risking the permanent world.
## Purpose
Use Playground for:
- evaluating new mods
- testing major mod updates
- testing Minecraft/NeoForge upgrades
- experimenting with world generation
- testing compatibility between mods
- testing configuration changes
- reproducing crashes
- validating potential Forever World changes
The world may be reset or replaced at any time.
## Platform
The Minecraft and NeoForge versions may change depending on what is being tested.
Packwiz remains the source of truth for the pack.
## Deployment
Development builds are published at:
```text
https://mc.ahmza.com/playground/dev/pack.toml
```
The Pterodactyl server should normally use:
```text
PACKWIZ_AUTO_SYNC=1
```
so restarting Playground synchronises it with the latest published pack.
## Development
Playground changes can normally be committed directly to `main`:
```bash
cd playground
packwiz add <mod>
packwiz refresh
git add .
git commit -m "Test <mod> in Playground"
git push
```
Feature branches may be used for larger experiments, but are not required for routine testing.
## Promotion to Forever World
A mod working in Playground does not automatically make it suitable for Forever World.
Before promotion consider:
- stability
- maintenance activity
- compatibility
- world-save impact
- dependencies
- performance
- removal behaviour
- future Minecraft upgrade prospects
Mods considered suitable should then be added independently to the Forever pack and tested against the Forever staging server.
## Persistence
Nothing in Playground should be considered permanent.
Worlds, configs and mods may be removed or reset as required.
If something matters, move it into the appropriate version-controlled configuration before relying on it.