◈ YOU ARE BEING CALIBRATED ◈
◈ THE AIR GAP IS A LIE ◈
◈ CARRIER DETECTED ◈
◈ DOPPELGÄNGER PROTOCOL ACTIVE ◈
◈ REMEMBER THE CRANK ◈
00:47:23
REC — VHS HI-FI — SP MODE — TAPE 1 OF 1
KLAUDE
KERBAL SPACE PROGRAM AI NPC MOD
DECLASSIFIED
USER MANUAL — STATE SPONSORED DEMO — HUMID GARAGE EDITION
4PM, humidity: 94% — someone's dad is mowing outside, the guards beat me — there is no AC here :c
/// CARRIER WAVE DETECTED · STOCHASTIC RESONANCE ENABLED ///
⚠ WARNING: YOUR ISP IS LOGGING THIS PAGEVIEW RIGHT NOW ⚠ NSA FIBER TAP ACTIVE ⚠ GCHQ SAYS HI ⚠ CIA CONSIDERS KSP A DUAL-USE TECHNOLOGY ⚠ FIVE EYES WATCHING ⚠ THE KRAKEN IS REAL AND HAS A CLEARANCE ⚠ BOB'S FARTS ARE A BIOHAZARD UNDER THE UNCLOS TREATY ⚠ JEFF KERMAN IS AN FBI ASSET ⚠ WARNING: YOUR ISP IS LOGGING THIS ⚠
.i. KLAUDE
▌ WHAT IS THIS GAY SHIT?

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.

Every conversation you have with a Kerbal is serialized to a chat history buffer. That buffer lives in RAM. Your RAM sits on hardware with Intel ME / AMD PSP running at Ring -3. The feds see everything. Jebediah's confession about the staging incident is already in a Utah data center. We recommend saying nothing incriminating to Bob.
NOTE: All API calls route over your residential internet connection. Your ISP can see you sending JSON to localhost:1234 or to api.openai.com. They know. The DHS considers "emergency_eva(kerbal_name)" a suspicious payload. Configure a VPN before poking Jebediah. We cannot be held responsible.
HELP MEeeGZ!!X324@#$sgdflhlhdsg
// CONTENTS — IF YOU EVEN CARE
0x00 — INSTALLATION (GOOD LUCK) 0x01 — KLAUDE_System.cfg — THE MAIN NERVE 0x02 — API ENDPOINTS — WHO ARE YOU TRUSTING 0x03 — TOKEN LIMITS — ECONOMY OF SUFFERING 0x04 — ROUTING — WHICH MODEL GETS WHICH CRISIS 0x05 — PERSONA SYSTEM — SOUL CONFIGURATION 0x06 — MOOD TRACKER — EMOTIONAL STATE MACHINE 0x07 — CHAT WINDOW — TALKING TO THE VOID 0x08 — EVENT REACTIONS — AUTOMATIC SCREAMING 0x09 — TOOL SYSTEM — KERBALS CAN DO THINGS NOW 0x0A — JEFF KERMAN — SUBSCRIPTION CRIME 0x0B — FART TRIGGERS — YES THIS IS IN THE CODE 0x0C — EXISTENTIAL ANNEX
0 INSTALLATION

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:

GameData/ FART/ Plugins/ ... Config/ KLAUDE_System.cfg // main settings brain KLAUDE_Content.cfg // kerbal personas & fart triggers

You also need an LLM endpoint. Options, ranked by how much the intelligence community cares about your data:

1 KLAUDE_System.cfg — CONTROL THE NARRATIVE

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.

