diff --git a/apps/labrinth/fixtures/labrinth-seed-data-202508052143.sql b/apps/labrinth/fixtures/labrinth-seed-data-202508052143.sql
index 000637388..8edeb1407 100644
--- a/apps/labrinth/fixtures/labrinth-seed-data-202508052143.sql
+++ b/apps/labrinth/fixtures/labrinth-seed-data-202508052143.sql
@@ -1,83 +1,83 @@
BEGIN TRANSACTION;
COPY public.categories (id, category, project_type, icon, header, ordering) FROM stdin;
-60 cursed 3 categories 0
-61 locale 3 features 0
-62 48x 3 resolutions 0
-1 technology 1 categories 0
-16 challenging 2 categories 0
-5 decoration 1 categories 0
-6 library 1 categories 0
-7 cursed 1 categories 0
-2 adventure 1 categories 0
-56 64x 3 resolutions 0
-55 32x 3 resolutions 0
-58 256x 3 resolutions 0
-59 512x+ 3 resolutions 0
-54 16x 3 resolutions 0
-63 path-tracing 4 features 0
-64 realistic 4 categories 0
-65 medium 4 performance impact 0
-66 low 4 performance impact 0
-67 high 4 performance impact 0
-68 atmosphere 4 features 0
-69 fantasy 4 categories 0
-70 foliage 4 features 0
-71 bloom 4 features 0
-72 vanilla-like 4 categories 0
-73 cartoon 4 categories 0
-74 potato 4 performance impact 0
-75 shadows 4 features 0
-76 pbr 4 features 0
-77 semi-realistic 4 categories 0
-78 cursed 4 categories 0
-79 reflections 4 features 0
-80 screenshot 4 performance impact 0
-81 colored-lighting 4 features 0
-57 128x 3 resolutions 0
-30 economy 1 categories 0
-31 management 1 categories 0
-26 optimization 2 categories 0
-27 mobs 1 categories 0
-28 transportation 1 categories 0
-24 kitchen-sink 2 categories 0
-44 blocks 3 features 0
-43 audio 3 features 0
-21 combat 2 categories 0
-22 adventure 2 categories 0
-23 technology 2 categories 0
-33 minigame 1 categories 0
-34 combat 3 categories 0
-35 decoration 3 categories 0
-36 modded 3 categories 0
-47 environment 3 features 0
-46 entities 3 features 0
-32 game-mechanics 1 categories 0
-41 utility 3 categories 0
-45 core-shaders 3 features 0
-40 tweaks 3 categories 0
-51 items 3 features 0
-52 models 3 features 0
-48 equipment 3 features 0
-49 fonts 3 features 0
-37 simplistic 3 categories 0
-38 realistic 3 categories 0
-39 themed 3 categories 0
-3 magic 1 categories 0
-4 utility 1 categories 0
-15 optimization 1 categories 0
-9 storage 1 categories 0
-53 8x- 3 resolutions 0
-42 vanilla-like 3 categories 0
-10 food 1 categories 0
-11 equipment 1 categories 0
-50 gui 3 features 0
-8 worldgen 1 categories 0
-17 multiplayer 2 categories 0
-18 quests 2 categories 0
-19 magic 2 categories 0
-20 lightweight 2 \n categories 0
-29 social 1 categories 0
+10060 cursed 3 categories 0
+10061 locale 3 features 0
+10062 48x 3 resolutions 0
+1001 technology 1 categories 0
+10016 challenging 2 categories 0
+1005 decoration 1 categories 0
+1006 library 1 categories 0
+1007 cursed 1 categories 0
+1002 adventure 1 categories 0
+10056 64x 3 resolutions 0
+10055 32x 3 resolutions 0
+10058 256x 3 resolutions 0
+10059 512x+ 3 resolutions 0
+10054 16x 3 resolutions 0
+10063 path-tracing 4 features 0
+10064 realistic 4 categories 0
+10065 medium 4 performance impact 0
+10066 low 4 performance impact 0
+10067 high 4 performance impact 0
+10068 atmosphere 4 features 0
+10069 fantasy 4 categories 0
+10070 foliage 4 features 0
+10071 bloom 4 features 0
+10072 vanilla-like 4 categories 0
+10073 cartoon 4 categories 0
+10074 potato 4 performance impact 0
+10075 shadows 4 features 0
+10076 pbr 4 features 0
+10077 semi-realistic 4 categories 0
+10078 cursed 4 categories 0
+10079 reflections 4 features 0
+10080 screenshot 4 performance impact 0
+10081 colored-lighting 4 features 0
+10057 128x 3 resolutions 0
+10030 economy 1 categories 0
+10031 management 1 categories 0
+10026 optimization 2 categories 0
+10027 mobs 1 categories 0
+10028 transportation 1 categories 0
+10024 kitchen-sink 2 categories 0
+10044 blocks 3 features 0
+10043 audio 3 features 0
+10021 combat 2 categories 0
+10022 adventure 2 categories 0
+10023 technology 2 categories 0
+10033 minigame 1 categories 0
+10034 combat 3 categories 0
+10035 decoration 3 categories 0
+10036 modded 3 categories 0
+10047 environment 3 features 0
+10046 entities 3 features 0
+10032 game-mechanics 1 categories 0
+10041 utility 3 categories 0
+10045 core-shaders 3 features 0
+10040 tweaks 3 categories 0
+10051 items 3 features 0
+10052 models 3 features 0
+10048 equipment 3 features 0
+10049 fonts 3 features 0
+10037 simplistic 3 categories 0
+10038 realistic 3 categories 0
+10039 themed 3 categories 0
+1003 magic 1 categories 0
+1004 utility 1 categories 0
+10015 optimization 1 categories 0
+1009 storage 1 categories 0
+10053 8x- 3 resolutions 0
+10042 vanilla-like 3 categories 0
+10010 food 1 categories 0
+10011 equipment 1 categories 0
+10050 gui 3 features 0
+1008 worldgen 1 categories 0
+10017 multiplayer 2 categories 0
+10018 quests 2 categories 0
+10019 magic 2 categories 0
+10020 lightweight 2 \n categories 0
+10029 social 1 categories 0
\.
diff --git a/apps/labrinth/migrations/20260114130019_server_listing_projects.sql b/apps/labrinth/migrations/20260114130019_server_listing_projects.sql
new file mode 100644
index 000000000..7de4b975a
--- /dev/null
+++ b/apps/labrinth/migrations/20260114130019_server_listing_projects.sql
@@ -0,0 +1,2 @@
+ALTER TABLE mods
+ADD COLUMN components JSONB NOT NULL DEFAULT '{}';
diff --git a/apps/labrinth/migrations/20260207153522_version_components.sql b/apps/labrinth/migrations/20260207153522_version_components.sql
new file mode 100644
index 000000000..f6c318526
--- /dev/null
+++ b/apps/labrinth/migrations/20260207153522_version_components.sql
@@ -0,0 +1,8 @@
+ALTER TABLE versions
+ADD COLUMN components JSONB NOT NULL DEFAULT '{}';
+
+-- extra metadata for the `minecraft_java_server` version component
+CREATE TABLE minecraft_java_server_versions (
+ id bigint PRIMARY KEY REFERENCES versions(id),
+ modpack_id bigint REFERENCES versions(id)
+);
diff --git a/apps/labrinth/migrations/20260218183440_server_project_links_categories.sql b/apps/labrinth/migrations/20260218183440_server_project_links_categories.sql
new file mode 100644
index 000000000..7ed04f125
--- /dev/null
+++ b/apps/labrinth/migrations/20260218183440_server_project_links_categories.sql
@@ -0,0 +1,60 @@
+INSERT INTO link_platforms (name, donation) VALUES ('store', false);
+
+INSERT INTO project_types (id, name)
+VALUES (7, 'minecraft_java_server');
+
+INSERT INTO categories (header, category, project_type)
+VALUES
+ ('minecraft_server_gameplay', 'skyblock', 7),
+ ('minecraft_server_gameplay', 'oneblock', 7),
+ ('minecraft_server_gameplay', 'gens', 7),
+ ('minecraft_server_gameplay', 'prison', 7),
+ ('minecraft_server_gameplay', 'factions', 7),
+ ('minecraft_server_gameplay', 'lifesteal', 7),
+ ('minecraft_server_gameplay', 'anarchy', 7),
+ ('minecraft_server_gameplay', 'towns', 7),
+ ('minecraft_server_gameplay', 'vanilla-like', 7),
+ ('minecraft_server_gameplay', 'rpg', 7),
+ ('minecraft_server_gameplay', 'minigames', 7),
+ ('minecraft_server_gameplay', 'racing', 7),
+ ('minecraft_server_gameplay', 'battle-royale', 7),
+ ('minecraft_server_gameplay', 'parkour', 7),
+ ('minecraft_server_gameplay', 'bedwars', 7),
+ ('minecraft_server_gameplay', 'kitpvp', 7),
+ ('minecraft_server_gameplay', 'microgames', 7),
+
+ ('minecraft_server_features', 'pokemon', 7),
+ ('minecraft_server_features', 'teams', 7),
+ ('minecraft_server_features', 'pvp', 7),
+ ('minecraft_server_features', 'pve', 7),
+ ('minecraft_server_features', 'op', 7),
+ ('minecraft_server_features', 'economy', 7),
+ ('minecraft_server_features', 'plots', 7),
+ ('minecraft_server_features', 'questing', 7),
+ ('minecraft_server_features', 'personal-worlds', 7),
+ ('minecraft_server_features', 'media', 7),
+ ('minecraft_server_features', 'bosses', 7),
+ ('minecraft_server_features', 'classes', 7),
+ ('minecraft_server_features', 'custom-content', 7),
+ ('minecraft_server_features', 'dungeons', 7),
+
+ ('minecraft_server_meta', 'crossplay', 7),
+ ('minecraft_server_meta', 'offline-mode', 7),
+ ('minecraft_server_meta', 'whitelisted', 7),
+ ('minecraft_server_meta', 'keep-inventory', 7),
+ ('minecraft_server_meta', 'network', 7),
+ ('minecraft_server_meta', 'world-resets', 7),
+ ('minecraft_server_meta', 'creative-mode', 7),
+ ('minecraft_server_meta', 'hardcore-mode', 7),
+ ('minecraft_server_meta', 'survival-mode', 7),
+ ('minecraft_server_meta', 'adventure-mode', 7),
+
+ ('minecraft_server_community', 'adventure-mode', 7),
+ ('minecraft_server_community', 'smp', 7),
+ ('minecraft_server_community', 'mmo', 7),
+ ('minecraft_server_community', 'roleplay', 7),
+ ('minecraft_server_community', 'social', 7),
+ ('minecraft_server_community', 'creator-community', 7),
+ ('minecraft_server_community', 'recording-smp', 7),
+ ('minecraft_server_community', 'competitive', 7),
+ ('minecraft_server_community', 'technical', 7);
diff --git a/apps/labrinth/tests/tags.rs b/apps/labrinth/tests/tags.rs
index 4cd93d60a..5ca1bb49a 100644
--- a/apps/labrinth/tests/tags.rs
+++ b/apps/labrinth/tests/tags.rs
@@ -21,21 +21,18 @@ async fn get_tags() {
.into_iter()
.map(|x| x.name)
.collect::>();
- assert_eq!(
- category_names,
- [
- "combat",
- "economy",
- "food",
- "optimization",
- "decoration",
- "mobs",
- "magic"
- ]
- .iter()
- .map(|s| s.to_string())
- .collect()
- );
+
+ for name in [
+ "combat",
+ "economy",
+ "food",
+ "optimization",
+ "decoration",
+ "mobs",
+ "magic",
+ ] {
+ assert!(category_names.contains(name));
+ }
})
.await;
}