The cold ZFS pool is a backup tier only — hot data (MC world, Gitea,
Directus DB, containers) lives on NVMe LVM, not ZFS. So ARC's default of
50% RAM was wasted: nothing it could cache was hot enough to matter, and
the ~16GB cache crowded MC out of RAM, pushing 2.4GB into swap.
This file lives in the repo for reproducibility; it gets dropped into
/etc/modprobe.d/ on the host and applied immediately via
/sys/module/zfs/parameters/zfs_arc_{max,min}.
Effect on glados:
before: used=27/31GB, free=748MB, ARC=15.6GB
after: used=~10GB, free=~14GB, ARC=1.0GB (1-2GB range)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
User confirmed in-game tooltip values:
spur=1, bevel=8, sprocket=16, cog=64, crown=512, sun=4096.
Chain is non-uniform (x8, x2, x4, x8, x8). My earlier guesses
(uniform x8, assuming Sun=64 Cogs) gave consistent but wrong
intermediate values. Now sourced from the mod's own tooltip, not
triangulated.
Plot prices at 100/250/600 spurs now mean roughly:
100 spurs = 6 bevels + 4 spurs (1 sprocket + 5 bevels + 4 spurs)
250 spurs = 3 cogs + 3 bevels + 2 spurs
600 spurs = 9 cogs + 3 bevels (... still small change tier)
User-side: edit PLOT_DEFS in plots.js to set real prices once the
spawn marketplace and economy scale are decided.
Was: 5-denom x8 chain (spur=1, bevel=8, cog=64, crown=512, sun=4096).
Now: 6-denom x8 chain with sprocket inserted between bevel and cog.
Verified in-game (user reported Sun = 64 Cogs, which only fits these
values: spur=1, bevel=8, sprocket=64, cog=512, crown=4096, sun=32768).
Plot purchase math (countCoins, takeCoins, giveCoins) was using the
old 5-denom map: cog would have been counted as 64 spurs when it's
actually 512, and sprockets weren't counted at all. Plot prices remain
at 100/250/600 spurs which are still appropriate small-change amounts;
user can edit PLOT_DEFS to raise once playtesting confirms desired
economy scale.
Three corrections per user feedback:
1. Drop the conversion-crib lines -- Numismatics' built-in tooltip
already shows 'Value: N spurs' so our added lines were duplicate.
2. Include sprocket (numismatics:sprocket) -- the 6th denomination
I missed when first writing the script. Full set: spur, bevel,
sprocket, cog, crown, sun.
3. Keep only the actually-useful hint: 'Right-click a Bank Teller
block to convert denominations' -- the one piece of info that
isn't on the mod's own tooltip.
Decision punted (deliberately): no 8-spurs-shapeless-to-1-bevel
crafting recipes. The Bank Teller is the spawn-economy anchor;
crafting recipes would let players bypass the bank entirely. Players
who want local conversion can place their own Teller -- which is the
intended Numismatics design.
URGENT client-side fix. brassandsigil_tweaks-1.0.0.jar (built from
pack/tweaks/ into pack/overrides/mods/) declares lithostitched as a
hard dependency in its mods.toml. lithostitched is tagged side=server
in the lockfile because it's worldgen-only. brassandsigil_tweaks had
no explicit side tag so Build-Pack defaulted it to side=both. Clients
downloaded the tweak jar but not the dep -> NeoForge refused to start
with 'Mod brassandsigil_tweaks requires lithostitched 1.7 or above'.
Fix: Build-Pack now injects side='server' on any local-override file
under mods/. All tweak jars are data-only (worldgen modifiers, recipe
overrides) and pure server-side. If a future tweak is actually client-
relevant, this rule will need a per-file exception.
Tested in build output -- the brassandsigil_tweaks entry now shows
side='server' in the generated manifest.
Numismatics' x8 uniform chain isn't intuitive. Mod values are
hardcoded so we cant fix the ratios, but we can put the conversion
table directly on each coins tooltip via KubeJS ItemEvents.tooltip.
Players hover any coin -> see how it relates to the others + a hint
to use Bank Teller for on-the-fly conversion.
~25 lines, ItemEvents.tooltip hot path is cached per item-id so no
performance concern.
Configured is the in-game config GUI library JEI suggests when you
press its wrench icon (and the same library a bunch of other mods use
for their config screens). CurseForge-only (not on Modrinth) so we
add as source: curseforge -- following the same pattern as the FTB
mods already in the lockfile.
Tagged side=client because Configured is purely a client-side config
UI provider; the server doesn't need it. Server-side filter will skip
it on sync.
Filename gotcha noted for future CF adds: the CF web page shows the
mod with a friendly name like 'Configured 2.6.3.jar', but the actual
file on mediafilez.forgecdn.net is named 'configured-neoforge-1.21.1
-2.6.3.jar'. Use the CDN filename in the URL, not the web display
name.
The 0.4.10 build was already deployed (replacing the broken 0.4.9 that
shipped without launcher-config.json embedded). This commit just makes
the repo match what's live so a future 'git status' isn't dirty.
Players with an existing options.txt (i.e. anyone who has launched MC
once) don't get the 'default_packs' applied -- RPO only treats those as
defaults for fresh installs.
Adding 'required: true' to the override entry on the assumption that
the field forces the pack to be enabled on every launch regardless of
player choice. Decompiled the jar for string constants and 'required'
appears alongside 'force_compatible' as a known key.
If the field name is wrong RPO will silently ignore it -- no harm, easy
iteration.
Microsoft.NET.Sdk.WindowsDesktop emits NETSDK1100 when a Windows-
targeting project is built from a non-Windows host. Setting
EnableWindowsTargeting=true opts in to the cross-compile path, which
works on Linux as long as the WindowsDesktop SDK files are present.
On glados they were copied from a Windows .NET 8 SDK archive into
/usr/lib/dotnet/sdk/8.0.126/Sdks/Microsoft.NET.Sdk.WindowsDesktop/
and /usr/lib/dotnet/packs/Microsoft.WindowsDesktop.App.Ref/. This is
a one-time setup per Linux host -- see the bridge-claude memory note.
No-op on Windows hosts (the flag has no effect when the SDK is native).
Both PC builds and glados builds now produce the same output.
So existing 0.4.8 installs see the upgrade banner in their current
launcher after the next deploy. The actual session-refresh code change
landed in the previous commit (DoLaunchAsync pre-launch refresh).
Microsoft access tokens have a ~1 hour TTL. The launcher cached the
MSession once at sign-in and re-used it on every Play click, so leaving
the launcher open for >1 hour and then hitting Play sent stale
credentials to MC -- Mojang's session check on the server then rejected
the join with "Invalid session".
Fix: in DoLaunchAsync, before assembling the MC launch command, call
_auth.TryAuthenticateSilentlyAsync(). XboxAuthNet's silent flow uses
the cached refresh token (~14 day TTL) to mint a fresh access token
transparently. On success ApplySession swaps in the new MSession and
we launch with valid credentials. On failure (refresh token also
stale) the launcher prompts the player to sign in again -- they keep
the launcher open, hit Sign In, no MC restart needed.
No new dependencies, no UI change beyond the brief "Refreshing
session..." status line, no perf cost beyond the ~500ms HTTP roundtrip
to Microsoft each launch.
Bump the launcher version in launcher/ModpackLauncher.csproj before
publishing so old launcher installs see the upgrade banner.
Two consecutive client_scripts errors traced to jei_hides.js:
1. Array-spread syntax not supported by Rhino (fixed in 0.21.1)
2. JEIEvents global is not defined in KubeJS 2101.7 -- the actual JEI
event API uses classes like JEIRemoveEntriesKubeEvent but the binding
name is something different we haven't identified yet.
Rather than ship more guesses, drop the script entirely. Functional
impact is minimal: recipes for waystones + coins are still removed
server-side (recipes_waystones.js, recipes_numismatics.js), so players
cannot craft these items even if they appear in JEI search. The only
loss is some JEI clutter.
When we identify the correct JEI hide API in KubeJS 2101.x, can add
back as kubejs/client_scripts/jei_hides.js with the right binding.
KubeJS uses Rhino as its JS engine, which doesn't support array-spread
syntax (`[...a, ...b]`). The line `[...WAYSTONE_ITEMS, ...COIN_ITEMS]
.forEach(...)` threw EvaluatorException: syntax error at jei_hides.js:46
on client launch, surfacing the KubeJS client script errors dialog.
Fix: use Array.prototype.concat() which is universal JS. Also extracted
the hide-quietly helper into a named function for readability.
/bns plot list|info|buy|release|reload. Single ~316-line file with
clear sections. Hardcoded PLOT_DEFS Map (3 example plots), ownership
state in server.persistentData.bnsPlots, best-effort Numismatics +
FTB Chunks integration (will be verified in playtest). See file
header for full design notes.
Tidying pass on the KubeJS suite before plot system V1 lands. Sets up
the file structure + conventions + diagnostics so the larger plot
system has a clean foundation.
Changes:
1. NEW kubejs/README.md
File layout doc + conventions: logging prefix [bns/<module>],
persistent-data key naming (bns* prefix), one concern per file,
performance discipline (O(1) lookups, no polling).
2. Split economy_policy.js -> recipes_waystones.js + recipes_numismatics.js
Single-concern files. recipes_waystones removes ALL waystones
crafting (welcome.js distributes the only allowed waystone instead).
recipes_numismatics removes the 5 coin-denomination crafts.
3. NEW kubejs/server_scripts/bns_admin.js
/bns admin subcommands for OP diagnostics:
- info calling player's flags+counts
- waystone-count <player> read stored count
- waystone-set <player> <n> override stored count
- reset-welcome <player> clear bnsWelcomeGranted -- replays
the welcome grant on next login
Registered via ServerEvents.commandRegistry with Brigadier tree,
permission level 2 (OP). No performance cost (operator-triggered only).
4. Logging added to waystones_policy.js + welcome.js
Every action prints `[bns/<module>] ...` so server logs can be
filtered with `journalctl ... | grep '\[bns/'`.
Performance discipline applied:
- All event-handler lookups use Set.has (O(1)), not Array.includes
- No periodic tick polling anywhere
- No network calls in event handlers
- console.info is cheap (no string format unless logged)
Bumps to 0.20.0. Plot system V1 follows in v0.21.x as a separate
multi-file submodule under server_scripts/plots/.
Resource Pack Overrides config field names extracted directly from the
mod's class files (default_packs + default_overrides confirmed via grep
on the .class strings). Config ships through defaultconfigs/ so it
seeds the player's local config on first run and respects later edits.
The 'default_position: TOP' override puts the ReCreated pack at the top
of the enabled-packs list so it takes precedence over the vanilla
ComputerCraft textures.
If the filename or schema turns out to be off when tested, it's a
one-line follow-up to fix.
Two changes per user direction:
- server.properties is reverted (resource-pack lines cleared, require=
false). No more server-pushed pack -- no prompt on join, no kick if
declined, no redundant re-download of a file the launcher already
shipped.
- Adds resource-pack-overrides (Modrinth's gold-standard "auto-enable
bundled resource packs" mod, 8.2M dl, client-only). The Computer
Craft Recreated v1.2.zip already ships in the modpack manifest
(side=client) so it's already in players' resourcepacks/ folder via
the launcher -- RPO will be configured to default-enable it.
The RPO config (`pack/overrides/config/resourcepackoverrides-client.toml`
or similar) lands in a follow-up once we've seen the generated format.
For now this commit just gets the mod into the pack. Bumps to 0.19.4.
Two design changes:
1) Every electronic CC item now requires tfmg:plastic_sheet. Plastic is
the electrical insulator and gates ALL CC tech behind TFMG's full
oil chain (crude oil -> naphtha -> distillation -> molten plastic
-> sheet). Even cable -- you can't lay wires without insulation.
2) Advanced items now embed their Basic counterpart in the recipe:
- computer_advanced contains computer_normal
- monitor_advanced contains monitor_normal
- wireless_modem_advanced contains wireless_modem_normal
- pocket_computer_advanced contains pocket_computer_normal
- turtle_advanced contains computer_advanced (which contains
computer_normal -- chained upgrade)
This makes the progression literal -- you can't skip Basic to make
Advanced. You upgrade through, paying both costs.
Other tweaks:
- Replaced create:railway_casing with create:industrial_iron_block in
the Advanced Computer recipe. Railway casing is thematically tied to
trains, not computing -- creates a weird "build trains to make a
computer" dependency. industrial_iron_block fits the server-rack
aesthetic and is a more general Create tier-3 material.
- Added plastic to disk_drive, wired_modem, printer, redstone_relay,
speaker (recipes that previously skipped it).
Bumps to 0.19.3.
Expands the v0.19.0 recipe set from 10 to 19 items and builds a deliberate
5-tier progression using richer Create + TFMG materials.
Newly overhauled items:
T1 - cable (8-output, copper_wire-heavy so bulk-laying is viable)
T3 - redstone_relay
T3 - turtle_normal
T4 - turtle_advanced
T5 - pocket_computer_normal, _advanced, _colour
Misc - wired_modem_full (block form, derived from wired_modem)
Existing items reworked with better thematic materials:
computer_normal/advanced -> now uses create:brass_casing / railway_casing
as the chassis instead of bare plastic
monitor_normal/advanced -> nixie_tube for the retro CRT, display_link
for the advanced data-binding monitor
wireless_modem_normal -> tfmg:electromagnetic_coil is the antenna,
copper_wire + aluminum_wire signal lines
wireless_modem_advanced -> constantan_spool + large_coil for high-Q
tuning -- properly end-game wireless
disk_drive -> create:cogwheel for the spinning read head
speaker / printer -> copper_sheet / cogwheel for thematic flair
Wire usage is the through-line: copper_wire in T1-T2 (cheap, used in
quantity), aluminum_wire in T3 mid-tier signal lines, constantan_wire
+ constantan_spool in T4 for high-frequency wireless. TFMG's electrical
production now genuinely gates CC progression.
Bumps pack to 0.19.1 (point release — same mod set, expanded scripts).
Mods (5 additions):
- Easy NPC 6.16.1 (3 jars: bundle + core + config_ui). Lightweight,
config-UI-driven NPC mod -- 817k downloads, NOT the heavyweight
Custom NPCs by Noppes which has no 1.21.1 NeoForge port. Players
will interact with NPCs at spawn (Plot Office land clerk + future
shop NPCs) via right-click -> dialogue.
- CC: Tweaked 1.119.0. ComputerCraft tier added for technical displays,
server stats, and player-built automation. Future plot-system V2
could use CC monitors as the central kiosk with touch buttons; V1
uses NPC + signs.
- Computer Craft: ReCreated v1.2 (resource pack, client-only). Styles
CC's computers + monitors with a brass/wooden Create aesthetic so
they don't look out of place in the pack.
KubeJS scripts:
- cc_recipes.js: Overhauls 10 CC crafting recipes to require Create
(electron_tube, precision_mechanism, rose_quartz) + TFMG (plastic
sheet, steel ingot, silicon ingot). Gates the tech tier behind
Create+industrial progression. Recipes for cables, peripheral
blocks, turtles, etc. left at default -- can iterate later.
Plot system V1 deferred to v0.20.0 -- needs its own focused effort
because of the FTB Chunks claim-transfer integration + Numismatics
inventory coin handling. Memory plan already covers the design.