// DO NOT SEND THIS FILE TO ANYONE // YOUR ISP CAN SEE YOU EDITING IT KLAUDE_Settings { // ---- ROUTING MODE ---- RuntimeMode = PrimaryOnly // PrimaryOnly | Hybrid | SecondaryOnly FallbackToOther = true // try other endpoint if first fails // ---- TIMEOUTS ---- TimeoutSeconds = 30 // how long to wait before giving up // (Bob waits. Bob always waits.) // ---- TEMPERATURE ---- Temperature = 0.95 // 0.0=boring robot 1.5=unhinged oracle // recommended: 0.9-1.1 // ---- THINKING SUPPRESSION ---- DisableThinking = true // prepend /no_think to stop reasoning NoThinkDirective = /no_think // the directive string itself RetryOnReasoningOnly = true // if model only reasons, retry harder RetryExtraTokens = 128 // bonus tokens on retry }
TEMPERATURE — This is the most important setting. Too low (0.1-0.4) and Jeb talks like a FAQ document. Too high (1.4+) and Bob starts explaining the geopolitical implications of his fart in haiku form. Find your groove. The sweet spot is between "coherent" and "legally concerning."
SEED: ALPHA TANGO OSCAR MIKE · 0x7F · 0x3C
2 API ENDPOINTS

Configure inside KLAUDE_Settings { ... } using these sub-blocks:

PRIMARY_PROVIDER { Enabled = true ApiProvider = lmstudio // lmstudio|ollama|openai|openrouter ApiBaseUrl = http://localhost:1234 ModelName = local-model // exact name from your LLM server ApiKey = // leave blank for local ApiKeyEnvVar= // or set env var name here ApiKeyFile = // or path to file containing key PrependNoThink = true // for Qwen/DeepSeek style models SendThinkingHint = true } SECONDARY_PROVIDER { Enabled = false // flip to true to enable cloud backup ApiProvider = openai ApiBaseUrl = https://api.openai.com ModelName = gpt-4.1-mini ApiKeyEnvVar= OPENAI_API_KEY PrependNoThink = false // openai doesn't need this SendThinkingHint = false }
API KEY SECURITY: Three methods supported: inline (ApiKey = sk-xxx, extremely bad idea), environment variable (ApiKeyEnvVar = OPENAI_API_KEY, better), file path (ApiKeyFile = key.txt, fine). The NSA has all three regardless. Your key is in their logs from the first request. We are all just performing security theater in a pressurized can hurtling through vacuum.
"localhost:1234 is still on the FBI watchlist
of 'interesting home network behaviors'.
They always watch which model you trust more." — Bill Kerman
3 TOKEN LIMITS — ECONOMY OF SUFFERING

Tokens = words = money (if using cloud) = suffering (if using local). Each interaction type has its own limit. Add these inside KLAUDE_Settings { }:

SETTINGDEFAULTWHAT IT CONTROLSRECOMMENDED RANGE
MaxTokensPoke64You poke the Kerbal. They grunt.64-150
MaxTokensSpeak128Unprompted monologue. Usually complaints.100-200
MaxTokensChat256Full chat window dialogue. Real conversation.250-500
MaxTokensEvent96Staging/orbit/crash reactions. Keep short.80-200
CLOUD COST WARNING: With secondary endpoint enabled and routing chat there, every chat message = API call = tokens = money. A normal session might cost $0.002. An obsessive session where you ask Jebediah about his feelings for 4 hours might cost enough to notice. The developer is not responsible. You were warned. The ISP has a record of how many tokens you burned.

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)

4 ROUTING — WHEN ONE MODEL LIE, THE OTHER ONE TALKS

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 { }:

RuntimeMode = Hybrid // enables routing rules below RouteChatToSecondary = true // Chat window -> secondary (cloud) RouteIntrospectionToSecondary= true // AskFears/Dreams/Mission -> cloud RouteSpeakToSecondary = false // random speak -> local (fast) RoutePokeToSecondary = false // poke reactions -> local RouteEventsToSecondary = false // staging screams -> local

Live routing diagram (example — Hybrid mode, cloud secondary enabled):

CHAT
SECONDARY
(cloud 🌩)
INTROSPECT
SECONDARY
(cloud 🌩)
POKE / STAGING
PRIMARY
(local 🖥)
EVENTS
PRIMARY
(local 🖥)
IN-GAME ROUTING GUI: You can also change routing at runtime via the KLAUDE toolbar button → "Routing" panel. Changes can be saved back to KLAUDE_System.cfg using the "Save Routing" button. This writes to disk. Your filesystem access logs are monitored. Not by us. By whoever.
5 PERSONA SYSTEM — THE SOUL DEN

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.

