
subnautica-2-deep-synergy-multiplayer-mod
BepInEx multiplayer mod for Subnautica 2 enabling co-op gameplay with synchronized sessions, shared bases, and dynamic scaling
- Installs
- 235
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/reason-machines/devtools-skills --skill subnautica-2-deep-synergy-multiplayer-mod- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads subnautica-2-deep-synergy-multiplayer-mod automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Subnautica 2 Deep Synergy Multiplayer Mod
Skill by ara.so — Devtools Skills collection.
Overview
The Deep Synergy Multiplayer Mod transforms Subnautica 2 from a solo survival experience into a synchronized cooperative game. Built on the BepInEx modding framework, it implements:
- Deterministic Session Synchronization (DSS): Conflict-resolved world state sharing across clients
- Adaptive Dynamic Scaling (ADS): Adjusts difficulty based on player count
- Decentralized Architecture: Peer-to-peer connectivity without central servers
- Cross-Platform Support: Windows, Linux (Steam Deck), macOS via WebRTC NAT punch-through
- Shared Inventory & Base Building: Merkle tree-based integrity verification
- Optional AI Integration: OpenAI/Claude API for dynamic narrative generation
Installation
Prerequisites
- Subnautica 2 installed via Steam or GOG
- BepInEx 6.0.x for Unity IL2CPP games
BepInEx Setup
# Download BepInEx 6.0.x from GitHub releases
# Extract to Subnautica 2 game directory
cd "C:\Program Files (x86)\Steam\steamapps\common\Subnautica 2"
# or on Linux/macOS:
cd ~/.steam/steam/steamapps/common/Subnautica\ 2
# Verify structure:
# Subnautica2/
# ├── BepInEx/
# │ ├── core/
# │ ├── plugins/
# │ └── config/
# ├── Subnautica2_Data/
# └── Subnautica2.exe
Mod Installation
# Extract Deep Synergy mod files to plugins directory
cd BepInEx/plugins/
# Place DeepSynergy.dll and dependencies here
# Verify installation
ls -la
# Should show:
# DeepSynergy.dll
# DeepSynergy.deps/
First Launch
# Launch game to generate default config
# On Windows:
Subnautica2.exe
# On Linux (Steam Deck):
./Subnautica2.x86_64
# Check BepInEx/LogOutput.log for successful load:
# [Info : BepInEx] Loading [Deep Synergy Multiplayer v1.0.0]
Configuration
Profile Configuration
Create BepInEx/config/synergy_profile.json:
{
"session_name": "Ocean Explorers",
"max_players": 4,
"difficulty_scale": "adaptive",
"resource_multiplier": 1.0,
"oxygen_consumption": 1.0,
"creature_spawn_divider": 1,
"enable_pvp": false,
"friendly_fire": false,
"shared_blueprints": true,
"ping_locations_shared": true,
"time_of_day_sync": "host",
"voice_chat_integration": "none",
"network": {
"port": 7777,
"max_latency_ms": 150,
"timeout_seconds": 30
},
"api_integration": {
"openai": {
"enabled": false,
"api_key_env": "OPENAI_API_KEY",
"role": "narrator"
},
"claude": {
"enabled": false,
"api_key_env": "ANTHROPIC_API_KEY",
"role": "lore_engine"
}
}
}
Key Configuration Fields
| Field | Type | Description |
|---|---|---|
max_players | int | 2-8 players per session |
difficulty_scale | string | "adaptive", "fixed", or "manual" |
resource_multiplier | float | Scales harvestable resources (0.5 = half, 2.0 = double) |
oxygen_consumption | float | Fraction of normal O2 drain (0.8 = 20% slower) |
creature_spawn_divider | int | Divides creature spawn count (2 = half as many) |
shared_blueprints | bool | Blueprint unlocks apply to all players |
time_of_day_sync | string | "host", "vote", or "independent" |
Console Commands
Access via BepInEx console (F1 by default):
Session Management
# Start hosting a session
/start_server
# Output: Server created: session code = 9B2A-4C7D-E8F1
# Join existing session
/join_session 9B2A-4C7D-E8F1
# Leave current session
/leave_session
# Show session status
/synergy_status
# Output:
# Connected peers: 3/4
# State sync: 100%
# Inventory hash: 0xFA342B1E
# Average latency: 45ms
Gameplay Adjustments
# Temporarily adjust difficulty scaling
/synergy_scale 1.5
# Increases creature count and resource scarcity by 50%
# Override world seed for deterministic generation
/seed_override 8251
# Force inventory resync (fixes desyncs)
/force_sync inventory
# Teleport to teammate
/tp_to PlayerName
AI Narration (if enabled)
# Trigger narrative generation
/api_narrate "exploring the underwater caves"
# Generate creature log entry
/api_creature_log "ghostray"
# Request contextual hint
/api_hint "cyclops upgrade"
Programming API (For Mod Developers)
Creating Custom Session Hooks
using BepInEx;
using DeepSynergy.Core;
using DeepSynergy.Network;
namespace MyCustomMod
{
[BepInPlugin("com.example.customsession", "Custom Session Hook", "1.0.0")]
[BepInDependency("com.deepsynergy.core", BepInDependency.DependencyFlags.HardDependency)]
public class CustomSessionPlugin : BaseUnityPlugin
{
private void Awake()
{
// Subscribe to session events
SessionManager.OnPlayerJoined += OnPlayerJoinedHandler;
SessionManager.OnItemPickup += OnItemPickupHandler;
SessionManager.OnBasePartPlaced += OnBasePartHandler;
}
private void OnPlayerJoinedHandler(PlayerSession player)
{
Logger.LogInfo($"Player {player.Name} joined from {player.IPAddress}");
// Send welcome message
NetworkMessenger.SendToPlayer(player.PeerId, new WelcomeMessage
{
Text = $"Welcome to the abyss, {player.Name}!",
Color = UnityEngine.Color.cyan
});
}
private void OnItemPickupHandler(ItemPickupEvent evt)
{
Logger.LogInfo($"{evt.PlayerName} picked up {evt.ItemType} at {evt.Position}");
// Sync to all peers with conflict resolution
StateSync.BroadcastItemState(evt.ItemGuid, evt.InventorySlot);
}
private void OnBasePartHandler(BasePartEvent evt)
{
// Validate placement before syncing
if (BaseValidator.IsValidPlacement(evt.PartType, evt.Position, evt.Rotation))
{
StateSync.BroadcastBasePart(evt);
}
else
{
Logger.LogWarning($"Invalid base part placement by {evt.PlayerName}");
NetworkMessenger.SendToPlayer(evt.PlayerId, new PlacementError
{
Reason = "Overlapping collision detected"
});
}
}
}
}
Custom Inventory Sync
using DeepSynergy.Inventory;
using System.Collections.Generic;
public class CustomInventoryManager
{
private InventoryMerkleTree _merkleTree;
public void SyncCustomContainer(string containerId, List<Item> items)
{
// Create merkle proof for container
var containerHash = _merkleTree.HashContainer(containerId, items);
// Broadcast to peers
var syncPacket = new ContainerSyncPacket
{
ContainerId = containerId,
MerkleRoot = containerHash,
Items = items.Select(i => new ItemState
{
Guid = i.Guid,
TechType = i.TechType,
StackSize = i.StackSize,
Metadata = i.SerializeMetadata()
}).ToList()
};
NetworkMessenger.Broadcast(syncPacket);
}
public bool VerifyContainerIntegrity(string containerId, byte[] receivedHash)
{
var localHash = _merkleTree.GetContainerHash(containerId);
return localHash.SequenceEqual(receivedHash);
}
}
AI Integration Example
using DeepSynergy.AI;
using System.Threading.Tasks;
public class NarrativeEngine
{
private OpenAIClient _openai;
private ClaudeClient _claude;
public async Task<string> GenerateExplorationNarrative(ExplorationEvent evt)
{
if (!ConfigManager.GetBool("api_integration.openai.enabled"))
return null;
var prompt = $@"The player has discovered a new biome: {evt.BiomeName}
Depth: {evt.Depth}m
Notable features: {string.Join(", ", evt.Features)}
Previous context: {evt.RecentHistory}
Generate a 2-sentence journal entry in the style of a marine biologist.";
var response = await _openai.GenerateCompletion(new OpenAIRequest
{
Model = "gpt-4",
Prompt = prompt,
MaxTokens = 100,
Temperature = 0.7,
ApiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")
});
return response.Choices[0].Text.Trim();
}
public async Task<CreatureDataLog> GenerateCreatureLog(string creatureTechType)
{
if (!ConfigManager.GetBool("api_integration.claude.enabled"))
return null;
var prompt = $@"Generate a fictional marine biology log for this creature:
Species Code: {creatureTechType}
Format: JSON with fields taxonomy, behavior, habitat, threat_level";
var response = await _claude.SendMessage(new ClaudeRequest
{
Model = "claude-3-opus-20240229",
Messages = new[] { new Message { Role = "user", Content = prompt } },
MaxTokens = 500,
ApiKey = Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY")
});
return JsonConvert.DeserializeObject<CreatureDataLog>(response.Content[0].Text);
}
}
Common Patterns
Hosting a Session
# 1. Configure profile
nano BepInEx/config/synergy_profile.json
# Set max_players, difficulty_scale, etc.
# 2. Launch game and open console (F1)
/start_server
# 3. Share session code with friends
# Session code appears in console: "9B2A-4C7D-E8F1"
# 4. Wait for players to join
/synergy_status
# Connected peers: 2/4
# 5. Start playing
# All inventory, base building, and progression syncs automatically
Joining a Session
# 1. Launch game and open console
# 2. Join with code from host
/join_session 9B2A-4C7D-E8F1
# 3. Wait for sync to complete
# Progress shown in console:
# Syncing world state... 45%
# Syncing inventory... 78%
# Syncing base structures... 100%
# Ready!
# 4. Verify connection
/synergy_status
Adjusting Difficulty Mid-Session
// Edit synergy_profile.json while game is running
{
"difficulty_scale": "adaptive",
"resource_multiplier": 0.8, // Reduce resources
"creature_spawn_divider": 1 // More creatures
}
# Hot-reload configuration
/reload_config
# Or use console override (temporary)
/synergy_scale 1.3
Enabling AI Narration
# Set environment variables
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
# Update config
{
"api_integration": {
"openai": {
"enabled": true,
"role": "narrator"
},
"claude": {
"enabled": true,
"role": "lore_engine"
}
}
}
# In-game usage
/api_narrate "discovered precursor artifact"
# Output: "The artifact pulses with alien energy. Its surface inscriptions
# suggest a warning—or perhaps an invitation to the depths below."
Troubleshooting
Session Connection Failed
Symptom: /join_session returns "Connection timeout"
Solutions:
# 1. Check firewall rules
sudo ufw allow 7777/tcp # Linux
# Windows: Add inbound rule for port 7777
# 2. Verify NAT punch-through
/network_debug
# Shows STUN server status and NAT type
# 3. Use direct IP (bypasses NAT)
/join_direct 192.168.1.100:7777
# 4. Check port configuration
# In synergy_profile.json:
"network": {
"port": 7777, // Try different port if blocked
"use_upnp": true // Enable automatic port forwarding
}
Inventory Desync
Symptom: Items appear in different slots for different players
Solutions:
# 1. Force inventory resync
/force_sync inventory
# 2. Check merkle tree integrity
/verify_merkle
# Output: "Hash mismatch detected in container 'PlayerInventory'"
# 3. Rebuild merkle tree
/rebuild_merkle
# 4. As last resort, disconnect and rejoin
/leave_session
/join_session <code>
Base Parts Not Syncing
Symptom: Placed base parts invisible to other players
Solutions:
# 1. Check sync status
/synergy_status
# Look for "State sync: <100%"
# 2. Force base structure resync
/force_sync base
# 3. Check logs for conflicts
# BepInEx/LogOutput.log:
# [Error] BasePart placement conflict at (100, -50, 200)
# 4. Verify collision detection
/base_debug
# Shows placement validation errors
# 5. Increase sync timeout
# In synergy_profile.json:
"network": {
"timeout_seconds": 60 // Increase for slow connections
}
High Latency Issues
Symptom: Actions appear delayed for other players
Solutions:
# 1. Check current latency
/synergy_status
# Average latency: 250ms (high)
# 2. Reduce max players
# In synergy_profile.json:
"max_players": 2 // Less bandwidth per player
# 3. Disable AI features
"api_integration": {
"openai": { "enabled": false },
"claude": { "enabled": false }
}
# 4. Lower sync frequency
"network": {
"sync_rate_hz": 10 // Default 20, lower = less bandwidth
}
Mod Not Loading
Symptom: No multiplayer menu appears in-game
Solutions:
# 1. Verify BepInEx installation
# Check for BepInEx/LogOutput.log file
# 2. Check plugin loading
cat BepInEx/LogOutput.log | grep "Deep Synergy"
# Should show: [Info] Loading [Deep Synergy Multiplayer v1.0.0]
# 3. Verify dependencies
ls BepInEx/plugins/
# Should contain:
# DeepSynergy.dll
# DeepSynergy.deps/
# 4. Check compatibility
# Ensure Subnautica 2 version matches mod requirements
# See mod documentation for supported game versions
# 5. Clear cache and reload
rm -rf BepInEx/cache/
# Restart game
API Integration Not Working
Symptom: /api_narrate returns "API disabled"
Solutions:
# 1. Verify environment variables
echo $OPENAI_API_KEY
echo $ANTHROPIC_API_KEY
# 2. Check config
cat BepInEx/config/synergy_profile.json
# Ensure "enabled": true for desired API
# 3. Test API connectivity
/api_test openai
# Output: "API test successful" or error message
# 4. Check rate limits
# If using free tier, may hit limits
# View logs: BepInEx/LogOutput.log
# [Warning] OpenAI rate limit exceeded
# 5. Verify API key format
# OpenAI: starts with "sk-"
# Anthropic: starts with "sk-ant-"
Advanced Configuration
Custom Network Settings
{
"network": {
"port": 7777,
"use_upnp": true,
"stun_servers": [
"stun.l.google.com:19302",
"stun.stunprotocol.org:3478"
],
"max_latency_ms": 150,
"timeout_seconds": 30,
"sync_rate_hz": 20,
"compression": "lz4",
"encryption": "aes256"
}
}
Difficulty Presets
{
"difficulty_presets": {
"casual": {
"resource_multiplier": 1.5,
"oxygen_consumption": 0.7,
"creature_spawn_divider": 2
},
"hardcore": {
"resource_multiplier": 0.5,
"oxygen_consumption": 1.3,
"creature_spawn_divider": 1
}
},
"active_preset": "casual"
}
Localization
{
"locale": "en-US",
"available_locales": [
"en-US", "zh-CN", "ja-JP", "de-DE",
"fr-FR", "pt-BR", "ru-RU", "es-LA", "ko-KR"
]
}
File Locations
- Config:
BepInEx/config/synergy_profile.json - Logs:
BepInEx/LogOutput.log - Cache:
BepInEx/cache/DeepSynergy/ - Session Data:
BepInEx/cache/DeepSynergy/sessions/ - Localizations:
BepInEx/plugins/DeepSynergy/localizations/
FAQ
What does the subnautica-2-deep-synergy-multiplayer-mod skill do?
BepInEx multiplayer mod for Subnautica 2 enabling co-op gameplay with synchronized sessions, shared bases, and dynamic scaling
How do I install subnautica-2-deep-synergy-multiplayer-mod?
Run npx skills add https://github.com/reason-machines/devtools-skills --skill subnautica-2-deep-synergy-multiplayer-mod in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/subnautica-2-deep-synergy-multiplayer-mod/ (personal) or .claude/skills/subnautica-2-deep-synergy-multiplayer-mod/ (project).
Which AI agents can use subnautica-2-deep-synergy-multiplayer-mod?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is subnautica-2-deep-synergy-multiplayer-mod safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains subnautica-2-deep-synergy-multiplayer-mod?
It is published by reason-machines in reason-machines/devtools-skills. It has 235 recorded installs.
More from reason-machines/devtools-skills
cc-switch-cli
reason-machines/devtools-skills
Cross-platform CLI tool for managing Claude Code, Codex, Gemini, OpenCode & OpenClaw providers, MCP servers, prompts, skills, and proxies.
wx-cli-wechat-local-data
reason-machines/devtools-skills
Open the skill to read its SKILL.md instructions.
chrome-devtools-mcp-automation
reason-machines/devtools-skills
Use Chrome DevTools MCP to control Chrome, debug web apps, analyze performance, and automate browser tasks via MCP tools
officecli-office-automation
reason-machines/devtools-skills
Use OfficeCLI to create, read, and edit Word, Excel, and PowerPoint files from the command line with AI-friendly commands.
cli-anything-agent-native-software
reason-machines/devtools-skills
Generate and use command-line interfaces that make any software controllable by AI agents with structured JSON output
autocli-web-scraping
reason-machines/devtools-skills
Open the skill to read its SKILL.md instructions.
Popular other skills
hyperframes-cli
heygen-com/hyperframes
The HyperFrames CLI by job - scaffold, check, look at frames, edit the timeline, preview, render locally or in the cloud, publish, project history - plus reading its JSON and recovering from build or render failures.
triage
mattpocock/skills
Move issues and external PRs through a state machine of triage roles, categorise, verify, grill if needed, and write agent-ready briefs.
ask-matt
mattpocock/skills
Ask which skill or flow fits your situation. A router over the skills in this repo.
to-questionnaire
mattpocock/skills
Turn a decision you can't fully answer into a questionnaire for someone else to fill in.
loop-me
mattpocock/skills
Grill me about specs for the workflows I want to build, within this workspace.