Modding Documentation for Sexting my GF

Hey there, future mod creator! 💕 Welcome to the complete modding guide for Sexting my GF! This documentation has everything you need to bring your stories to life.

What you can create

  • 💬 Custom conversation stories with branching narratives
  • 👥 New characters with unique personalities and backstories
  • 📸 Interactive image sharing just like the base game
  • ⚡ Complex choice systems
  • 📖 Side stories that interrupt main conversations
  • 🎭 Whatever your (perverted) imagination can dream up! hehehe

🔧 Work in progress

TheGram, InjectorOS, and Skipr will get modding support later.

Installing Mods

Want to try out some mods before creating your own? Open the Mods app on the phone and choose your method:

🌐 Method 1: Download from URL (Recommended)

  1. Get a .zip file URL from Discord or other sources
  2. Click the green Install button in the Mods app
  3. Paste the URL and click "Download Mod"
  4. Once downloaded, click "Load" and you're ready!
Step-by-step visual guide showing how to install a mod using URL method

👆 Visual guide showing the installation process

Note: URLs must point to .zip files. The game includes security protection against malicious files.

📁 Method 2: Drag & Drop

  1. Click the blue folder button to open the Mods folder
  2. Drag your mod folder into the Mods folder
  3. Refresh and load the mod - no installation needed!

⚠️ Good to Know

Mods completely replace the base game - you're playing an entirely different experience with separate saves. Only install from trusted authors. To return to the base game, restart completely.

Okay okay, enough playing around! Time to start working on your own spicy stories! ✨

Requirements

Before you start modding, you'll need:

  • Basic text editing - VS Code or Cursor recommended for the best experience (And get the Ink extension for VS Code)
  • Ink language knowledge - Learn from the resources below
  • Image editing software - For creating character images and scenes
  • Twin Problems example mod - Comes with the game and is highly recommended to study!

Quick Setup

Follow these steps to create your first mod:

1

Study Twin Problems

The game comes with a complete example mod called "Twin Problems" - study it first! It shows all features in action and is the perfect starting point.

2

Set up your mod structure

The easiest way is to copy the entire Twin Problems folder and rename it to your mod name. This gives you the perfect starting structure with all the required folders (Characters, Conversations, Images) and example files you can modify.

3

Configure your mod

Create or edit the mod.json file with your mod information. If you copied Twin Problems, just update the existing mod.json with your details. If starting from scratch, create a new mod.json following the format below.

4

Test & Validate

Load your mod in-game and use the validation button to check for errors. Use the reload button to quickly test changes without restarting the game. Start small and build up your story gradually!

Folder Structure

Every mod must follow this exact folder structure. You'll need to create these folders manually (or copy the Twin Problems folder and rename it to your mod name):

Your Mod Name/
├── mod.json                    // Mod configuration
├── Characters/                 // Character definitions
│   ├── character1.json
│   └── character2.json
├── Conversations/              // Story conversations
│   ├── My Cool Story/          // Name folders whatever you want!
│   │   ├── story1-1.ink
│   │   ├── story1-1-settings.json
│   │   └── Side Stories/       // Optional side stories
│   │       ├── sidestory1.ink
│   │       └── sidestory1-settings.json
│   └── The Ending/             // Full creative freedom!
└── Images/                     // All images for your mod
    ├── character1.png
    ├── scene1.png
    └── header.png              // Mod banner image
Creative Freedom: You have complete freedom to name your conversation folders however you want! No need to stick to "Chapter1", "Chapter2" - use whatever makes sense for your story organization.
🚨 Critical File Format Warning: ONLY conversation files use the .ink format! Character files (.json) and settings files (.json) must stay as JSON. If you accidentally save them as .ink files, your mod will break!
• ✅ Conversations: .ink format
• ✅ Characters: .json format
• ✅ Settings: .json format

Mod Configuration

The mod.json file contains essential information about your mod:

{
    "modId": "your-unique-mod-id",
    "modName": "Your Mod Display Name", 
    "version": "1.0.0",
    "author": "Your Name",
    "description": "A brief description of your mod story",
    "headerImage": "header.png"
}

Parameters (all required)

