// info-panel.jsx - below-the-fold explainer: how it works, FAQ, popular B42
// mods, wiki links, hosting card. Loaded before sortof-app.jsx.
const WIKI_BASE = 'https://wiki.indifferentbroccoli.com/en/ProjectZomboid';
const WIKI_GUIDES = [
{ href: 'https://wiki.indifferentbroccoli.com/ProjectZomboid/AddMods',
label: 'add mods to your server',
blurb: 'where the three lines go in the ini, and in what order' },
{ href: 'https://wiki.indifferentbroccoli.com/ProjectZomboid/AddMapMods',
label: 'add map mods',
blurb: 'Map= is its own line and its own set of rules' },
{ href: 'https://wiki.indifferentbroccoli.com/ProjectZomboid/RemoveMod',
label: 'remove a mod',
blurb: 'pulling a mod out without wrecking the save' },
];
// Top 10 by how often each appears in a B42 sort on this site.
// Snapshot: 2026-07-31. Thumbnails are the workshop preview images.
const POPULAR_B42 = [
{ wsid: '3171167894', title: 'that DAMN Library',
blurb: "KI5's shared framework. Every KI5 vehicle mod needs it, and none of them work without it." },
{ wsid: '3330403100', title: 'Trailers!',
blurb: 'Towable utility and cargo trailers in three sizes, for hauling loot instead of pocketing it.' },
{ wsid: '2896041179', title: 'errorMagnifier',
blurb: 'Pops a visible button the moment the game throws an error, so players can actually report it.' },
{ wsid: '3077900375', title: 'Mod Update and Alert System',
blurb: "Shows mod changelogs and update notices in-game. Optional on B41, required by its author's B42 mods." },
{ wsid: '2503622437', title: 'Skill Recovery Journal',
blurb: 'A craftable journal that lets your next character recover the skills and recipes the last one died with.' },
{ wsid: '2566953935', title: "'86 Oshkosh P19A + Military Trailers",
blurb: 'A big drivable airfield fire truck in four variants, plus matching military trailers.' },
{ wsid: '3670064951', title: 'Campers!',
blurb: 'Campers and towed trailers you can sleep in, sit in and store gear in. Built for nomad runs.' },
{ wsid: '3402491515', title: "Tsar's Common Library B42",
blurb: "Build 42 port of Tsar's shared asset library. A dependency, not something you use directly." },
{ wsid: '2335368829', title: 'Authentic Z',
blurb: 'Over 150 outfits handed out to zombies based on where they died, so a hospital looks like a hospital.' },
{ wsid: '3508537032', title: 'NeatUI Framework [B42]',
blurb: 'Shared UI framework for B42 mods. Install it when something else requires it, and load it before that mod.' },
];
const FAQ_ITEMS = [
{
q: 'it says "cache miss" and starts indexing. did it break?',
a: <>No. That means we've never opened those workshop items before, so
we're downloading each one to read its
Project Zomboid loads mods top to bottom in the order you list them in
The first sort touching a brand-new mod is slow, we have to download it
to read the manifest. After that it stays cached until its author
publishes an update, at which point we re-read it automatically.
Counted across every B42 sort run on this site, most recent snapshot.
Not a recommendation, just what people actually run.
The longer how-tos live on the{' '}
Project Zomboid wiki
.
mod.info. Wait about
30 seconds and hit sort again. Every later sort with those mods is
instant.>,
},
{
q: 'i pasted the lines and the mods still are not loading',
a: <>All three lines have to land in the same servertest.ini (or
whatever your server is named), the server has to be fully stopped when
you edit it, and the values take no spaces after the =.
Full walkthrough: add mods to your server.>,
},
{
q: 'what is a "missing dependency" warning?',
a: <>A mod declared require=SomethingElse and that something
else is not in your list. The game will load the mod and then break the
moment it reaches for the missing code. Use the [add]
button on the warning to drop the required workshop id straight into
your input, then sort again.>,
},
{
q: 'my map mod does not show up, or spawns are wrong',
a: <>Map folders are their own line and their own fight: when two maps claim
the same cell, the one listed first in Map= wins.
We put Muldraugh, KY last so vanilla never eats a custom
cell. Detail: add map mods.>,
},
{
q: 'half my mods are flagged "build mismatch"',
a: <>You are sorting on the wrong build. B41 and B42 mods are not
interchangeable, and Steam tags each item with the build it targets.
Flip the B41 / B42 toggle and sort again. Some items ship both builds in
one workshop id; those get a branch picker instead of a warning.>,
},
{
q: 'two mods have the same mod id',
a: <>Two separate workshop items ship the same internal mod id, so the game
loads exactly one of them and silently ignores the other. Keep whichever
one you actually want and drop the other from your list.>,
},
{
q: 'does the order of WorkshopItems matter?',
a: <>No. WorkshopItems= is only the download list. Load order
comes from Mods=, and map priority from Map=.
We still emit all three because the server needs all three.>,
},
{
q: 'i want to drop a mod mid-save',
a: <>Removing a mod mid-save can strip items, vehicles or whole map cells
out from under your players. Read remove
a mod first, then re-sort the shortened list here.>,
},
{
q: 'i sorted the same list twice and got a different answer',
a: <>A mod author published an update in between. We key our cache on
Steam's time_updated, so when a mod changes we re-read its
mod.info and its declared requirements may have moved.>,
},
];
function HowItWorks() {
return (
how it works
Mods=. Get that order wrong and you get missing textures,
recipes that never register, and a server that dies on boot with a stack
trace nobody wants to read. Sorting it by hand is miserable past about
fifteen mods. So: paste ids, get the three lines.
mod.info,
the small manifest each mod ships. That is where its real mod id,
its map folders and its declared relationships live.
require= (load these before me),
incompatible= (never load with me), and
loadFirst / loadLast. Add any sorting rules
you paste in yourself, and that is a dependency graph.
WorkshopItems= (what to download),
Mods= (load order), Map= (map folder
priority). Anything we could not reconcile becomes a warning instead
of a silent guess.
faq
{item.q}
10 most-sorted b42 mods
{POPULAR_B42.map((m, i) => (
{onLoadWsids && (
)}
{m.title}
{m.blurb}
server guides
{WIKI_GUIDES.map(g => (