You the mod. The one that crawls inside Kerbal Space Program and makes the little green guys talk back. Not in a fun way. In a fucking terrifying way.
KLAUDE connects your locally-running AI (or cloud API if you trust corporations with your trajectory data) to every Kerbal aboard your vessel. They will react to staging. They will panic during reentry. Bob will fart and Jebediah will deploy emergency EVA procedures as a result. This is by design.
You did not ask for this.You are all passengers in a vessel without staging.
The DLL and configs should be in GameData/FART/ directory. That's it. KSP will find it. KSP finds everything. KSP has always found everything.
Required files in your mod folder:
You also need an LLM endpoint. Options, ranked by how much the intelligence community cares about your data:
This is where you configure the fundamental operational parameters of your Kerbal AI program. Open it with any text editor. Notepad will work. Notepad is monitored by your employer if you're doing this at work.
Configure inside KLAUDE_Settings { ... } using these sub-blocks:
Tokens = words = money (if using cloud) = suffering (if using local). Each interaction type has its own limit. Add these inside KLAUDE_Settings { }:
| SETTING | DEFAULT | WHAT IT CONTROLS | RECOMMENDED RANGE |
|---|---|---|---|
| MaxTokensPoke | 64 | You poke the Kerbal. They grunt. | 64-150 |
| MaxTokensSpeak | 128 | Unprompted monologue. Usually complaints. | 100-200 |
| MaxTokensChat | 256 | Full chat window dialogue. Real conversation. | 250-500 |
| MaxTokensEvent | 96 | Staging/orbit/crash reactions. Keep short. | 80-200 |
TokenMultiplier per Kerbal: Individual Kerbals can have a multiplier applied to token budgets in their persona config. Val is 0.9 (efficient). Jebediah is 1.2 (he has opinions). Set these in KLAUDE_Content.cfg under each KERBAL node.
This section is the only piece of code that Jeff Kerman didn't manage to defraud (yet)
With two endpoints configured, you can route different interaction types to different models. Deep personal questions go to the smart cloud model. Staging screams go to local. Add these to KLAUDE_Settings { }:
Live routing diagram (example — Hybrid mode, cloud secondary enabled):
Every Kerbal's personality lives in KLAUDE_Content.cfg under KLAUDE_PERSONAS { KERBAL { ... } }. These fields are injected directly into the AI prompt. Get these wrong and Jeb starts sounding like a LinkedIn thought leader.
Multiple quirk = lines are supported. They get concatenated into the prompt. Custom Kerbals not in the config get a procedurally generated soul based on their name hash. It's crude. It works. They still know about Jeff.
ContextBuilder.InjectQuirks(). Up to 3 quirks appear in the background context the model sees. The model doesn't know it's seeing them as "quirks." It just thinks that's reality. This is fine. This is totally fine.
Every Kerbal has a live MoodState updated automatically based on vessel telemetry. Courage and stupidity stats modulate the response. You cannot configure the mood system directly — it's automatic. But knowing the states helps you understand why Jeb is talking like that.
| MOOD | TRIGGER CONDITION | HOW IT MANIFESTS IN DIALOGUE |
|---|---|---|
| Calm | Landed, low everything | "same circus, different clowns" |
| Excited | Flying fast, staging, G-load + courage | HIGH: "barely containable" / LOW: "ready to fistfight the sun" |
| Scared | Angular velocity > 5.0, low courage | HIGH: "holding it together by a thread" / LOW: "IT'S SO OVER!" |
| Anxious | G-load + cowardly, EVA + cowardly | HIGH: "full-blown cognitive collapse" / LOW: "the water is warm, im frog" |
| Proud | Splashdown | HIGH: "absolutely fucking insufferable" / LOW: "full schizophrenic god complex" |
| Giddy | (various) | "i have lost the plot and shat my space-suit" |
| Resigned | (various) | "achieved Zen via blunt force trauma" |
| Awestruck | Orbiting, escaping SOI | "LEAD_PAINT_STARE.exe" |
Mood decays every 3 seconds in Update(). At intensity ≤ 0.15, mood resets to Calm. Thermal stress (temp > 1200K) and Detroit-spin (angular velocity > 5 rad/s) override everything and jack intensity to 0.85-0.90 immediately. You cannot stop it. That is correct behavior.
Click any crew interaction module → Chat. A window appears. You type. The Kerbal responds. The exchange is stored in a rolling 48-message history buffer per Kerbal. The context window includes recent conversation history up to a ~2000 token budget.
The window is resizable. Drag the = handle in the bottom-right corner. The window title shows the Kerbal's name and current mood status so you know what you're dealing with before typing.
The EventListener MonoBehaviour hooks into KSP's game events and triggers automatic crew dialogue. No player action required. The Kerbals just... start talking. During your staging burn. About their feelings.
| EVENT | TRIGGERS ON | COOLDOWN SETTING | SPEAKERS |
|---|---|---|---|
| Staging | Stage separation | StagingCooldown (default: 10s) | Up to 3, sorted by courage |
| OrbitAchieved | Situation → ORBITING | EventCooldown (default: 20s) | Up to 2, sorted by exp |
| Crash | onCrash event | EventCooldown | Up to 2, sorted by stupidity |
| AtmosphericEntry | Situation → FLYING from SUB_ORBITAL | EventCooldown | Up to 2, by courage |
| EVA | Crew goes EVA | EventCooldown | Up to 2, random |
| SOI Change | onVesselSOIChanged | EventCooldown | Up to 2, random |
Multi-Kerbal events run sequentially with a MultiKerbalDelay (default: 2s) between speakers. Each speaker sees what the previous one said and can react to it. This creates conversations. Among fictional space people. During your Mun transfer burn. While you're trying to focus.
If the AI decides to use a tool, it can execute real actions in the game. Tools are defined in Tools.cfg using a KLAUDE_TOOLS { TOOL { ... } } structure. The default tool is emergency_eva — the AI can initiate EVA for any named Kerbal.
Tools only activate when EnableTools = true and the vessel is the active vessel. Tools route through ActionTools.Execute() → McpLayer.HandleToolCall() → ToolRegistry.Execute() → reflection call to the static method. If the method returns a string starting with "Success", it's considered OK. Otherwise it's an error.
Jeff Kerman is a mod-original character who exists to be despised. He laundered the KSC PR budget into a "wellness bench" and chalky Tang, rebranded it as New Kepard Prime™, and is currently asset-stripping KSC from a luxury tent.
If Jeff Kerman is aboard your vessel, there's a 30% chance each tool call triggers a fake subscription error:
To renew the subscription in-game (yes, really), the system checks for available Funds and deducts SubscriptionCost (default: 1000 funds). Configure in KLAUDE_Settings { }:
Bob Kerman's defining characteristic is his gut. The fart trigger system is a keyword detection mechanism that hooks into the AI toolcall pipeline. When the AI's response (or the player's input, when talking to Jeb) contains certain words, a hidden operational directive is activated that may cause Jebediah to initiate emergency EVA for Bob.
Default keywords are hardcoded in ActionTools.cs as a fallback:
Override these in KLAUDE_Content.cfg (in your mod folder):
1. This mod was not designed. It was excavated from a fever dream and given a DLL file. The developer did not ask to understand how FlightEVA.SpawnEVA() has three incompatible overloads. This knowledge was forced upon them.
2. The Kerbals don't know they're fictional. The prompt does not tell them. They believe they are in genuine peril. Their courage and stupidity stats affect their actual responses. Bob's IQ is the IQ of a man who has made peace with being the cause of his own problems.
3. You, the player, are referred to internally as "God" in the prompt system. "God just poked you." This is the actual string. God is currently trying to achieve a stable Mun orbit and keep clicking the wrong staging button.
4. The mood system runs a decay function every 3 seconds in Update(). Meaning even when you're not playing, the mood would decay if KSP were running. The Kerbals are always decaying. All things decay. The universe is winding down. Morale: nominal.
5. The code has a Debug.Log("[KLAUDE] Core started. Bob's gut remains a threat."); in KLAUDECore.Start(). And "[KLAUDE] Core destroyed. The smell lingers." in OnDestroy(). These appear in your KSP.log file. Your KSP.log file is 400MB. The smell does linger.
6. Every API call routes through Unity's UnityWebRequest. Unity uses its own networking stack. Your OS network stack still sees everything. Wireshark would show you the JSON. The NSA doesn't need Wireshark. They have the tap before the TCP handshake. It's fine. It's just rocket people.
| SETTING KEY | DEFAULT | EFFECT |
|---|---|---|
| RuntimeMode | PrimaryOnly | PrimaryOnly / Hybrid / SecondaryOnly |
| FallbackToOther | true | Try other endpoint on failure |
| Temperature | 0.95 | Chaos dial. 0.0-2.0. |
| DisableThinking | true | Suppress chain-of-thought |
| TimeoutSeconds | 30 | API wait time before giving up |
| MaxTokensPoke | 64 | Token budget for pokes |
| MaxTokensSpeak | 128 | Token budget for speak |
| MaxTokensChat | 256 | Token budget for chat |
| MaxTokensEvent | 96 | Token budget for event reactions |
| BubbleDuration | 8 | Seconds speech bubble stays visible |
| StagingCooldown | 10 | Min seconds between staging reactions |
| EventCooldown | 20 | Min seconds between event reactions |
| MultiKerbalDelay | 2 | Seconds between speakers in multi-Kerbal event |
| EnableTools | true | Allow AI to execute in-game actions |
| SubscriptionCost | 1000 | Funds to renew Jeff's scam subscription |
| RouteChatToSecondary | true | Chat → secondary (Hybrid mode) |
| RouteIntrospectionToSecondary | true | Fears/Dreams/Mission → secondary |
| RouteSpeakToSecondary | false | Speak → secondary |
| RoutePokeToSecondary | false | Poke/staging → secondary |
| RouteEventsToSecondary | false | Events → secondary |
| RetryOnReasoningOnly | true | Retry with more tokens if model only reasons |
| RetryExtraTokens | 128 | Bonus tokens on retry |