
Growbed
Tiered placeable farming stations. Seed a trough, watch it grow, harvest the whole bed in one interaction. Four tiers, works with modded crops.Growbed
A tiered placeable farming station for Valheim. Seed it, watch it grow through visual stages, harvest the batch in one interaction — the Fermenter/Smelter pattern reskinned as farming, in four material tiers.
Built on BepInEx + Jotunn. Multiplayer and dedicated-server safe by design.
Status
| Milestone | State |
|---|---|
| 1. Dummy placeable in-game | compiles against the real game assemblies; not yet run in-game |
| 2. Interact/harvest loop + ZDO sync | compiles; not yet run in-game |
| 3. Real models, stage visuals | geometry generated; Unity build tooling written, bundle not yet built |
| 4. Tier config table | done — all four tiers are data rows |
| 5. Balance pass | numbers chosen and applied; needs playtesting to confirm |
| 6. Polish (sound, particles, tooltips) | tooltips done; effect lists wired but unassigned |
| Packaging | Thunderstore manifest, 256x256 icon and package script done |
The mod builds clean against Valheim's real assemblies and packages into an
installable dist/Growbed-0.1.0.zip. Nothing has been run inside Valheim yet —
Valheim has no macOS build, so the in-game half of milestones 1–2 needs a Windows
or Linux machine. See docs/SETUP.md.
Layout
src/Growbed/ the mod
GrowbedPlugin.cs BepInEx entry, piece registration, localisation
GrowbedTier.cs the tier table — all balance numbers live here
Growbed.cs the station behaviour: state, interaction, visuals
SeedRegistry.cs seed -> crop discovery
GrowbedConfig.cs admin-only, server-synced config
assets/blender/ procedural model generation
assets/icons/ build-menu icons (rendered, embedded in the DLL)
unity/ Editor tooling that turns the models into the AssetBundle
assets/out/ generated fbx/glb/blend + preview render (gitignored)
tools/ assembly fetch, packaging, r2modman deploy, apicheck
docs/ HANDOFF (start here), SPEC, SETUP, BALANCE, MULTIPLAYER
Two deliberate departures from the original spec
Seeds are discovered, not allowlisted. The spec called for matching
m_shared.m_name against known seed prefabs. Instead SeedRegistry walks the
game's own Plant prefabs and reads seed, crop, yield and grow time straight off
them. Same free compatibility with crop mods, but it also means grow times and
yields track vanilla automatically instead of being hardcoded constants that drift
when the game rebalances.
Growth stage is derived, not stored. The spec listed stage as a ZDO field.
Storing it would mean replicating a value every peer can compute, and a stage
advance would need an RPC that can be missed. Only the plant time is stored; each
client derives the stage. One source of truth, no desync, correct for a client
joining mid-growth. See docs/MULTIPLAYER.md.
Build and install
tools/package-thunderstore.sh
Builds and writes dist/Growbed-<version>.zip, ready for r2modman -> Settings ->
Import local mod. BepInEx and Jotunn come in as declared dependencies rather than
being placed by hand.
Requires the .NET SDK and a path to Valheim's managed assemblies — full
instructions, including how to get those on a Mac, in docs/SETUP.md.
For iteration against an existing profile, tools/deploy-r2modman.sh copies the
built DLL straight into it.
Generate the art
/Applications/Blender.app/Contents/MacOS/Blender --background \
--python assets/blender/gen_growbed.py -- --outdir assets/out
Current output, all comfortably inside the low-poly budget:
| Tier | Slots | Trough tris | Worst case on screen |
|---|---|---|---|
| Wood | 4 | 132 | 660 |
| Bronze | 6 | 228 | 1020 |
| Iron | 8 | 260 | 1316 |
| Silver | 12 | 260 | 1844 |
Balance model
Grow-time multipliers are deliberately above 1.0 — a plant in a growbed grows
slower than the same plant in the ground. A bed packs roughly twice vanilla's plant
density into its footprint, so vanilla-speed growth would have put even the entry
tier at 2x vanilla throughput per m². What a bed sells is batch planting, batch
harvest and a tidy build, not raw output. Full working in docs/BALANCE.md.
| Tier | Slots | Time mult | Throughput vs vanilla per m² |
|---|---|---|---|
| Wood | 4 | 2.20x | 0.9x |
| Bronze | 6 | 1.80x | 1.1x |
| Iron | 8 | 1.60x | 1.3x |
| Silver | 12 | 1.30x | 1.5x |
Open questions
- Ship with all crops (automatic, given seed discovery) or restrict to 1–2 at launch.
- Piece build recipes have no vanilla concept of a crafting-station level, so "Forge lvl 2/4" cannot be enforced the way the spec assumes. Material cost already gates progression — you cannot hold silver before the Mountains. Worth dropping the level requirement unless it needs enforcing for its own sake.
- Beds lock from planting until harvest; you cannot top up a partly planted bed. Allowing top-ups would let a player plant one seed, wait, then fill the rest for a near-instant harvest. Locking is the simple correct answer, but it should be a conscious one.