Parameter Description
modId Unique identifier for your mod (lowercase, no spaces)
modName Display name shown in the game
version Your mod version (use semantic versioning)
author Your name or handle
description Brief description of your mod
headerImage Banner image filename (1600x400 recommended) - Optional
⚠️ Critical Warning: Once you've shared your mod and players have save games, never change the modId! Changing it will break all existing save games that use your mod.

Characters

Characters are defined in JSON files within the Characters folder. Each character needs their own file:

{
    "isMainCharacter": false,
    "contactID": "character_id",
    "contactName": "Character Name",
    "contactNickname": "Nickname", 
    "contactNicknameShort": "Nick",
    "profilePicturePath": "character.png"
}

Character properties

Property Description Example
isMainCharacter Set to true for the player character (only one allowed) false
contactID Unique ID used in conversations (don't change after creation) "sarah"
contactName Full name of the character "Sarah Johnson"
contactNickname How they appear in conversations "Sarah"
contactNicknameShort Short version for UI elements "Sarah"
profilePicturePath Image filename (832x832 recommended) "sarah.png"

Conversations

Conversations are the heart of your mod. They're written in the Ink language and control the story flow. The Twin Problems mod that comes with the game is your best teacher here - seriously, check it out!

🚨 File Format Reminder: Only conversation files (.ink) use the Ink language! Character files and settings files must remain as .json files. This is a common mistake that breaks mods!

Basic conversation structure

EXTERNAL GetStoryFlag(flagName)
EXTERNAL SetStoryFlag(flagName)  
EXTERNAL RemoveStoryFlag(flagName)

-> start

== start
Hey there! How's your day going?

* Good, thanks for asking!
    -> good_response
* Pretty terrible honestly
    -> bad_response

== good_response
That's great to hear!
-> END

== bad_response  
Oh no, what happened?
-> END

Ink Language Basics

Here are the essential Ink concepts you need to know:

Knots

Sections of your story marked with == knot_name

== my_story_section
This is a knot!

Choices

Player options marked with *

* Choice 1
* Choice 2

Diverts

Navigate between knots with -> knot_name

-> next_section

End

Finish conversations with -> END

-> END

Choice System

The game supports several special choice types:

🔴 Important Choices

Add an exclamation mark to highlight those *really* important decisions (you know the ones 😉):

* !This is a very important choice
    -> important_consequence

Shows a red exclamation mark next to the choice in-game.

👤 Action Choices

Choices that don't appear as messages (wrapped in %):

* %Don't send the photo%
    -> no_photo_sent

Perfect for internal actions or decisions.

💬 Suppressed Choices

When the choice text differs from what's actually sent (minimum 4 characters between <>):

* <Surely> Yes I know for sure
    -> confident_response

Player sees "Surely" but sends "Yes I know for sure".

💖 Route Choices

Add route indicators to important choices to show players what type of content they're choosing. This only works with important choices (those with exclamation marks !):

* !(love) This choice is for the love route
    -> romantic_path
* !(ntr) This choice is netorare focused  
    -> ntr_path
* !(ntrs) This choice is netorase focused
    -> ntrs_path

Route indicators:

  • (love) - Love route focused - shows 💘 heart emoji
  • (ntr) - Netorare focused - shows 😈 smiling purple devil emoji
  • (ntrs) - Netorase focused - shows 😘 kissing emoji

You can also combine routes:

* !(ntrs,love) This choice is both NTRS and Love focused
    -> combined_path

Route choices work with suppressed choices too!

* !(ntrs, love) <HELP ME> Heyy, just chilling at uni. You okay?
    -> logan_greeting
* !(ntr) What do you want now, Logan?
    -> logan_greeting
Visual example showing route choice emojis in the game interface

👆 Visual example showing how route choices appear in-game

Note: Route choices help players understand what type of content they're selecting, making navigation through different story paths clearer. They work perfectly with suppressed choices too!

Functions

Functions are special commands you can use anywhere in your conversations to make the game do things that ink doesn't support natively.

Important: Functions must be declared at the top of your .ink file with EXTERNAL before you can use them!
⚡ Timing Warning: Functions execute instantly when a knot loads, regardless of any text or <wait> commands before them! So ShowCustomTransition might fire sooner than you expect. Structure your knots accordingly!

Available functions

Flag functions

EXTERNAL GetStoryFlag(flagName)
EXTERNAL SetStoryFlag(flagName)
EXTERNAL RemoveStoryFlag(flagName)

Manage player choices and story state

Transition function

EXTERNAL ShowCustomTransition(title, subtitle)

Create chapter-like transitions, can also be used to create time jumps.
For example ShowCustomTransition("Time passed...", "Two weeks later").

Example usage

EXTERNAL GetStoryFlag(flagName)
EXTERNAL SetStoryFlag(flagName)
EXTERNAL ShowCustomTransition(title, subtitle)

-> start

== start
{
    - GetStoryFlag("sarah_angry"):
        She's still mad at you...
        -> angry_path
    - else:
        We talked it out and...
        -> transition_to_makeup
}

== transition_to_makeup
~ ShowCustomTransition("Chapter 2", "Making up")
Hey there! 😊
~ SetStoryFlag("made_up_with_sarah")
-> END

Notice how the transition is in its own knot so it fires at the right moment!

Flags & State Management

Flags let you track player choices and create branching storylines:

Setting flags

~ SetStoryFlag("player_chose_honesty")

Mark that the player made a specific choice.

Checking flags

{
    - GetStoryFlag("player_chose_honesty"):
        I remember you value honesty
        -> honest_path
    - else:
        -> default_path
}

React differently based on previous choices.

Multiple flag check

{
    - GetStoryFlag("sarah_angry"):
        She's still mad at you
        -> angry_sarah
    - GetStoryFlag("sarah_happy"):
        She seems in a good mood
        -> happy_sarah
    - else:
        She seems neutral
        -> neutral_sarah
}

Handle multiple relationship states.

Removing flags

~ RemoveStoryFlag("temporary_flag")

Clear flags when they're no longer needed.

Super Tip - Insight Mode: Flags that contain a character's name will automatically appear in the insight mode list under that character! For example, "sarah_knows_secret" will appear under Sarah's section in insight mode. If no character name is found, it will appear under the first character the game loads. This makes debugging much easier!

Special Messages

The game provides custom commands to enhance your storytelling:

⏱️ Wait Command

<wait-3>

Pauses the conversation for the specified number of seconds. Creates realistic typing delays.

📷 Contact Images

<image-filename>

Contact sends an image. Recommend adding a 3-second wait before for realism (gotta make it believable they're "selecting" from their gallery 😏).

<wait-3>
<sarah-at-beach>

📱 Player Images

<player-image-filename>

Player sends an image. Use the "player-" prefix.

<player-sunset-photo>

💭 Fake Typing

<fake-type-4>

Shows typing indicator that stops after specified seconds. Great for building tension (or driving players absolutely crazy with anticipation 😈).

📖 Side Stories

<side-story-ben_interruption>

Triggers a side conversation that returns to main story when complete.

🎬 Custom Transitions

~ ShowCustomTransition("Chapter 2", "The Plot Thickens")

Creates chapter-like transitions between story sections.

Images

Images are automatically imported based on their filenames in the Images folder.

Recommended image sizes

Chat images

832 x 1216 pixels

Vertical images sent in conversations

Profile pictures

832 x 832 pixels

Square images for character profiles

Mod banner

1600 x 400 pixels

Header image for your mod

File Naming: Use descriptive filenames without spaces. Use hyphens instead: sarah-at-beach.png not sarah at beach.png

Conversation Settings

Every .ink file needs a corresponding -settings.json file to control timing and flow:

{
    "storyId": "sarah-chat-1",
    "contactID": "sarah",
    "nextStoryId": "sarah-chat-2",
    "isStartingStory": true,
    "forceTimeInHours": 14,
    "passTimeInMinutes": 30,
    "timeIsExact": false,
    "forceDay": 0,
    "isSideStory": false
}

Settings parameters

Parameter Description Example
storyId Unique identifier for this conversation "sarah-chat-1"
contactID Which character this conversation is with "sarah"
nextStoryId ID of the next conversation in sequence "sarah-chat-2"
isStartingStory Is this the first conversation in your mod? true
forceTimeInHours What time this conversation happens (24-hour) 14 (2 PM)
passTimeInMinutes Additional time to pass 30
timeIsExact Go to exact time vs. relative time false
forceDay Set specific day (0=None, 1=Monday, etc.) 0
isSideStory Can be triggered as a side story false

Side Stories

Side stories are conversations that interrupt the main flow and then return to where they left off:

Creating a side story

1

Create the side story files

Create your .ink file and settings file in a "Side Stories" subfolder

2

Mark as side story

{
    "storyId": "ben-interruption",
    "contactID": "ben", 
    "isSideStory": true
}
3

Trigger from main story

<side-story-ben-interruption>

Example use case

You're having a romantic conversation with Sarah when Ben suddenly texts asking for help. The side story handles Ben's interruption, then returns to your conversation with Sarah exactly where you left off.

Time Management

Control when conversations happen to create realistic pacing:

Pro Tip: It's highly recommended to just set forceTimeInHours to the time you want your conversation to happen. The passTimeInMinutes is just for the minute of the day (yeah, bad dev naming conventions haha 😅).

Morning conversation

{
    "forceTimeInHours": 8,
    "passTimeInMinutes": 30,
    "timeIsExact": true
}

Conversation happens exactly at 8:30 AM

Afternoon chat

{
    "forceTimeInHours": 14,
    "passTimeInMinutes": 15,
    "timeIsExact": true
}

Conversation happens at 2:15 PM

Evening on friday

{
    "forceDay": 5,
    "forceTimeInHours": 19,
    "passTimeInMinutes": 0,
    "timeIsExact": true
}

Friday at 7:00 PM

Day values

0 = None, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday, 7 = Sunday

Testing & Validation

Ensure your mod works perfectly before sharing:

Testing checklist

Pro Tip: Zip your mod folder and upload it to a Discord channel. Then use the "COPY LINK" button and paste that URL into the game's URL downloader. This is the easiest way to share and test your mods!

Need Help? 🆘

Stuck on something? Here's how to get help:

  • 💬 Contact @unzippedgames on Discord (I'm pretty active!)
  • 🛡️ Reach out to any of our awesome moderators
  • 📁 Share your mod files for debugging help - we love helping!
  • 🤝 The community is always willing to help others

Complete Example

Here's a complete simple mod to demonstrate all concepts:

📄 mod.json

{
    "modId": "first-date", 
    "modName": "First Date",
    "version": "1.0.0",
    "author": "Your Name",
    "description": "A sweet story about a first date",
    "headerImage": "header.png"
}

📄 Characters/emma.json

{
    "isMainCharacter": false,
    "contactID": "emma",
    "contactName": "Emma",
    "contactNickname": "Emma", 
    "contactNicknameShort": "Emma",
    "profilePicturePath": "emma.png"
}

📄 Conversations/Chapter1/first-conversation.ink

EXTERNAL GetStoryFlag(flagName)
EXTERNAL SetStoryFlag(flagName)
EXTERNAL RemoveStoryFlag(flagName)

-> start

== start
Hey! I had such a great time on our date yesterday 😊

* It was amazing! I'd love to see you again
    ~ SetStoryFlag("wants_second_date")
    -> positive_response
* It was nice, but I think we should just be friends
    ~ SetStoryFlag("just_friends")
    -> friend_zone

== positive_response
Really? I was hoping you'd say that!
<wait-2>
Would you like to go out again this weekend?

* !Absolutely! I'd love to
    Perfect! I'll plan something special
    -> END

== friend_zone
Oh... okay, I understand.
<wait-3>
Friends it is then! 

* Thanks for understanding
    Of course. Take care!
    -> END

📄 Conversations/Chapter1/first-conversation-settings.json

{
    "storyId": "first-conversation",
    "contactID": "emma",
    "nextStoryId": null,
    "isStartingStory": true,
    "forceTimeInHours": 10,
    "passTimeInMinutes": 0,
    "timeIsExact": true,
    "forceDay": 6,
    "isSideStory": false
}