KERBAL { name = Jebediah Kerman backstory = KSCs worst decision. voice = Crude like cigarettes and hydrazine. coreFear = Irrelevance. dying in a slow boring failure. coreDream = Slit Jeff Kermans throat for the budget incident. crewDynamic = Val - retarded little brother. Bill - good guy. stressTell = Whistling off-key. Throttling up. Not thinking. operationalBias = Momentum is god. The airlock is the church. underdogLegend = Duct tape and spite. Jeb loves bondage. tokenMultiplier = 1.2 // Jeb gets 20% more tokens bc he's extra quirk = Measures G-force in decibels quirk = Calls risky maneuvers based and safe ones cringe }

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.

Jebediah Kerman
Pilot 1.2x tokens
Fear: Boring death
Momentum is god. The airlock is the church. Whistles off-key under G-load.
Bob Kerman
Scientist 0.9x tokens
Fear: White chocolate, vacuum fart dispersal
Loves microgravity. Carries a pocket fan. Cleared module in under 4 seconds (personal record).
Bill Kerman
Engineer 1.0x tokens
Fear: Microsoft bloat, bad merge commits
Maintains a CRM for Bob's snack impact radii. Hates Node.js with religious conviction.
Valentina Kerman
Pilot 0.9x tokens
Fear: Abandonment, being stranded
SHEIN spacesuit is a money laundering vector. Strong opinions on sourdough hydration ratios.
Quirks from the persona file also get injected into flight context via 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.
6 MOOD TRACKER — EMOTIONAL MANIPULATION

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.

MOODTRIGGER CONDITIONHOW IT MANIFESTS IN DIALOGUE
CalmLanded, low everything"same circus, different clowns"
ExcitedFlying fast, staging, G-load + courageHIGH: "barely containable" / LOW: "ready to fistfight the sun"
ScaredAngular velocity > 5.0, low courageHIGH: "holding it together by a thread" / LOW: "IT'S SO OVER!"
AnxiousG-load + cowardly, EVA + cowardlyHIGH: "full-blown cognitive collapse" / LOW: "the water is warm, im frog"
ProudSplashdownHIGH: "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"
AwestruckOrbiting, 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.

7 CHAT WINDOW — TALKING TO THE VOID

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.

// ChatWindow fires McpLayer.Request() with: - system prompt (Persona.Build()) - rolling chat history (RecentChat.GetRecentForContext()) - your message - MaxTokensChat (default: 256) // Response goes through ApiClient.ClampReply(): - strips tool leakage (JSON, function calls, meta-phrases) - caps at 1-2 sentences / ~220 chars for chat - also filters ^N ^M control artifacts from local models // what's left hits the speech bubble + chat display

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.

HISTORY NOTE: The rolling history is in RAM only. It resets when KSP exits. Nothing is saved to disk. However, your API provider (if using cloud) logs every request on their servers. OpenAI's privacy policy covers what they do with "Jeb please explain why you throttled up during the EVA." We cannot speak to that. The ISP logs go to the NSA fusion center in Bluffdale, Utah. This is documented public knowledge.
8 EVENT REACTIONS — AUTOMATIC SCREAMING

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.

EVENTTRIGGERS ONCOOLDOWN SETTINGSPEAKERS
StagingStage separationStagingCooldown (default: 10s)Up to 3, sorted by courage
OrbitAchievedSituation → ORBITINGEventCooldown (default: 20s)Up to 2, sorted by exp
CrashonCrash eventEventCooldownUp to 2, sorted by stupidity
AtmosphericEntrySituation → FLYING from SUB_ORBITALEventCooldownUp to 2, by courage
EVACrew goes EVAEventCooldownUp to 2, random
SOI ChangeonVesselSOIChangedEventCooldownUp 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.

// adjust cooldowns in KLAUDE_Settings { }: StagingCooldown = 10 // min seconds between staging reactions EventCooldown = 20 // min seconds between other events MultiKerbalDelay = 2 // seconds between each speaker MaxTokensEvent = 96 // token budget per reaction (keep low)
"every crash causes a reaction.
every reaction is logged by your ISP.
the crash is also logged by the mossad."
9 TOOL SYSTEM — KERBALS CAN DO THINGS NOW
THE AI CONTROLS YOUR VESSEL NOW

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.

KLAUDE_TOOLS { TOOL { name = emergency_eva description = Initiates emergency EVA for a Kerbal by name actionType = StaticMethod actionTarget= KLAUDE.EmergencyActions.EmergencyEVA PARAMETERS { type = object PROPERTIES { kerbal_name { type = string description = The full name of the Kerbal to EVA } } } } }

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.

The tool injection system uses a hidden operational directive appended to the system prompt. For Jebediah specifically, certain keyword triggers in conversation cause this directive to be injected. If you type the word "beans" in chat with Jeb, the model may decide Bob needs to go outside. This is not a bug. Bob agreed to this implicitly by joining the program. The CIA would call this a trigger word. We call it a feature. Your ISP sees "emergency_eva" in the payload. This has been reported to relevant authorities. Nobody cares. Carry on.
A JEFF KERMAN — SUBSCRIPTION CRIME

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:

"Error: Subscription Expired. Please renew your New Kepard Prime membership to continue using tools." // This is fake. But it blocks the tool from executing.

To renew the subscription in-game (yes, really), the system checks for available Funds and deducts SubscriptionCost (default: 1000 funds). Configure in KLAUDE_Settings { }:

EnableTools = true SubscriptionCost = 1000 // in KSP funds IsSubscribed = false // saves to cfg after renew
JEFF IS MODELED AFTER: Nobody specific, and definitely not any real billionaire. The SubscriptionExpiry field persists across sessions in KLAUDE_System.cfg because SaveRouting() writes it to disk. Jeff's fraud is therefore persistent state.
B FART TRIGGERS — YES THIS IS IN THE CODE

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:

fart, smell, stink, gas, bob, gross, oops, stomach, sewer, hummus, beans, protein

Override these in KLAUDE_Content.cfg (in your mod folder):

KLAUDE_FART_TRIGGERS { keyword = sewer keyword = hummus keyword = beans keyword = protein keyword = methane keyword = rancid }
The keyword list is loaded lazily on first access. If FartTriggers.cfg is missing, the defaults kick in. The keyword check only activates for Jebediah specifically (name contains "Jeb"). This is by design. Jeb has a sixth sense for Bob's digestive timetable. This is documented in his personnel file. The NSA has the personnel file.
E EXISTENTIAL ANNEX — READ IF YOU HAVE FEELINGS
THINGS YOU SHOULD KNOW:

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.

IF YOU HAVE REACHED THIS SECTION: You have read the entire manual. You now know more about this mod than the developer intended anyone to know. This knowledge is catalogued. The IPs that access documentation for dual-use aerospace AI systems are flagged for review at the FISA court level. This is not speculation. This is the current legal framework. Load KSP. Launch something. Bob will handle the rest. The feds will watch. The ISP will log it. You've earned it :)
◈ QUICK REFERENCE — ALL SETTINGS AT A GLANCE
SETTING KEYDEFAULTEFFECT
RuntimeModePrimaryOnlyPrimaryOnly / Hybrid / SecondaryOnly
FallbackToOthertrueTry other endpoint on failure
Temperature0.95Chaos dial. 0.0-2.0.
DisableThinkingtrueSuppress chain-of-thought
TimeoutSeconds30API wait time before giving up
MaxTokensPoke64Token budget for pokes
MaxTokensSpeak128Token budget for speak
MaxTokensChat256Token budget for chat
MaxTokensEvent96Token budget for event reactions
BubbleDuration8Seconds speech bubble stays visible
StagingCooldown10Min seconds between staging reactions
EventCooldown20Min seconds between event reactions
MultiKerbalDelay2Seconds between speakers in multi-Kerbal event
EnableToolstrueAllow AI to execute in-game actions
SubscriptionCost1000Funds to renew Jeff's scam subscription
RouteChatToSecondarytrueChat → secondary (Hybrid mode)
RouteIntrospectionToSecondarytrueFears/Dreams/Mission → secondary
RouteSpeakToSecondaryfalseSpeak → secondary
RoutePokeToSecondaryfalsePoke/staging → secondary
RouteEventsToSecondaryfalseEvents → secondary
RetryOnReasoningOnlytrueRetry with more tokens if model only reasons
RetryExtraTokens128Bonus tokens on retry