# Home

Welcome to Project Fika Wiki!

<div data-full-width="false" data-with-frame="true"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FIeOydAgbRhKyvKkDq0fY%2F1080p_launchertest2.png?alt=media&amp;token=42ed9a51-1e07-4074-b52f-ee9713bc1782" alt="" width="563"><figcaption></figcaption></figure></div>

## Welcome

**Project Fika** is an <mark style="color:$warning;">SPT mod</mark> that enables co-op multiplayer gameplay with your friends in *Escape from Tarkov*. You can progress through quests, share items, and fight AI-controlled bots (PMCs, Scavs, and bosses) together, and much more.

{% hint style="warning" %}
Do **NOT** contact SPT for any questions related to Fika. Please join our [Discord](https://discord.gg/project-fika) server where you can find support for both SPT and Fika.
{% endhint %}

## Looking to install Fika?

<h2 align="center"><a href="/installing-fika/before-installing-fika" class="button primary">GET STARTED</a></h2>

## Quick links

<p align="center"><a href="/general-information" class="button primary" data-icon="circle-info">How does Fika work?</a> <a href="/faqandguides" class="button primary" data-icon="comments-question-check">FAQ and Guides</a> <a href="/fika-configuration" class="button primary" data-icon="gears">Configure Fika</a> </p>

<p align="center"><a href="/advanced-features/headless-client" class="button primary" data-icon="desktop-arrow-down">Set up headless client</a> <a href="/advanced-features/nat-punching" class="button primary" data-icon="webhook">Connect using NAT Punching</a> <a href="/advanced-features/web-app" class="button primary" data-icon="webhook">Fika Web App</a></p>

<p align="center"> <a href="/contribute-to-fika" class="button primary" data-icon="code">Contribute to Fika</a> <a href="https://discord.gg/project-fika" class="button primary" data-icon="discord">Join our Discord</a></p>

## License

![cc by-nc-sa](https://mirrors.creativecommons.org/presskit/buttons/88x31/png/by-nc-sa.png)

This project is licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.en).

* You may only share/create derivatives of Fika as long as proper credits are given and it is not used for commercial purposes.
* You may not monetize your server in terms of payments or donations.
* You may not host massive public servers, Fika is meant for COOP with your friends.
* You may not use Fika's **art assets** that are handcrafted by our developers and artists without permission from the creator.


# General information

Learn about the features, specifications and limitations of Fika.

## What is Fika?

Fika is a cooperative multiplayer mod for [SPT](https://sp-mod.com/). Fika adds a lobby interface to join other players' raids and provide in-game networking capabilities, along with additional features that do not alter the standard Escape From Tarkov experience by default.

In summary:

* SPT is the back-end server that allows you to start the game without using BSG servers — it provides the player profile, inventory, flea market, and many other Escape From Tarkov features.
* Fika is the mod component that adds cooperative multiplayer capabilities which allow players to host or join a raid to play together.

## Specifications

* Fika is a combination of a [BepInEx plugin](https://github.com/project-fika/Fika-Plugin) and a [SPT server mod](https://github.com/project-fika/Fika-Server).
* Fika uses SPT as the back-end server to connect players together.
* Fika uses the `Client <-> Server <-> Client` UDP networking model for game play. The network performance of Fika is better than Escape From Tarkov live (provided the host has proper networking capabilities). It uses less bandwidth, is faster and *much* more accurate.

{% hint style="warning" %}
Keep in mind that the statements above are only true if you have a decent connection *by modern standards*. Fika will not run perfectly if you're playing with someone across the world on a **4G** connection, however it is playable.

If you're having issues even on a stable connection, the most common problem is a faulty mod.
{% endhint %}

## Main features

* Host your own server or join a local/external server.
* Create your own raid for other players to join (or play solo).
* Join someone else's raid.
* Play together against bots, share items, progress quests together in the same raid.
* Preserve character, quest, inventory, and hideout progression.
* Use client/server mods from [SPT](https://sp-mod.com/) (some mods are not compatible - see [Limitations](#limitations)).

## Other features

* Item Sending
  * Right-click an item in your stash to send it to another account
  * Can be customized in the [server](/fika-configuration/server) config
* Free cam (default to `F9` key)
  * Can be enabled in the [server](/fika-configuration/server) config
  * In free cam you can teleport to the cam position by pressing `T`
  * You can jump to another player by `Left/Right` clicking
  * You can snap to their head by holding `SPACE` when jumping
  * You can snap to their back in a 3rd position view by holding `CTRL` when jumping
  * You can press the `HOME` key to temporarily toggle free cam controls
* In-game chat system
* In-raid VOIP
* Online player list
* Culling system to increase performance
* Custom notifications (teammate died, boss got killed by a player, etc.)
* Pinging system to ping an area in the game for your teammates
* Player health bars for your teammates
* Quest progress sharing in raids
* Optional/Advanced Headless client to offload AI and gain performance (more info [here](/advanced-features/headless-client/remote-headless-client))
* Network interpolation for smoother gameplay
* UPnP and NAT Punching

## Limitations

* You cannot play Fika without owning a legitimate copy of Escape From Tarkov. You will be banned if you attempt to do so.
* There is no protection against abuse or cheating. Fika is designed to be played with trusted friends. **Hosting a public server is strongly discouraged**. We will NEVER support public servers.
* Fika does not include any PvP mechanisms. Supporting PvP is not the goal of this project.
* Fika does not offer a global matchmaking service. Only players connected to the same server can create or join raids.
* Certain SPT mods are incompatible with Fika. SPT mods are typically designed for a standard SPT installation, which does not include multiplayer functionality. It is the responsibility of the mod's author to make their mod compatible with Fika, if they choose to do so.


# Fika configuration

Getting started with configuring Fika.

Fika has two type of configuration: client configuration and server configuration.

The [Client](/fika-configuration/client) configuration allows you to configure your in game experience while playing in a Fika server.

The [Server](/fika-configuration/server) configuration allows you to configure certain parameters when hosting a Fika server.


# Client

An exhaustive list of all the different Fika configurations when playing in-game. Not fully updated for 4.X.

To open up your client configuration, press the <kbd>F12</kbd> key while in-game. Head to the `Fika Core` section to configure the settings.

### Coop

<table><thead><tr><th>Name</th><th width="171">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Show Feed</td><td>true</td><td>Enable custom notifications when a player dies, extracts, kills a boss, etc.</td></tr><tr><td>Auto Extract</td><td>false</td><td>Automatically extracts after the extraction countdown. As a host, this will only work if there are no clients connected.</td></tr><tr><td>Show Extract Message</td><td>true</td><td>Whether to show the extract message after dying/extracting.</td></tr><tr><td>Extract Key</td><td><kbd>F8</kbd></td><td>The key used to extract from the raid.</td></tr><tr><td>Enable Chat</td><td>false</td><td>Toggle to enable chat in game. Cannot be change mid raid.</td></tr><tr><td>Chat Key</td><td><kbd>RightControl</kbd></td><td>The key used to open the chat window.</td></tr><tr><td>Enable Online Players</td><td>true</td><td>If the online players menu should be shown in the menu.</td></tr><tr><td>Online Players Scale</td><td>1</td><td>The scale of the window that displays online players. Only change if it looks out of proportion. Requires a refresh of the main menu to take effect.</td></tr></tbody></table>

### Coop | Debug

<table><thead><tr><th>Name</th><th width="167">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Free Camera Button</td><td><kbd>F9</kbd></td><td>Button used to toggle free camera.</td></tr><tr><td>Allow Spectating Bots</td><td>true</td><td>If we should allow spectating bots if all players are dead/extracted.</td></tr><tr><td>AZERTY Mode</td><td>false</td><td>If free camera should use AZERTY keys for input.</td></tr><tr><td>Drone Mode</td><td>false</td><td>If the free camera should move only along the vertical axis like a drone.</td></tr><tr><td>Keybind Overlay</td><td>true</td><td>Keybind Overlay.</td></tr></tbody></table>

### Coop | Name Plates

<table><thead><tr><th>Name</th><th width="167">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Show Player Name Plates</td><td>true</td><td>If name plates should be shown above teammates.</td></tr><tr><td>Hide Health Bar</td><td>false</td><td>Completely hides the health bar.</td></tr><tr><td>Show HP% instead of bar</td><td>false</td><td>Shows health in % amount instead of using the bar.</td></tr><tr><td>Show Effects</td><td>true</td><td>If status effects should be displayed below the health bar.</td></tr><tr><td>Show Player Faction Icon</td><td>true</td><td>Shows the player faction icon next to the HP bar.</td></tr><tr><td>Hide Name Plate in Optic</td><td>true</td><td>Hides the name plate when viewing through PiP scopes.</td></tr><tr><td>Name Plates Use Optic Zoom</td><td>true</td><td>If name plate location should be displayed using the PiP optic camera.</td></tr><tr><td>Decrease Opacity in Peripheral</td><td>true</td><td>Decreases the opacity of the name plates when not looking at a player.</td></tr><tr><td>Name Plate Scale</td><td>0.22</td><td>Size of the name plates.</td></tr><tr><td>Opacity in ADS</td><td>0.75</td><td>The opacity of the name plates when aiming down sights.</td></tr><tr><td>Max Distance to Show</td><td>500</td><td>The maximum distance at which name plates will become invisible, starts to fade at half the input value.</td></tr><tr><td>Minimum Opacity</td><td>0.1</td><td>The minimum opacity of the name plates.</td></tr><tr><td>Minimum Name Plate Scale</td><td>0.01</td><td>The minimum scale of the name plates.</td></tr><tr><td>Use Occlusion</td><td>false</td><td>Use occlusion to hide the name plate when the player is out of sight.</td></tr></tbody></table>

### Coop | Pinging

<table><thead><tr><th>Name</th><th width="162">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Ping System</td><td>true</td><td>Toggle Ping System. If enabled you can receive and send pings by pressing the ping key.</td></tr><tr><td>Ping Button</td><td><kbd>Semicolon</kbd></td><td>Button used to send pings.</td></tr><tr><td>Ping Color</td><td>FFFFFFFF</td><td>The color of your pings when displayed for other players.</td></tr><tr><td>Ping Size</td><td>1</td><td>The multiplier of the ping size.</td></tr><tr><td>Ping Time</td><td>3</td><td>How long pings should be displayed.</td></tr><tr><td>Play Ping Animation</td><td>false</td><td>Plays the pointing animation automatically when pinging. Can interfere with gameplay.</td></tr><tr><td>Show Ping During Optics</td><td>false</td><td>If pings should be displayed while aiming down an optics scope.</td></tr><tr><td>Ping Use Optic Zoom</td><td>true</td><td>If ping location should be displayed using the PiP optic camera.</td></tr><tr><td>Ping Scale With Distance</td><td>true</td><td>If ping size should scale with distance from player.</td></tr><tr><td>Ping Minimum Opacity</td><td>0.05</td><td>The minimum opacity of pings when looking straight at them.</td></tr><tr><td>Show Ping Range</td><td>false</td><td>Shows the range from your player to the ping if enabled.</td></tr><tr><td>Ping Sound</td><td>SubQuestComplete</td><td>The audio that plays on ping. Acceptable values: SubQuestComplete, InsuranceInsured, ButtonClick, ButtonHover, InsuranceItemInsured, MenuButtonBottom, ErrorMessage, InspectWindow, InspectWindowClose, MenuEscape</td></tr></tbody></table>

### Coop | Quest Sharing

<table><thead><tr><th>Name</th><th width="162">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Quest Types</td><td>All</td><td>Which quest types to receive and send. PlaceBeacon is both markers and items. Acceptable values: Kills, Item, Location, PlaceBeacon, All</td></tr><tr><td>Show Notifications</td><td>true</td><td>If a notification should be shown when quest progress is shared with out.</td></tr><tr><td>Easy Kill Conditions</td><td>false</td><td>Enables easy kill conditions. When this is used, any time a friendly player kills something, it treats it as if you killed it for your quests as long as all conditions are met. This can be inconsistent and does not always work.</td></tr><tr><td>Shared Kill Experience</td><td>false</td><td>If enabled you will receive ½ of the experience when a friendly player kills an enemy (not bosses).</td></tr><tr><td>Shared Boss Experience</td><td>false</td><td>If enabled you will receive ½ of the experience when a friendly player kills a boss.</td></tr></tbody></table>

### Gameplay

<table><thead><tr><th>Name</th><th width="162">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Disable Bot Metabolism</td><td>false</td><td>Disables metabolism on bots, preventing them from dying from loss of energy/hydration during long raids.</td></tr></tbody></table>

### Network

<table><thead><tr><th>Name</th><th width="175">Default value</th><th>Description</th></tr></thead><tbody><tr><td>Force IP</td><td>&#x3C;empty></td><td>Forces the server when hosting to use this IP when broadcasting to the backend instead of automatically trying to fetch it. Leave empty to disable.</td></tr><tr><td>Force Bind IP</td><td>0.0.0.0</td><td>Forces the server when hosting to use this local adapter when starting the server. Useful if you are hosting on a VPN.</td></tr><tr><td>UDP Port</td><td>25565</td><td>Port to use for UDP gameplay packets.</td></tr><tr><td>Use UPnP</td><td>false</td><td>Attempt to open ports using UPnP. Useful if you cannot open ports yourself but the router supports UPnP.</td></tr><tr><td>Use NAT Punching</td><td>false</td><td>Use NAT punching when hosting a raid. Only works with fullcone NAT type routers and requires NatPunchServer to be running on the SPT server. UPnP, Force IP and Force Bind IP are disabled with this mode.</td></tr><tr><td>Connection Timeout</td><td>15</td><td>How long it takes for a connection to be considered dropped if no packets are received.</td></tr><tr><td>Send Rate</td><td>Medium</td><td>How often per second movement packets should be sent (lower = less bandwidth used, slight more delay during interpolation). This only affects the host and will be synchronized to all clients.</td></tr><tr><td>Smoothing Rate</td><td>Medium</td><td>Local simulation is behind by (Send Rate * Smoothing Rate). This guarantees that we always have enough snapshots in the buffer to mitigate lags &#x26; jitter during interpolation.</td></tr></tbody></table>


# Server

A default server configuration file with a description for each setting.

The server configuration can be found in the `SPT\user\mods\fika-server\assets\configs` folder. Open up `fika.jsonc` with a text editor. You need to launch the server at least once for this file to be generated.

{% hint style="info" %}
Be sure to save changes and restart the server when you're done to ensure your changes take effect!
{% endhint %}

{% code fullWidth="true" %}

```json5
{
    "client": {
        "useBtr": true, // if the BTR should spawn
        "friendlyFire": true, // if friendly fire is enabled
        "dynamicVExfils": false, // if vehicle exfils should dynamically scale with the amount of players
        "allowFreeCam": false, // if players can use the free cam while still alive
        "allowSpectateFreeCam": false, // whether players are forced to spectate other players or if they can move freely
        "blacklistedItems": [], // items that cannot be sent
        "forceSaveOnDeath": false, // if a player's inventory is force saved when they die, mitigating ALT+F4 cheating
        "mods": {
            "required": [], // required mods by the client
            "optional": [] // optional mods allowed to connect with
        },
        "useInertia": true, // if inertia should be enabled, if disabled it will act as if you are not wearing anything
        "sharedQuestProgression": false, // if quest progression should be shared, affects shared XP options as well
        "canEditRaidSettings": true, // of clients can modify the raid settings before starting a raid
        "enableTransits": true, // if transits are enabled
        "anyoneCanStartRaid": false, // if anyone can click "START RAID"
        "allowNamePlates": true, // if player nameplates are allowed to be enabled by clients
        "randomLabyrinthSpawns": true, // if all players should have random spawns in Labyrinth
        "pmcFoundInRaid": true, // if all AI PMC gear should be found in raid
        "allowSpectateBots": true, // if players should be allowed to spectate bots in free cam
        "instantLoad": false, // if magazines should refill instantly in raid
        "fastLoad": true // if enabled magazines refill 5 bullets each tick rather than 5 in raid (disabled if instantLoad is enabled),
        "reviveConfig": {
          "enabled": false, // if the revive system should be enabled
          "headshotKills": false, // if headshots always kills
          "grenadesKills": false, // if grenades always kills
          "allowLooting": false, // if you can loot downed players
          "maxRevives": 3, // max revives per player, 0 = infinite, otherwise max 10
          "bleedoutTime": 30, // time to bleed out while downed, min 10 seconds, max 600
          "reviveTime": 3 // time it takes to revive a player, min 3 seconds, max 30
        }
    },
    "server": {
        "SPT": {
            "http": {
                "ip": "0.0.0.0", // the interface to listen on
                "port": 6969, // the port to host on
                "backendIp": "0.0.0.0", // the ip that is sent to clients to be used for requests
                "backendPort": 6969 // the port that is sent to clients to be used for requests
            },
            "disableSPTChatBots": false // forces chat bots to be off
        },
        "webhook": {
            "enabled": false,
            "name": "Fika Server",
            "avatarUrl": "https://github.com/project-fika/Fika-Server-CSharp/blob/main/FikaWebApp/wwwroot/images/FIKA_LOGO.png?raw=true",
            "url": ""
        },
        "allowItemSending": true, // allows players to send items to each other
        "itemSendingStorageTime": 7, // how long before sent item mail expires
        "sentItemsLoseFIR": true, // if sent items lose their FIR status
        "launcherListAllProfiles": true, // if all accounts are listed in the launcher
        "sessionTimeout": 5, // how long in minutes it takes for a raid to be considered "lost" when not responding
        "showDevProfile": true, // if dev profiles are enabled
        "showNonStandardProfile": true, // if non-standard EFT profiles are enabled
        "adminIds": [], // list of profile ids allowed to interact with Mr Fika admin bot commands
        "apiKey": "" // apiKey for interacting with Fika API
    },
    "natPunchServer": {
        "enable": false, // if the nat punching module is enabled
        "port": 6790 // the port to use
    },
    "headless": {
        "profiles": {
            "amount": 0, // the amount of profiles to be generated / used
            "aliases": {
                "68eac997dc053e6fwhatever" : "NameOfHeadless" // headless profile uid : name you want to appear on raid host screen
            } // the aliases to be show when selecting a headless client
        },
        "scripts": {
            "generate": true, // if the headless scripts should be generated
            "forceIp": "https://127.0.0.1:6969" // the URL the headless connects to
        },
        "setLevelToAverageOfLobby": true, // use average level of all players when spawning bots on headless
        "restartAfterAmountOfRaids": 1 // if the headless should restart after X raids, 0 to disable
    },
    "background": {
        "enable": true, // enables custom launcher background
    }
}
```

{% endcode %}


# Advanced features

Advanced features of Fika.

{% hint style="warning" %}
This section is for advanced users only. We will not provide support unless you know what you're doing
{% endhint %}

<a href="/advanced-features/headless-client" class="button primary" data-icon="server">Set up a headless client</a>

<a href="/advanced-features/nat-punching" class="button primary" data-icon="network-wired">Host SPT Server with NAT Punching</a>

<a href="/advanced-features/web-app" class="button primary" data-icon="globe">Host the Web App</a>

<a href="/advanced-features/fika-api" class="button primary" data-icon="webhook">Using the Fika API</a>


# Headless Client

General information about the Fika headless client feature for creating a dedicated raid host instance of SPT.

The headless client plugin is an exclusive Fika feature that allows you to host a raid on a separate Escape From Tarkov instance. You are able to offload the AI calculation and other resource-intensive task to improve game play performance. When hosting the raid on a **separate PC** from where you play, FPS gains are usually around 25% to 50% depending on your computer specifications and amount of bots in the game.

{% hint style="warning" %}
Please note that there is some technical knowledge required to achieve this. If you absolutely have no experience, you will have a hard time.
{% endhint %}

### Specifications

* The headless client is basically another SPT+Fika client instance that will automatically host raids. All players becomes clients (including the player who clicked `HOST RAID`).
* Graphic rendering is disabled to make the headless client as lightweight as possible. However, the headless client is **NOT** a true headless server. It still requires all the game files and a pretty hefty amount of RAM to work (especially for bigger maps such as Streets or Lighthouse).
* It is **strongly** recommended to run the headless client on a separate physical machine. The headless client will NOT work on a VPS. If you really wish to use a paid host, rent a dedicated server.
* A graphic card is NOT required to run the headless client, however it may be helpful for configuring mods.

{% hint style="danger" %}
Using a headless client can create a situation where certain mods either cannot work entirely or become more complicated to properly configure. It is therefore much easier to set up a headless client **before adding any mods** to reduce issues.

If you run into problems during the headless client setup process, consider starting over with a completely fresh SPT+Fika install without any other mods first.
{% endhint %}

More information, guides, and common fixes can be found in the [Headless Client FAQ and Common Issues](/faqandguides/headless-client-faq-and-common-issues) section.

### Choose Headless Client Implementation

{% tabs %}
{% tab title="Headless Client on a Separate PC" %}
{% hint style="success" %}
This is the intended use case for the Headless Client feature and provides the largest and most consistent performance increase.
{% endhint %}

Both SPT.Server and a Headless Client will run on a separate PC independent of your gaming PC. This means you can utilize your gaming PC in any way you wish, including restarting it, without affecting any other players.

<h4 align="center"><a href="/advanced-features/headless-client/remote-headless-client" class="button primary" data-icon="network-wired">Remote Headless Client Instructions</a></h4>
{% endtab %}

{% tab title="Local Headless / Headless on Same PC" %}
{% hint style="danger" %}
**This is not the intended use case for the Headless Client feature! Please read the warnings at the top of the next page. Support is limited.**
{% endhint %}

If your PC can handle running two EFT clients at the same time, you *may* see a reduction in stuttering or an increase in performance by running a headless client on the same PC where you are playing SPT. Any performance increase is entirely dependent on your hardware and not guaranteed.

#### <mark style="color:$warning;">Some users see performance degradation. Continue at your own risk.</mark>

<h4 align="center"><a href="/advanced-features/headless-client/local-headless-client" class="button primary" data-icon="computer">Local Headless Client Instructions</a></h4>
{% endtab %}
{% endtabs %}


# Remote Headless Client

Instructions for setting up a headless client to host your raids from a separate computer for maximum performance gains. This is the officially supported headless client configuration.

{% hint style="info" %}
Please make sure you have read everything on the general [Headless Client page](/advanced-features/headless-client) first.
{% endhint %}

## Recommended Hardware Requirements

* A dedicated machine for running the headless client.
  * Most virtual private servers (VPS) will **not** work because they do not provide the performance needed for the headless client.
* A modern CPU with at least 4 cores @ 4GHz+.
* 32 GB RAM (16 GB RAM *may* work but will provide reduced performance due to virtual paging).
* Initially around 120 GB available disk space on an SSD/NVME drive. **HDD is NOT supported.**
  * After the installation is complete and everything is tested working you will be able to delete a portion of the retail game install data to save some space.

## Notes

* The installation process below will guide you through the steps to set up the SPT server and headless client on the same machine. It is possible to separate the SPT server and the headless client, but there is no performance benefit, and the steps are more involved. Therefore, this setup will not be covered in this guide.
* Linux is NOT supported and covered by this article. Visit the dedicated Linux channel in our [Discord](https://discord.gg/project-fika) for assistance.

***

## Installation

{% stepper %}
{% step %}

### Install Escape From Tarkov using BSG Launcher

Escape From Tarkov must be installed on the machine/server where you are planning to run the headless client. This is required to ensure that you own the game.&#x20;

**Fika will NOT work if you skip this step!**
{% endstep %}

{% step %}

### Install [SPT](https://sp-mod.com/installer)

If your SPT server is currently located on a different machine, please copy it to the computer where you are planning to install the headless client. It must contain the full game. If you are unable to copy it due to the size, install SPT on the remote machine using the [SPT Installer](https://sp-mod.com/installer) instead.

**Do NOT install SPT in your official Escape From Tarkov folder!**
{% endstep %}

{% step %}

### Download [Fika-Installer](https://github.com/project-fika/Fika-Installer/releases/latest)

{% endstep %}

{% step %}

### Copy `Fika-Installer.exe` to the root of your SPT install folder

Do not copy inside `SPT` folder!

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F5yu7c0P4PT4gSQwcgOw5%2Fimage.png?alt=media&amp;token=2cfcb1fd-3830-4df9-aeba-8681867e91df" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Run `Fika-Installer.exe`

If you get an admin rights prompt, this is normal. `Fika-Installer` requires admin rights to set up the firewall rules.
{% endstep %}

{% step %}

### Choose `Install Fika`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FACcBaVOadt3rUPt48rNp%2Fimage.png?alt=media&amp;token=5e5c3e31-cfdf-4e98-a154-83d67341f0d6" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Confirm installation completion

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FD9VHauheMEVLMpsMRod5%2Fimage.png?alt=media&amp;token=ddf074d7-a593-40ea-9ead-e2a3cb308a5b" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### OPTIONAL: Set URL in [fika.jsonc](/fika-configuration/server)

{% hint style="info" %}

#### Most users *do not have to do this*.

This step is not necessary if your SPT.Server is being hosted at `https://0.0.0.0:6969` and this headless client will be on the same PC as the backend server. The below instructions are **OPTIONAL** for users with a non-standard setup.

If you are unsure, skip this step.
{% endhint %}

If your headless client is not able to connect to the backend server at `127.0.0.1:6969`, you may need to:

1. Navigate to `[SPT root folder]\SPT\user\mods\fika-server\assets\configs\`
   1. If `fika.jsonc` does not exist, run `SPT.Server.exe` once and then close it.
2. Open `fika.jsonc` in a text editor.
3. Scroll down to the `scripts -> forceIp` setting and change it to an URL where the headless client will be able to connect to the backend server.
4. Save the file and close the text editor.

<div align="left"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FjhjzwkuoUzZs4O3zz9NO%2Fimage.png?alt=media&amp;token=d499542a-16f1-4740-a1c4-04fe06095231" alt=""><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}

### Choose `Advanced options`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FCiHYMk9oDGbrdYMAjF8B%2Fimage.png?alt=media&amp;token=cfbf11e7-f115-41da-8c83-d0dbfd26d92d" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Choose `Install Fika Headless`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FgKHOZgGde3c1QfVjG1zK%2Fimage.png?alt=media&amp;token=e6563c9b-36c8-41ea-8a5b-9923743bce05" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Choose `Create a new headless profile`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FwnZ3uQjHh4eBxqaGu6Y6%2Fimage.png?alt=media&amp;token=a0bf4138-a365-4c53-bbb1-7a81e480b058" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Close `Fika-Installer` when installation is completed

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FYeEWVYyouIsBl4bwyGpQ%2Fimage.png?alt=media&amp;token=0ab6f1d1-5b99-4503-8034-3d8836ddde90" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server.exe`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FLRc3xTCQ6XWf6cP3JDMG%2Fimage.png?alt=media&amp;token=10fb20a5-8ac6-4c58-8d21-16b5bae1cba3" alt=""><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### Wait for `Server has started, happy playing` message in console

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FnPRIBPpI5GnXFawIJvFs%2Fimage.png?alt=media&amp;token=13eaeb7c-6b71-448b-b22a-e93b4882d083" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the headless client using `Fika Headless Manager`

The `Fika Headless Manager` will start your headless client.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FS87Ckkpqb9TwGMl7kcNV%2Fimage.png?alt=media&amp;token=60411626-21c2-4bfa-b8f7-985aee0c532b" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Wait for the headless client to load

Two console windows will appear after running the script: the `Fika Headless Manager` and the headless client console. **Do not close them**. Wait for the headless client to load. Activity will stop in the console when loading is completed.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FQvqzHxxj9u0pK41ruLoh%2Fimage.png?alt=media&amp;token=b089198b-8ba3-463b-8e48-4c899c732196" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Launcher` and your game client

The headless client is now ready to host a raid. Start Fika (`SPT.Launcher`) on your computer.&#x20;

**Do NOT start SPT.Launcher.exe on the headless client server!**

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F5JyGZToLjW66sqPZgBa8%2Fimage.png?alt=media&amp;token=f1b62089-ee12-4f89-8a6c-50cbb24c53d3" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Host a raid using the headless client

Navigate the in-game menu like you would normally do to reach the `Raids` menu and click `Host Raid`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F99rwTHlGNcSOySnT0nqj%2Fimage.png?alt=media&amp;token=9898f962-cb01-4114-b110-f867a2d1da8b" alt=""><figcaption></figcaption></figure>

Check the `Use Headless Host` box and press `Start`. This will request the headless client to start a raid in the selected location. Wait for the headless client to load the raid.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FPT2bor9IsAHmpiumOSn7%2Fimage.png?alt=media&amp;token=39e62c60-36f5-4e0f-9d5d-0a08a41c988b" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the raid when the headless client is ready

Your friend(s) can join the headless client's raid when you see this screen. When everybody has joined, press `Start Raid`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FkJSBYyECO2hRp0vcj2ty%2Fimage.png?alt=media&amp;token=1c6fcfe8-091b-4019-839c-648f7476c097" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Done!

{% endstep %}
{% endstepper %}

***

## Modding

The headless client is very sensitive to modding. Do **NOT** install all of the mods you use with your normal gaming client. Because the headless client is heavily modified, many mods may cause crashes or other unwanted behavior.

**✅ YOU CAN INSTALL:**

* AI mods (SAIN)
* Spawn mods (ABPS, MOAR, DONUTS)
* Mods that specifically mention headless client support (That's Lit, UIFixes, etc.)
* Any mod that reasonably changes in-raid behavior, like entering custom quest zones or having to do with inventory (VCQL, Pack'n'Strap, etc.)

**❌ DO NOT INSTALL:**

* RAM/VRAM cleaner mods (RAM Cleaner, VRAM Cleaner, etc.)
* Performance mods (DeClutter, etc.)
* Any other mods not listed in the **YOU CAN INSTALL** section

***

## Troubleshooting

* If you have mods installed and you are running into issues you should first create fresh installs all around and get the headless client working and a test raid completed without any mods other than Fika. Once you have confirmed the headless client works unmodified, you may add mods 5-10 at a time and run test raids between batches of mods.
* If you are crashing or getting errors when joining a headless hosted raid, make sure that Fika is up-to-date for everyone. Verify that you have the latest version of [Fika-Installer](https://github.com/project-fika/Fika-Installer/releases/latest) and use it both in your normal SPT+Fika folder as well as the headless folder to `Update Fika` and `Advanced` -> `Update Fika Headless`.
* If the `Use Headless Host` checkbox is greyed out, it means that the headless client is unavailable. It could be caused by unsupported mods installed in the headless client, networking issues, or other factors. Note that the headless client can only host one raid at a time. Check `BepInEx/LogOutput.log` for errors, especially warnings about incompatible mods.
* If your headless client is failing to load, launch it in Graphics mode by pressing `G` during the startup of `Fika Headless Manager` if possible. If launching in Graphics mode is not possible, look in the `<timestamp> errors.log` in the SPT log folder for hints. Often this is caused by having a malfunctioning or invalid plugin, and sometimes also from missing a plugin that is required by one of the mods on the server.
* See other common issues in [FAQ and Guides](/faqandguides) and [Headless Client FAQ and Common Issues](/faqandguides/headless-client-faq-and-common-issues)


# Local Headless Client

Instructions for setting up a headless client to host your raids from the same PC where you play SPT. Support is limited.

{% hint style="info" %}
Please make sure you have read everything on the general [Headless Client page](/advanced-features/headless-client) first.
{% endhint %}

{% hint style="danger" %}

## SUPPORT IS LIMITED

Please note that **support is limited** if you choose to run the headless client on the same PC where you are playing SPT. This is not the officially supported configuration and may lead to:

* Performance degradation
* Increased incidence of crashes
* Significant increase in page file usage
* General instability that may adversely affect the entire PC or operating system

If you are experiencing any issues related to performance or instability, **stop using the headless client** on the same PC where you are playing.

Please do not ask for support if you are experiencing performance-related issues.
{% endhint %}

***

## Recommended Hardware Requirements

* You **must** have at least 64 GB of RAM.
  * Anything less **may work** in limited circumstances but is likely to cause issues.
* A CPU that holds a high boost clock (4Ghz+) while all cores are loaded.
* 100GB free space on a very fast SSD, preferably NVMe.

***

## Notes

* Windows virtual paging settings **must be default** with ample free space on your `C:\` drive.
  * If you have changed Windows virtual memory options, please return all settings to their default configuration. The `Automatically manage paging file size for all drives` checkbox should be checked.
* The installation process below assumes that you have followed the [Installing Fika](/installing-fika/installation) process exactly. Deviating from that process at all may lead to issues.
* If you have previously installed mods, especially client plugins, <mark style="color:$warning;">please remove them</mark> before proceeding. This process assumes that the only mod installed is Fika.
  * Proceeding with this guide while mods are installed is *possible*, but you are likely to run into issues. If you have any issues during this process at all, start over but this time remove all mods first.
* Character progress and server settings will largely be unaffected.
  * The only change to your existing server settings will be a small change in [fika.jsonc](/fika-configuration/server) to generate the necessary headless profile.

<details>

<summary>How could this possibly increase performance?</summary>

It is understandably difficult to see how running two SPT clients on the same PC could increase performance. Why would running the game twice on the same hardware be any better than only running the game once?

The reasons all boil down to how the base game client processes in-raid actions.

Basically, any action taken by an AI/bot has to be calculated on the same CPU core/thread before the CPU pushes data to your video card to render the next frame. There is very limited multi-threading, thus the game client that hosts all of the AI calculations has more to do and each frame is rendered more slowly.

By offloading the AI calculations onto a separate game client via the Fika headless client plugin, you are freeing up your game client's main logic thread to do less work before rendering each frame. This is effectively multi-threading the raid behavior, with your game client taking care of all of the rendering of graphics and the 2nd headless game client taking care of the bulk of the in-raid calculations.

<sub>All of the above is simplified for illustrative purposes only.</sub>

</details>

***

## Installation

{% stepper %}
{% step %}

### OPTIONAL: [Create a Fresh SPT+Fika Install](/installing-fika/installation)

{% hint style="info" %}
If you do not have **any** mods for **client or server** in your main SPT+Fika install, you can skip this step.
{% endhint %}

You can follow the steps below with your existing SPT+Fika install, but you may run into issues, especially if you already have mods installed. Creating a fresh SPT+Fika install makes it much easier to undo if you find that this will not work on your PC and it also leaves your existing install completely untouched.

Follow the entire [Installing Fika](/installing-fika/installation) section from start to finish, including creating a character and getting to your stash.

Once you have confirmed that everything is working with a fresh install, you can migrate mods and profiles from your existing install to your new install.

<mark style="color:$warning;">Skip this step at your own risk.</mark>
{% endstep %}

{% step %}

### OPTIONAL: Set URL in [fika.jsonc](/fika-configuration/server)

{% hint style="info" %}

#### Most users *do not have to do this*.

This step is not necessary if your SPT.Server is being hosted at `https://0.0.0.0:6969` and this headless client will be on the same PC as the backend server. The below instructions are **OPTIONAL** for users with a non-standard setup.

If you are unsure, skip this step.
{% endhint %}

If your headless client is not able to connect to the backend server at `127.0.0.1:6969`, you may need to:

1. Navigate to `[SPT root folder]\SPT\user\mods\fika-server\assets\configs\`
   1. If `fika.jsonc` does not exist, run `SPT.Server.exe` once and then close it.
2. Open `fika.jsonc` in a text editor.
3. Scroll down to the `scripts -> forceIp` setting and change it to an URL where the headless client will be able to connect to the backend server.
4. Save the file and close the text editor.

<div align="left"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FSsDHTBUtgS96lYY0bTVH%2Fimage.png?alt=media&amp;token=75d44a4a-ec09-4767-8f31-689d6ce05237" alt=""><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}

### Create the Headless Client SPT install folder

Create a new empty folder somewhere on your PC where you want the headless client install to be. Copy and paste `Fika-Installer.exe` from your original SPT install into this new empty folder.

<div align="center"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FPduJSqwapIkmJb1QBJFl%2Fimage.png?alt=media&amp;token=f50c9140-86d8-43eb-a29e-ece13a5d2050" alt=""><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}

### Use `Fika-Installer` to create a headless SPT install copy

Run `Fika-Installer.exe` and choose `Advanced Options` and then `Install Fika Headless`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FO8hLoZKiDe3v6fg9Yexi%2Fimage.png?alt=media&amp;token=473ff24c-e5c4-4da8-8097-58eb658c7632" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Select existing SPT+Fika install folder

Press `ENTER` and then select your existing SPT+Fika install folder.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FgBGbb8QSYoDR1FUumoPs%2Fimage.png?alt=media&amp;token=ce653990-9948-449f-98fd-b1a1562e861c" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Create the headless profile

Select `Create a new headless profile`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FJqNFAM3hikiUERnxzSbA%2Fimage.png?alt=media&amp;token=6e485923-0f05-4dc9-ab58-822e73583936" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Choose installation method

Choose either `HardCopy` or `Symlink` based on your preference.

* `HardCopy` will create a 1:1 copy of the existing SPT+Fika installation, which will take up the full 50+ GB of storage space. This is the method that will entirely avoid issues or confusion.
* `Symlink` will hard copy parts of the existing install to the new headless client folder, but will create a symbolic link of the bulk of the EFT data files. This saves a significant amount of storage but could possibly create issues if you were to delete the original files or need to reinstall SPT in the future.

#### If you have no preference, choose `Symlink` to save on storage space.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FtvMkw9l7FTYAAYq4vQXe%2Fimage.png?alt=media&amp;token=e030c3e2-72a6-423d-8def-6772f3a5d825" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Verify completion

<kbd>Fika-Installer</kbd> should create the necessary headless profile, copy the files to the new headless client install folder, and then install the latest version of Fika. If this step does not complete successfully, start over from the beginning.

Once done, you may now close `Fika-Installer`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FFN7rUmdhm6MpvGYgZ6em%2Fimage.png?alt=media&amp;token=0ca832d2-ffd9-44f2-b958-11c91dddce38" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server` from existing SPT+Fika folder

Open a new File Explorer window and navigate to your existing SPT+Fika folder and launch `SPT.Server`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FtzIGyImF4IpvMmBWS0q4%2Fimage.png?alt=media&amp;token=ea86891c-dc58-4b70-9f35-141eb01fce40" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Wait for `Server has started, happy playing` message in console

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FaYXHj4xIxvv7myXduudK%2Fimage.png?alt=media&amp;token=213e75e5-089b-43b2-85b6-d378ee917d05" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Launcher` and your game client

From the same existing SPT+Fika install folder, run `SPT.Launcher`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FpJhrpKi5voZUL18oTb4F%2Fimage.png?alt=media&amp;token=1c69ab14-0a3c-4227-ab2d-fb2855562a05" alt=""><figcaption></figcaption></figure>

Create a character if necessary and click the `Start Game` button.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FBm09af7TSX282X6Evp7A%2Fimage.png?alt=media&amp;token=4675f28d-461b-4c0b-8af0-3a3681c9cdb4" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Verify your game client loads and Fika is installed

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fb2QbjGHrFswRd1UBJ7XT%2Fimage.png?alt=media&amp;token=0c3f688c-4eda-4d62-99e2-074a82e8592d" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the `Fika Headless Manager`

From your headless client install folder, run `FikaHeadlessManager.exe`. The `Fika Headless Manager` will start your headless client.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FWz6Wqg4Ke2l1tLxSetFk%2Fimage.png?alt=media&amp;token=0ea12e64-770f-4dc6-81c3-1f4038ac3a4c" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Wait for the headless client to load

Two console windows will appear after running the script: the `Fika Headless Manager` and the headless client console. **Do not close them**. Wait for the headless client to load. Activity will stop in the console when loading is completed.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FN7yAh3yVAVl5WvtilPqm%2Fimage.png?alt=media&amp;token=04a37a15-c2a7-4d26-987c-c5c6a2a3dfc8" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Host a raid using the headless client

Navigate the in-game menu like you would normally do to reach the `Raids` menu and click `Host Raid`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FrN0edPGuddXCRlauSqYQ%2Fimage.png?alt=media&amp;token=fc72228b-ae60-49a4-81b9-0cc996652ee3" alt=""><figcaption></figcaption></figure>

Check the `Use Headless Host` box and press `Start`. This will request the headless client to start a raid in the selected location. Wait for the headless client to load the raid.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FwQu2lNXjYLoiJoUeiDB8%2Fimage.png?alt=media&amp;token=24765f36-44eb-4aec-86c9-e71b041a0826" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the raid when the headless client is ready

Your friend(s) can join the headless client's raid when you see this screen. When everybody has joined, press `Start Raid`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FsvbUAuWPqCktjdU1malW%2Fimage.png?alt=media&amp;token=e1f3c6a0-d0e4-4064-b736-027a9aca101b" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Done!

{% endstep %}
{% endstepper %}

***

## Modding

The headless client is very sensitive to modding. Do **NOT** install all of the mods you use with your normal gaming client. Because the headless client is heavily modified, many mods may cause crashes or other unwanted behavior.

**✅ YOU CAN INSTALL:**

* AI mods (SAIN)
* Spawn mods (ABPS, MOAR, DONUTS)
* Mods that specifically mention headless client support (That's Lit, UIFixes, etc.)
* Any mod that reasonably changes in-raid behavior, like entering custom quest zones or having to do with inventory (VCQL, Pack'n'Strap, etc.)

**❌ DO NOT INSTALL:**

* RAM/VRAM cleaner mods (RAM Cleaner, VRAM Cleaner, etc.)
* Performance mods (DeClutter, etc.)
* Any other mods not listed in the **YOU CAN INSTALL** section

***

## Troubleshooting

* If you have mods installed and you are running into issues you should first create fresh installs all around and get the headless client working and a test raid completed without any mods other than Fika. Once you have confirmed the headless client works unmodified, you may add mods 5-10 at a time and run test raids between batches of mods.
* If you are crashing or getting errors when joining a headless hosted raid, make sure that Fika is up-to-date for everyone. Verify that you have the latest version of [Fika-Installer](https://github.com/project-fika/Fika-Installer/releases/latest) and use it both in your normal SPT+Fika folder as well as the headless folder to `Update Fika` and `Advanced` -> `Update Fika Headless`.
* If the `Use Headless Host` checkbox is greyed out, it means that the headless client is unavailable. It could be caused by unsupported mods installed in the headless client, networking issues, or other factors. Note that the headless client can only host one raid at a time. Check `BepInEx/LogOutput.log` for errors, especially warnings about incompatible mods.
* If your headless client is failing to load, launch it in Graphics mode by pressing `G` during the startup of `Fika Headless Manager` if possible. If launching in Graphics mode is not possible, look in the `<timestamp> errors.log` in the SPT log folder for hints. Often this is caused by having a malfunctioning or invalid plugin, and sometimes also from missing a plugin that is required by one of the mods on the server.
* See other common issues in [FAQ and Guides](/faqandguides) and [Headless Client FAQ and Common Issues](/faqandguides/headless-client-faq-and-common-issues)


# NAT Punching

Learn more about NAT Punching with Fika.

## What is NAT punching?

NAT punching is a [NAT traversal technique](https://en.wikipedia.org/wiki/NAT_traversal) that allows two devices located behind separate routers to establish a direct peer-to-peer connection. It is particularly useful in cases where port forwarding is not possible due to ISP or network restrictions.

However, NAT punching is not supported on all routers. For instance, **symmetric NAT** routers often prevent successful NAT punching due to the way they handle external port mappings.

## How does it work?

A public server listens for incoming connections from clients and records their external IP addresses and ports. It then introduces each client by sharing the other’s external IP address. For example, `Client 1` receives `Client 2`’s external IP address, and vice versa.

This is when NAT punching occurs: upon receiving `Client 2`’s IP address, `Client 1` begins sending multiple packets (the “punching”) to `Client 2`. At the same time, `Client 2` sends packets to `Client 1`, creating a routing entry in both clients’ routers.

At this point, both routers allow communication through this specific route, which can then be leveraged to host a `Fika` raid.

## Choosing the NAT Punching method

See below for the different methods for NAT Punching.

{% tabs %}
{% tab title="Fika NAT punch server" %}
Fika offers a public NAT punch server to facilitate connection between players and the raid host. You can use the Fika NAT punch server simply by toggling it on inside Fika's configuration menu.

**Pros**

* Easy to use, no set up required

**Cons**

* The public IP address of the raid host and players will be shared with the Fika NAT punch server. We do not collect and share your IP address with any third party.
* Relies on the Fika NAT punch server to be available. Availability is not guaranteed.

<a href="/advanced-features/nat-punching/fika-nat-punch-server" class="button primary" data-icon="up-right-from-square">Use Fika NAT punch server</a>
{% endtab %}

{% tab title="Self-hosted NAT punch server" %}
Fika provides a built-in NAT punch server that will run inside SPT server. It is provided by the Fika-Server plugin.

**Pros**

* Ownership of the NAT punch server
* Privacy (don't share IP address with an external server you do not own)

**Cons**

* Requires configuration and set up
* Requires a VPS or a self-hosted server accessible externally

<a href="/advanced-features/nat-punching/self-hosted-nat-punch-server" class="button primary" data-icon="up-right-from-square">Use self-hosted NAT punch server</a>
{% endtab %}
{% endtabs %}


# Fika NAT punch server

Step-by-step process for hosting a Fika server using Fika's public NAT punch server

{% hint style="danger" %}
**DISCLAIMER**

The Fika NAT punch server is a public service offered by the Fika team, free of charge. Availability is not guaranteed.

By using this service, you agree that your public IP address will be shared with the Fika NAT punch server. This is absolutely necessary for NAT punching to work. We do NOT collect and share your IP address with any third party. If you don't like that, consider using the [self-hosted NAT punch server](/advanced-features/nat-punching/self-hosted-nat-punch-server) instead.
{% endhint %}

## Requirements

* Both the raid host and any players connecting via NAT punching must use a router that supports Full-Cone NAT, as this type is required for proper connectivity. You can check your router’s NAT type by searching online for your specific router model.

## Limitations

The NAT punch server only facilitate connection when joining a raid. It does not allow to join the SPT server itself.

{% hint style="warning" %}
NAT Punching does NOT work on all routers. It depends on the NAT type of your router. If you or a player cannot connect then you can assume that your router or the player's router is incompatible and you should consider an alternative option such as [Hosting using a VPN](/hosting-a-fika-server/host-using-a-vpn).
{% endhint %}

## How to enable the public Fika NAT Punch server

Only the raid host needs to follow the steps below.

{% stepper %}
{% step %}

### Press F12 when in main menu

{% endstep %}

{% step %}

### Enable advanced settings

Check the "Advanced settings" box.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F1hThkucXm39ZvtPstuQT%2Fimage.png?alt=media&amp;token=19be2e29-4621-40b0-af1a-f8d61b38cb00" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Enable NAT Punching

Check both "Use NAT Punching" and "Use Fika NAT Punch Server".

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fdjpv8fWR6LDXMZUkNDze%2Fimage.png?alt=media&amp;token=5148822c-7be4-4a02-a91e-e45020409245" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Close the configuration panel

{% endstep %}

{% step %}

### Host a raid and wait for players to join

The Fika NAT punch server will take care of the rest.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Players connecting to your server do NOT need to enable these settings! These settings are only for the raid host.
{% endhint %}


# Self-hosted NAT punch server

Step-by-step process for setting up a dedicated SPT server with NAT punching.

## Requirements

* The SPT server must be hosted on an externally accessible machine, such as a VPS.
* Both the raid host and any players connecting via NAT punching must use a router that supports Full-Cone NAT, as this type is required for proper connectivity. You can check your router’s NAT type by searching online for your specific router model.

## Limitations

The NAT punch server only facilitate connection when joining a raid. It does not allow to join the SPT server itself.

## Notes

This guide covers the installation process for Windows only. Linux is not covered in this article but the principle is the same. Check out our dedicated Linux channel in our Discord for more information.

## Installation

{% stepper %}
{% step %}

### Set up a public Windows-based server

A publicly accessible server is required for NAT punching. It is recommended to rent an affordable Windows-based VPS to host the `SPT Server`; providers listed on [**LowEndBox**](https://lowendbox.com/) are a good starting point for low-cost options.

If you are uncertain whether NAT punching will work with your network configuration, you can provision a temporary VPS using [**Kamatera**](https://www.kamatera.com/), which offers hourly billing — making it a cost-effective solution for testing.
{% endstep %}

{% step %}

### Download the latest `SPT` standalone release

Obtain the latest standalone `SPT` release [here](https://github.com/sp-tarkov/build/releases/). The download link will be in the release notes.
{% endstep %}

{% step %}

### Extract the `SPT` archive in a new empty `SPT` folder

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F6FA011Jvd9jVr2Lv76uW%2Fimage.png?alt=media&amp;token=f8f92b24-09a5-4b09-bd73-0d721e1a9a0b" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Download the latest `Fika-Server` standalone release

Obtain the latest `Fika-Server` standalone release [here](https://github.com/project-fika/Fika-Server-CSharp/releases).
{% endstep %}

{% step %}

### Extract the Fika-Server archive in the root of your `SPT` installation folder

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FpLMcnOGNmjDXJogh7KK1%2Fimage.png?alt=media&amp;token=d32db5d9-9dc5-44d6-a43d-954472651fae" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server.exe` to generate the Fika Server configuration file

`SPT.Server.exe` is located inside the `SPT` sub folder of your `SPT` installation folder.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FH6qT9q2QwFS3HihuHeLG%2Fimage.png?alt=media&amp;token=bf129e88-c404-4eb1-a32f-2590b12d140c" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Wait for `SPT` server to be fully loaded then close it

Close `SPT` server when you see `Server has started, happy playing`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FvDev6qKe0XemURDwgXw0%2Fimage.png?alt=media&amp;token=c0c22086-e760-4439-8a72-f7eabeeb112f" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Enable NAT Punching in Fika Server

This setting controls if the `Nat Punch Server` should run on your SPT server.

* Navigate to `SPT\user\mods\fika-server\assets\configs`.
* Open `fika.jsonc` with your preferred text editor software (`Notepad++` is recommended).
* Find the `natPunchServer` section and set `enable` to `true`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FqUs3sbtoLNaCz9rjhB0K%2Fimage.png?alt=media&amp;token=c3e6fe5a-999f-4bd7-8ef4-e0922c24edac" alt=""><figcaption></figcaption></figure>

* Save and exit the text editor.
  {% endstep %}

{% step %}

### Start `SPT.Server.exe`

Validate that the `Nat Punch Server` successfully loaded.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fuaw0FLp0GiEN4r1QAVv0%2Fimage.png?alt=media&amp;token=6053a214-b36a-4cba-8527-dfdb78157ee6" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate your network configuration

Make sure that the following ports are port forwarded and opened in your server firewall:

* 6969 TCP (SPT Server)
* 6790 UDP (Nat Punch Server)
  {% endstep %}

{% step %}

### Start `SPT.Launcher` on your computer

We assume you already have a working Fika installation or you know how to set up one. If you don't, click [here](/installing-fika/installation) for Fika installation steps.
{% endstep %}

{% step %}

### Configure your server IP in `SPT Launcher`

`SPT Launcher` needs to connect to the `SPT` server on your VPS/public server. Other players will also need to do the following steps.

* Click the `Settings` button at the top right corner.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FqwHM3gxlwjEsrugHTtc0%2Fimage.png?alt=media&amp;token=cc89fafb-21a4-494f-8d55-cdcd05fb5cd8" alt=""><figcaption></figcaption></figure>

* Check the `Developer Mode` box then enter your server IP address in the URL box. Do not remove `https://`, do not add a slash at the end.&#x20;
* Press the arrow key at the top right corner to save your settings.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FRJRDafOFXrz8sQBMXNfo%2Fimage.png?alt=media&amp;token=1bbe6ee9-c1fe-42da-aea8-8a66af62e7ea" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the game

Press `Start Game` to launch the game.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FVhkOgEbLlzyx9kazRxLl%2Fimage.png?alt=media&amp;token=94b6c451-cdb1-41df-8281-35dcdc75496a" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Enable NAT Punching in Fika (raid host only)

This setting indicates that any player connecting to your raid must use NAT punching. It is a client-side setting, meaning it only applies to **you**, the raid host. Other players do **not** need to enable this setting unless they intend to host a raid without port forwarding.

* Press F12 to bring up the configuration manager.
* Check the `Advanced settings` box.
* Check the `Nat Punching` box to enable NAT punching.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Ft1OarjTls2gSaQroqota%2Fimage.png?alt=media&amp;token=0b50a639-d956-4d27-9192-cbe6ee913202" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Host a raid and wait for other players to connect

Navigate the menus and host a raid. You should see that your server was added to the Nat Punch server list in the `SPT Server` console.&#x20;

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FjwVW32YjagwV9X7sDSoD%2Fimage.png?alt=media&amp;token=3c1abbfb-fefd-41b0-bdef-29299c45589e" alt=""><figcaption></figcaption></figure>

The `Nat Punch Server` will introduce the external IP address of your computer to players joining your raid.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FTjRj5Ur6UvS5Zj8QWdh5%2Fimage.png?alt=media&amp;token=85bf04b3-ef11-45f9-b7e2-dc54b8b501f5" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start the raid when all players are connected

Start the raid when all players are connected and ready to go.
{% endstep %}
{% endstepper %}

## Headless client

To enable NAT punching for the `headless client`:

* Make sure you followed all the steps above.
* Navigate to `BepInEx\config` of your `headless client`.
* Open `com.fika.core.cfg` with your preferred text editor.
* Search for the parameter `Use NAT Punching` and set to `true`.
* Save and close the text editor.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FipTMnvlyntkwqR0YwujD%2Fimage.png?alt=media&amp;token=aa2c612b-dab1-4d11-95a8-07c46a0232a4" alt=""><figcaption></figcaption></figure>


# Web App

How to install the Fika Web App

## Introduction

{% hint style="info" %}
While this web app is designed to make server administration easier in the long run, the initial setup and maintenance require advanced technical knowledge.

The application runs as a fully isolated Docker container. To ensure stability and security, proficiency with container technology is essential. If you are strictly looking for a "plug-and-play" solution and are unfamiliar with Docker, this solution may not be the best fit for your needs.

A Windows-based solution is in progress, but is not yet available.
{% endhint %}

## What is the web app?

FikaWebApp is a ReactTS web application designed to help you administrate your server.\
Features included are:

* Creating moderator/admin accounts
* Sending items (supports modded items)
  * Send items to everyone
  * Send items at a specific date
* Flea banning
* Statistics page (WIP)
* Administrate connected headless clients
* Uploading/downloading profiles
* Uploading/downloading files

## Installation

The Docker image can under [packages](https://github.com/orgs/project-fika/packages?repo_name=Fika-Server-CSharp) on the server repository.

Use your preferable way of running the docker image. It's recommended to use the `compose.yml` below as certain variables are required to run the app, unless you are certain of what you are doing.

After running, access the site at `http://localhost:8080/` (unless you use a reverse proxy) and login using the standard account:

* **User**: admin
* **Password**: Admin123!

{% hint style="warning" %}
**Change your password after logging in!**
{% endhint %}

### Example compose

{% code title="compose.yml" fullWidth="false" %}

```yml
services:
  fika-webapp:
    image: ghcr.io/project-fika/fika-webapp:latest
    container_name: fika-webapp
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - FikaConfig__APIKey=YOUR_API_KEY
      - FikaConfig__BaseUrl=https://localhost:6969
    volumes:
      - ./data:/app/Data
      - ./logs:/app/Logs
```

{% endcode %}

The compose above will let you run the web app, and access it without `https`.\
It is, however, recommended to use a reverse proxy, e.g. Traefik.

Make sure to read all the lines carefully, and change the required variables which are:

1. `API_KEY`
2. `BASE_URL`

## Updating

If you used the compose files above, the volume will automatically be safe when updating. To update, simply re-run the compose and the latest image will be fetched and installed. Your data will be safe in the `webappdata` folder.

If you ***did not use*** the compose, make sure to backup the entire data folder in `/app/data`!

{% hint style="danger" %}
Failure to use the compose, or backup the folder will result in a *permanent* data loss after updating!
{% endhint %}


# Fika API

All our APIs (last updated for SPT 4.0, Fika 2.0)

## Overview

An API key is automatically generated on first launch. You can find it in the `fika.jsonc` file in the configuration folder.

Use the API key to authenticate when making request. You also need to add the `requestcompressed` header with a value of `0`.

<details>

<summary>Authentication example for C#</summary>

```csharp
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", config.APIKey);
client.DefaultRequestHeaders.Add("requestcompressed", "0");
```

</details>

In e.g. Postman, the authentication type is "API Key", with the key being "`Authorization`" and the value being "`Bearer {apiKey}`".

## Get

### fika/api/items

Returns all items from the SPT database, with the MongoID being the identifier, and the name, description and stackable amount being values.\
\
Example response:

{% code fullWidth="false" %}

```json
{
    "items": {
        "5447a9cd4bdc2dbd208b4567": {
            "name": "Colt M4A1 5.56x45 assault rifle",
            "description": "The Colt M4A1 carbine is a fully automatic variant of the basic M4 Carbine and was primarily designed for special operations use.\nHowever, U.S. Special Operations Command (USSOCOM) was soon to adopt the M4A1 for almost all special operations units, followed later by general introduction of the M4A1 into service with the U.S. Army and Marine Corps.",
            "stackable": 10
        }
}
```

{% endcode %}

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "GetItemsResponse",
  "type": "object",
  "properties": {
    "items": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/ItemData"
      }
    }
  },
  "required": ["items"],

  "$defs": {
    "ItemData": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "stackable": {
          "type": "integer",
          "description": "Number of items that can stack together (StackAmount)."
        }
      },
      "required": ["name", "description", "stackable"]
    }
  }
}

```

</details>

### fika/api/raids

Returns all active raids.

Example response:

```json
{
  "64f92bdacb123456789abcde": {
    "ips": ["192.168.1.10"],
    "serverGuid": "2fbb7ba6-327e-4c58-8f87-75e43da5a5f5",
    "port": 7070,
    "hostUsername": "PlayerOne",
    "timestamp": 1730840102,
    "crc32": 123456789,
    "gameVersion": "1.0.0",
    "raidConfig": {},
    "locationData": {},
    "status": 1,
    "timeout": 300,
    "players": {
      "64f92bdae8123456789aaaaa": {
        "groupId": "group123",
        "isDead": false,
        "isSpectator": false
      }
    },
    "side": 0,
    "time": 0,
    "raidCode": "ABCD1234",
    "natPunch": true,
    "isHeadless": false,
    "raids": 5
  }
}
```

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "MatchesResponse",
  "type": "object",
  "description": "Dictionary<string, FikaMatch>",
  "additionalProperties": {
    "$ref": "#/$defs/FikaMatch"
  },

  "$defs": {
    "FikaMatch": {
      "type": "object",
      "properties": {
        "ips": {
          "type": "array",
          "items": { "type": "string" }
        },
        "serverGuid": {
          "type": "string",
          "format": "uuid"
        },
        "port": {
          "type": "integer"
        },
        "hostUsername": {
          "type": "string"
        },
        "timestamp": {
          "type": "integer"
        },
        "crc32": {
          "type": "integer",
          "minimum": 0
        },
        "gameVersion": {
          "type": "string"
        },
        "raidConfig": {
          "description": "Ignored type placeholder.",
          "type": "object"
        },
        "locationData": {
          "description": "Ignored type placeholder.",
          "type": "object"
        },
        "status": {
          "$ref": "#/$defs/EFikaMatchStatus"
        },
        "timeout": {
          "type": "integer"
        },
        "players": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/FikaPlayer"
          }
        },
        "side": {
          "$ref": "#/$defs/EFikaSide"
        },
        "time": {
          "$ref": "#/$defs/EFikaTime"
        },
        "raidCode": {
          "type": "string"
        },
        "natPunch": {
          "type": "boolean"
        },
        "isHeadless": {
          "type": "boolean"
        },
        "raids": {
          "type": "integer"
        }
      },
      "required": [
        "raidConfig",
        "locationData",
        "status",
        "side",
        "time"
      ]
    },

    "FikaPlayer": {
      "type": "object",
      "properties": {
        "groupId": { "type": "string" },
        "isDead": { "type": "boolean" },
        "isSpectator": { "type": "boolean" }
      },
      "required": ["groupId", "isDead", "isSpectator"]
    },

    "EFikaMatchStatus": {
      "type": "integer",
      "enum": [0, 1, 2],
      "description": "0=LOADING, 1=IN_GAME, 2=COMPLETE"
    },

    "EFikaSide": {
      "type": "integer",
      "enum": [0, 1],
      "description": "0=PMC, 1=Savage"
    },

    "EFikaTime": {
      "type": "integer",
      "enum": [0, 1],
      "description": "0=CURR, 1=PAST"
    }
  }
}

```

</details>

### fika/api/headless

Returns all active headless clients.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "GetHeadlessResponse",
  "type": "object",
  "properties": {
    "headlessClients": {
      "type": "array",
      "items": { "$ref": "#/$defs/OnlineHeadless" }
    }
  },
  "required": ["headlessClients"],

  "$defs": {
    "OnlineHeadless": {
      "type": "object",
      "properties": {
        "profileId": { "type": "string" },
        "nickname": { "type": "string" },
        "state": { "$ref": "#/$defs/EHeadlessState" },
        "players": { "type": "integer" }
      },
      "required": ["profileId", "nickname", "state", "players"]
    },
    "EHeadlessState": {
      "type": "integer",
      "enum": [0, 1],
      "description": "0 = Ready, 1 = NotReady"
    }
  }
}
```

</details>

### fika/api/heartbeat

Checks whether the server is running. Primarily used by the WebApp.

### fika/api/players

Returns all online players.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "GetOnlinePlayersResponse.schema.json",
  "title": "GetOnlinePlayersResponse",
  "type": "object",
  "properties": {
    "players": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/OnlinePlayer"
      }
    }
  },
  "required": ["players"],

  "$defs": {
    "OnlinePlayer": {
      "type": "object",
      "properties": {
        "profileId": {
          "type": "string"
        },
        "nickname": {
          "type": "string"
        },
        "level": {
          "type": "integer"
        },
        "location": {
          "$ref": "#/$defs/EFikaLocation"
        }
      },
      "required": ["profileId", "nickname", "level", "location"]
    },

    "EFikaLocation": {
      "type": "integer",
      "description": "Enumeration representing player location.",
      "enum": [
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
      ],
      "enumNames": [
        "None",
        "Hideout",
        "Factory",
        "Customs",
        "Woods",
        "Shoreline",
        "Interchange",
        "Reserve",
        "Streets",
        "Lighthouse",
        "GroundZero",
        "Laboratory",
        "Labyrinth"
      ]
    }
  }
}
```

</details>

### fika/api/rawprofile

Returns a raw profile in JSON format.

Input:

<table data-full-width="false"><thead><tr><th>Key</th><th>Value</th><th>Description</th></tr></thead><tbody><tr><td>profileId</td><td>{validMongoID}</td><td>The MongoID to return a raw profile of.</td></tr></tbody></table>

Example input:

`{baseUrl}/fika/api/rawprofile?profileId=68e8f63d941b8a1c94c1d8bf`

## Post

### fika/api/fleaban

Bans a player from the flea for X amount of days. 0 = infinite.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Flea Ban Request",
  "description": "Schema for banning a player from the flea market for a specified number of days.",
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "Unique identifier for the player's profile."
    },
    "amountOfDays": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of days the player is banned. 0 means the ban is infinite."
    }
  },
  "required": ["profileId", "amountOfDays"],
  "additionalProperties": false
}
```

</details>

### fika/api/createheadlessprofile

Creates one headless profile. Used by the installer, not recommended to be used.

### fika/api/logout

Logs out the given MongoID from the game.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Logout Request",
  "description": "Schema for logging out a player from the game using their MongoID profile ID.",
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The MongoDB ObjectID of the player to log out."
    }
  },
  "required": ["profileId"],
  "additionalProperties": false
}
```

</details>

### fika/api/restartheadless

Restarts the headless with the given MongoID.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Restart Headless Request",
  "description": "Schema for restarting the headless instance associated with a given player profile ID.",
  "type": "object",
  "properties": {
    "profileId": {
      "type": "string",
      "description": "The MongoDB ObjectID of the player whose headless instance should be restarted."
    }
  },
  "required": ["profileId"],
  "additionalProperties": false
}
```

</details>

### fika/api/senditem

Sends X amount of items to the given MongoID.

<details>

<summary>Schema</summary>

{% code fullWidth="false" %}

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Send Item Request",
  "description": "Schema for sending an item to a player with a given MongoID profile ID.",
  "type": "object",
  "properties": {
    "itemTpl": {
      "type": "string",
      "description": "Template ID of the item being sent."
    },
    "amount": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of items to send."
    },
    "message": {
      "type": "string",
      "maxLength": 255,
      "description": "Optional message sent with the item. Can be empty."
    },
    "fir": {
      "type": "boolean",
      "description": "Whether the item is marked as Found In Raid (FIR)."
    },
    "expirationDays": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of days before the message expires."
    },
    "profileId": {
      "type": "string",
      "description": "The MongoDB ObjectID of the player to send the item to."
    }
  },
  "required": [
    "itemTpl",
    "amount",
    "message",
    "fir",
    "expirationDays",
    "profileId"
  ],
  "additionalProperties": false
}
```

{% endcode %}

</details>

### fika/api/senditemtoall

Sends X amount of items to the given MongoIDs.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Send Item To Multiple Players Request",
  "description": "Schema for sending items to multiple players using their MongoID profile IDs.",
  "type": "object",
  "properties": {
    "itemTpl": {
      "type": "string",
      "description": "Template ID of the item being sent."
    },
    "amount": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of items to send to each player."
    },
    "message": {
      "type": "string",
      "maxLength": 255,
      "description": "Optional message sent with the item. Can be empty."
    },
    "fir": {
      "type": "boolean",
      "description": "Whether the item is marked as Found In Raid (FIR)."
    },
    "expirationDays": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of days before the message expires."
    },
    "profileIds": {
      "type": "array",
      "description": "List of MongoDB ObjectIDs representing the player profiles to send the items to.",
      "items": {
        "type": "string"
      },
      "minItems": 1
    }
  },
  "required": [
    "itemTpl",
    "amount",
    "message",
    "fir",
    "expirationDays",
    "profileIds"
  ],
  "additionalProperties": false
}
```

</details>

### fika/api/sendmessage

Sends a message to a MongoID.

<details>

<summary>Schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Send Message Request",
  "description": "Schema for sending a message to a player using their MongoID profile ID.",
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "maxLength": 255,
      "description": "Message to send to the player. Can be empty."
    },
    "profileId": {
      "type": "string",
      "description": "The MongoDB ObjectID of the player to send the message to."
    }
  },
  "required": ["message", "profileId"],
  "additionalProperties": false
}
```

</details>


# Creating Fika-Compatible Mods

Updated for 4.0

## Fika Events

Fika has a lot of events that you can subscribe to, which makes it easier to run code at certain key moments of the raid. To subscribe to an event, use:

{% code overflow="wrap" %}

```cs
/// <summary>
/// Subscribes a callback to a specific type of Fika event.
/// </summary>
/// <typeparam name="TEvent">The type of the event to subscribe to.</typeparam>
/// <param name="callback">The callback to invoke when the event is dispatched.</param>
public static void SubscribeEvent<TEvent>(Action<TEvent> callback) where TEvent : FikaEvent
```

{% endcode %}

To unsubscribe, use:

{% code overflow="wrap" %}

```cs
/// <summary>
/// Unsubscribes a callback from a specific type of Fika event.
/// </summary>
/// <typeparam name="TEvent">The type of the event to unsubscribe from.</typeparam>
/// <param name="callback">The callback to remove from the event subscription.</param>
public static void UnsubscribeEvent<TEvent>(Action<TEvent> callback) where TEvent : FikaEvent
```

{% endcode %}

The event triggered will usually pass an important object related to the event, e.g. `FikaNetworkManagerCreatedEvent` passes a `IFikaNetworkManager` (named `Manager` in the object). This object can then be accessed if needed.

You can read the source code [here](https://github.com/project-fika/Fika-Plugin/tree/main/Fika.Core/Modding) to find all events.

## Registering Packets

To register packets, subscribe to the `FikaNetworkManagerCreatedEvent` and access the `IFikaNetworkManager`. In the manager you can call either of these methods:

{% code overflow="wrap" fullWidth="false" %}

```cs
/// <summary>
/// Registers a packet to the <see cref="NetPacketProcessor"/>.
/// </summary>
/// <typeparam name="T">The packet type.</typeparam>
/// <param name="handle">The <see cref="Action"/> to run when receiving the packet.</param>
void RegisterPacket<T>(Action<T> handle) where T : INetSerializable, new();
```

{% endcode %}

<pre class="language-cs" data-overflow="wrap" data-full-width="false"><code class="lang-cs">/// &#x3C;summary>
/// Registers a packet to the &#x3C;see cref="NetPacketProcessor"/> with user data.
/// &#x3C;/summary>
/// &#x3C;typeparam name="T">The packet type.&#x3C;/typeparam>
/// &#x3C;typeparam name="TUserData">The user data type.&#x3C;/typeparam>
/// &#x3C;param name="handle">The &#x3C;see cref="Action"/> to run when receiving the packet.&#x3C;/param>
<strong>void RegisterPacket&#x3C;T, TUserData>(Action&#x3C;T, TUserData> handle) where T : INetSerializable, new();
</strong></code></pre>

The `INetSerializable` needs to be a packet that you have created, and these methods are invoked when that packet is received. The second method also passes the `NetPeer`, which is useful on the `FikaServer`. You handle the logic however you want when receiving the packet with these methods.

{% hint style="danger" %}
Failing to register a packet will result in endless `exceptions` being thrown. Please register your packets correctly!
{% endhint %}

## Creating a Packet

To create a packet, implement the `INetSerializable` interface into a new `class`. For packets that are sent often, I highly recommend using a `struct`. Add the data that you need in the form of `Field` and make all of them `Public`. Use the `Serialize()` and `Deserialize()` methods to write/read data. You can find an example [here](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Networking/Packets/Communication/BotStatePacket.cs), which also includes how to write an `enum`. There are also a lot of extensions to write EFT/Unity specific data (e.g. `Vector3`) that you can find [here](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Networking/FikaSerializationExtensions.cs).

Do not instantiate and send new collections in packets that are sent often, e.g. `List<T>` or `T[]`. The allocations will become expensive. Fika has an interface `IReusable` that you can use to reuse a single instance of a packet, and only mutate the collections that exist in it.

{% code overflow="wrap" %}

```csharp
/// <summary>
/// Registers a reusable packet to the <see cref="NetPacketProcessor"/> with user data. Reusable uses the same instance throughout the lifetime of the <see cref="NetManager"/>.
/// Custom types must be registered with <see cref="RegisterCustomType{T}(Action{NetDataWriter, T}, Func{NetDataReader, T})"/> first.
/// </summary>
/// <typeparam name="T">The packet type.</typeparam>
/// <typeparam name="TUserData">The user data type.</typeparam>
/// <param name="handle">The <see cref="Action"/> to run when receiving the packet.</param>
void RegisterReusable<T, TUserData>(Action<T, TUserData> handle) where T : class, IReusable, new();
```

{% endcode %}

An example of these packets can be found [here](https://github.com/project-fika/Fika-Plugin/blob/47a9d37aa40e2e7cc0b9628c7114115cd3805cd4/Fika.Core/Networking/Packets/World/WorldPacket.cs). Create the class somewhere, keep track of it and reuse it. You can find an example of that in the [FikaClientWorld](https://github.com/project-fika/Fika-Plugin/blob/47a9d37aa40e2e7cc0b9628c7114115cd3805cd4/Fika.Core/Main/ClientClasses/FikaClientWorld.cs).

## Sending a Packet

To send a packet, you need a `IFikaNetworkManager`. This is either a `FikaServer` or `FikaClient` that you can access with the `Comfort.Common` namespace using `Singleton<IFikaNetworkManager>.Instance`. To determine whether you are a server or client, use `FikaBackendUtils.IsServer`.

Use this method to send packets:

{% code overflow="wrap" %}

```cs
/// <summary>
/// Sends a packet.
/// </summary>
/// <typeparam name="T">The type of packet to send, which must implement <see cref="INetSerializable"/>.</typeparam>
/// <param name="packet">The packet instance to send, passed by reference.</param>
/// <param name="deliveryMethod">The delivery method (reliable, unreliable, etc.) to use for sending the packet.</param>
/// <param name="broadcast">If <see langword="true"/>, the packet will be sent to multiple recipients; otherwise, it will be sent to a single target (server is always broadcast).</param>
void SendData<T>(ref T packet, DeliveryMethod deliveryMethod, bool broadcast = false) where T : INetSerializable;
```

{% endcode %}

The `broadcast` argument determines whether it will be sent to *all other clients*. As the server, this is always `true`.

If you want to send to just one specific `NetPeer`, e.g. after receiving a packet and you want to respond to that peer:

{% code overflow="wrap" %}

```csharp
/// <summary>
/// Sends a packet of data directly to a specific peer.
/// </summary>
/// <typeparam name="T">The type of packet to send, which must implement <see cref="INetSerializable"/>.</typeparam>
/// <param name="packet">The packet instance to send, passed by reference.</param>
/// <param name="deliveryMethod">The delivery method (reliable, unreliable, etc.) to use for sending the packet.</param>
/// <param name="peer">The target <see cref="NetPeer"/> that will receive the packet.</param>
/// <remarks>
/// Should only be used as a <see cref="FikaServer"/>, since a <see cref="FikaClient"/> only has one <see cref="NetPeer"/>.
/// </remarks>
void SendDataToPeer<T>(ref T packet, DeliveryMethod deliveryMethod, NetPeer peer) where T : INetSerializable;
```

{% endcode %}

{% @mermaid/diagram content="flowchart LR

A\[Send from Client 1] --->|Packet| B\[Receive on Server]
B --> C{Broadcast?}
C -->|Yes| D\[Send to Client 2 & 3]
C -->|No| E\[Done]" %}

{% hint style="warning" %}
A client only has one `NetPeer` and it is ***always*** the server! A client is never aware of other clients.
{% endhint %}

Some specific functions are class specific, and cannot be called from the interface singleton. You can access the specific `FikaServer` or `FikaClient` using e.g. `Singleton<FikaServer>.Instance`.

The specific methods are:

#### Client

{% code overflow="wrap" %}

```csharp
/// <summary>
/// Sends a reusable packet
/// </summary>
/// <typeparam name="T">The <see cref="IReusable"/> to send</typeparam>
/// <param name="packet">The <see cref="INetSerializable"/> to send</param>
/// <param name="deliveryMethod">The deliverymethod</param>
/// <remarks>
/// Reusable will always be of type broadcast when sent from a client
/// </remarks>
public void SendReusable<T>(T packet, DeliveryMethod deliveryMethod) where T : class, IReusable, new()
```

{% endcode %}

#### Server

{% code overflow="wrap" %}

```csharp
public void SendReusableToAll<T>(T packet, DeliveryMethod deliveryMethod, NetPeer peerToExlude = null) where T : class, IReusable, new()
```

{% endcode %}

***

## Inventory Replication

Fika will automatically replicate all inventory actions, as long as you pass the operation through the `InventoryController.vmethod_1`. Every player has an inventory controller property (`EFT.Player.InventoryController`), ***use it!*** Even without Fika, do not try to cirumvent this method and always pass them through the controller.\
\
Each operation has a constructor you can find in the assembly. You can look at these to see how to properly create and execute and inventory operation. Do not call the result directly! Use it to create the operation (I've seen this mistake a lot in the past from mod developers), and run it on the controller.\
\
Some examples you can look for the subtypes of are: `IExecute`, `IRollback`, `IRaiseEvents`.

{% hint style="danger" %}
If you circumvent the intended way of executing inventory operations, you will inevitably cause desync!
{% endhint %}

***

## Snapshotting

This guide explains the implementation and usage of the `Snapshotter<T>` system made for Fika. This module provides a zero-allocation, high-fidelity interpolation and extrapolation engine designed for high-tick-rate synchronization.\
\
It is highly recommended to use the `ThrottledMono` to send the data at a tickrate of 20, i.e. 20 times per second on average. Why would I use this and the snapshotter? To save bandwidth and CPU usage. See [#general-information-about-data](#general-information-about-data "mention") and [#interpolation](#interpolation "mention") for more information.

#### Key Features

* Zero-Allocation: Utilizes generic value-type specialization and `ref` semantics to ensure no Garbage Collection (GC) overhead during the hot path.
* Adaptive Jitter Buffer: Dynamically adjusts interpolation delay based on real-time network variance (Jitter) using an asymmetric EMA.
* Clock Synchronization: Automatically aligns local client time with server time using a smoothed offset.
* Validation: Built-in protection against out-of-order and duplicate UDP packets.

### Implementation

1. Define Your Data<br>

   <pre class="language-csharp" data-title="PlayerSnapshot.cs" data-full-width="false"><code class="lang-csharp">public struct PlayerSnapshot : ISnapshot
   {
       // ISnapshot implementation
       public double RemoteTime { get; set; }
       public double LocalTime { get; set; }

       // your custom data
       public Vector3 Position;
       public Quaternion Rotation;

       public PlayerSnapshot(Vector3 pos, Quaternion rot, double remote, double local)
       {
           Position = pos;
           Rotation = rot;
           RemoteTime = remote;
           LocalTime = local;
       }
   }
   </code></pre>

2. Initialize the Snapshotter<br>

   ```csharp
   // store this in your entity controller or state manager
   private readonly Snapshotter<PlayerSnapshot> _snapshotter = new();
   ```

### Usage

#### Adding Data

When a packet arrives from the network, pass it directly to the snapshotter. The system will internally handle clock synchronization and jitter estimation.<br>

```csharp
public void OnPacketReceived(PlayerSnapshot newSnapshot)
{
    // snapshot.LocalTime should be the exact time the packet hit the client
    // i highly recommend adding that through the constructor, and calling NetworkTimeSync.NetworkTime
    _snapshotter.AddSnapshot(in newSnapshot);
}
```

#### Sampling for Rendering

In your `Update` loop, sample the buffer to find the correct interpolation indices and the `t` (0.0 to 1.0) progress value.

{% hint style="info" %}
**Performance Tip**: Always use `ref readonly var` when retrieving snapshots. This prevents the **CPU** from copying the snapshot data (which can be 60+ bytes) and instead points directly to the data inside the buffer.
{% endhint %}

```csharp
private void Update()
{
    double currentTime = NetworkTimeSync.NetworkTime;
    
    // 1. ask the snapshotter where we are in the timeline
    var state = _snapshotter.GetInterpolationIndices(currentTime, out int from, out int to, out float t);

    // 2. handle the "Stop" case first
    if (state == EBufferState.Stale)
    {
        // network timeout or buffer empty. stop moving.
        return;
    }

    // 3. retrieve the snapshots. 
    // in 'Extrapolating', both 'to' and 'from' are the newest packet.
    // t will be the time (in seconds) elapsed since that packet.
    ref readonly var snapFrom = ref _snapshotter.GetSnapshot(from);

    if (state == EBufferState.Interpolating)
    {
        ref readonly var snapTo = ref _snapshotter.GetSnapshot(to);
        
        // standard blending between two real points
        transform.position = Vector3.LerpUnclamped(snapFrom.Position, snapTo.Position, t);
        transform.rotation = Quaternion.SlerpUnclamped(snapFrom.Rotation, snapTo.Rotation, t);
    }
    else if (state == EBufferState.Extrapolating)
    {
        // 't' here is the delta time since the last packet.
        // we use the last known velocity to guess the new position.
        Vector3 velocity = snapFrom.Velocity; 
        transform.position = snapFrom.Position + (velocity * t);
        
        // keep rotation static during extrapolation to prevent spinning
        transform.rotation = snapFrom.Rotation;
    }
}
```

#### Technical Performance

The system is optimized at the IL (Intermediate Language) level. By using `where T : struct`, the JIT compiler devirtualizes interface calls and inlines property getters.

<table data-full-width="false"><thead><tr><th>Metric</th><th>Result</th></tr></thead><tbody><tr><td>Memory Allocation</td><td>0 Bytes</td></tr><tr><td>Insertion Speed</td><td>~5.8ns</td></tr><tr><td>Sampling Speed</td><td>~4.2ns</td></tr><tr><td>Algorithm</td><td>O(log N) Binary Search</td></tr></tbody></table>

## General Information About Data

{% hint style="info" %}
Keep in mind that performance and bandwidth is not free! Do not send redundant data every `Update()` unless you have to.&#x20;

Fika has a class that you can inherit called `ThrottledMono`, where you can set an `UpdateRate` which is how many times it should update per second. This can dramatically increase performance and reduce bandwidth used.
{% endhint %}

### Calculating Packet Size (UDP with Headers)

When sending data over a network using UDP, each packet consists of:

1. Your payload (the actual data, e.g., floats)
2. Packet-specific overhead (1–4 bytes depending on the type, e.g. `Unreliable` or `ReliableOrdered`)
3. UDP header (8 bytes)
4. IP header (20–60 bytes, depending on IPv4 options)

It’s important to account for all headers, not just the payload, because small payloads can become inefficient due to header overhead.

#### Formula

Let:

* ***N*** = number of elements being sent
* ***S***<sub>element</sub> = size of one element in bytes (e.g., 4 bytes for a `float`)
* ***H***<sub>packet​</sub> = packet-specific overhead (1–4 bytes)
* ***H***<sub>UDPH​</sub> = UDP header size (8 bytes)
* ***H***<sub>IPH</sub>​ = IP header size (20–60 bytes)

Then, the **total packet size in bytes** is:

$$
\text{Packet Size (bytes)} = N \times S\_{\text{element}} + H\_{\text{packet}} + H\_{\text{udp}} + H\_{\text{ip}}
$$

To convert to **bits**:

$$
\text{Packet Size (bits)} = 8 \times \Big( N \cdot S\_{\text{element}} + H\_{\text{packet}} + H\_{\text{udp}} + H\_{\text{ip}} \Big)
$$

***

#### Example

Suppose you are sending a `Vector3`, which is 3 floats (4 bytes each), with 2 bytes of packet-specific overhead, 8 bytes UDP header, and 20 bytes IP header:

$$
Packet Size=3×4+2+8+20=42 bytes
$$

$$
Packet Size in bits=42×8=336 bits
$$

Even this small payload, if sent frequently (e.g., every frame in a game), can consume significant bandwidth. Notice that even though the payload is only 12 bytes, headers increase the total packet size almost ***4×***.\
\
Now imagine this being unthrottled, and the client is running at 120 FPS:

<mark style="color:$primary;">We already have:</mark>

$$
Packet Size=42 bytes
$$

<mark style="color:$primary;">If we send 120 packets per second:</mark>

$$
Data per second (bytes)=42×120
$$

#### Step-by-step

* Packet size is 42 bytes.
* Sending 120 packets per second.
* Multiply packet size by number of packets: 42 × 120.

<mark style="color:$primary;">Break it down:</mark>&#x20;

$$
42×120=42×(12×10)=(42×12)×10
$$

$$
42×12=504
$$

$$
504×10=5,040
$$

<mark style="color:$primary;">Convert to bits:</mark>

$$
5,040×8=40,320 bits per second (bps)
$$

This is ***a lot*** of wasted bandwidth and CPU usage. Unless it's critical, do not send data every tick. Rather, interpolate values on the receiving end if needed. Breaking it down further:

$$
Data transferred=5KB/s×60s=300KB
$$

That is 300KB per minute for ***one***, ***single*** `Vector3`. That is almost ¼ of the bandwidth that Fika sends for ***all bots states*** every minute.

<mark style="color:$primary;">The size of one entire player state (52 bytes), 20/s:</mark>

$$
52×20=1040bytes/sec per entity
$$

<mark style="color:$primary;">Assuming we have 20 bots:</mark>

$$
1040×20=20,800bytes/sec total
$$

<mark style="color:$primary;">Now per minute:</mark>

$$
20,800×60=1,248,000bytes/minute ≈ 1,248MB/minute (1.19 MiB)
$$

***

### Interpolation

As you can see from the breakdown, this is a lot of wasted data that could be throttled and sent less frequently, and potentially interpolated instead by lerping the values and sending the time when sending and comparing with the time when received.

<mark style="color:$primary;">Interpolation factor</mark> <mark style="color:$primary;"></mark>*<mark style="color:$primary;">**t**</mark>*<mark style="color:$primary;">:</mark>

$$
t = \frac{\text{currentTime} - \text{sentTime}}{\text{receivedTime} - \text{sentTime}}
$$

<mark style="color:$primary;">Clamp</mark> <mark style="color:$primary;"></mark>*<mark style="color:$primary;">**t**</mark>* <mark style="color:$primary;"></mark><mark style="color:$primary;">between 0 and 1:</mark>

$$
t = \max(0, \min(1, t))
$$

<mark style="color:$primary;">Linear interpolation formula:</mark>

$$
\text{lerpedValue} = \text{oldValue} + (\text{newValue} - \text{oldValue}) \cdot t
$$

You can then send the current time (`NetworkTimeSync.NetworkTime`) and compare it with current time when received, and smooth out differences using the equations above.

#### Now comparing the different methods of sending

<mark style="color:$primary;">20 messages/sec at 16 bytes:</mark>

$$
16 \times 20 = 320\ \text{bytes/sec}
$$

<mark style="color:$primary;">120 messages/sec at 12 bytes:</mark>

$$
12 \times 120 = 1{,}440\ \text{bytes/sec}
$$

<mark style="color:$primary;">That is \~1080bytes saved per second:</mark>

$$
1{,}440 - 320 = 1{,}120\ \text{bytes/sec}
$$

### Summary

By combining **time synchronization** with **lerp-based smoothing**, we can create fluid, latency-tolerant motion without spamming the network.\
Instead of sending full position updates every frame, we send fewer messages that include a timestamp and interpolate locally:

$$
\text{lerpedValue} = (1 - t) \cdot \text{oldValue} + t \cdot \text{newValue}
$$

This allows clients to smoothly reconstruct movement based on timing differences rather than raw frequency.

For example, reducing from **120 messages/sec at 12 bytes** to **20 messages/sec at 16 bytes** saves:

$$
1{,}440 - 320 = 1{,}120\ \text{bytes/sec}
$$

While **1,12 KB/sec** per stream might seem small, it scales quickly — each actor can send multiple data streams (position, rotation, animation state, etc.), and with many actors, the savings multiply dramatically.

Optimizing send frequency and payload size is one of the most effective ways to achieve **smooth, efficient, and scalable networked movement**.

{% hint style="info" %}
This approach doesn’t just apply to movement — it’s equally useful for synchronizing any time-based value, such as animations, UI transitions, physics states, or even audio parameters.
{% endhint %}

## Tips and useful classes

* [FikaBackendUtils](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Main/Utils/FikaBackendUtils.cs) has tons of useful methods/properties/fields that can be used.
* [FikaGlobals](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Main/Utils/FikaGlobals.cs) has some helper methods that can be useful during development.
* [CoopHandler](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Main/Components/CoopHandler.cs) has useful properties and methods, mainly to track players (especially human). It can be accessed on the `Singleton<IFikaNetworkManager>.Instance` or [CoopHandler.TryGetCoopHandler()](https://github.com/project-fika/Fika-Plugin/blob/18f02d5713b0e13cc02998b9e79489a55ac8249d/Fika.Core/Coop/Components/CoopHandler.cs#L62) depending on your code style preference.
* [FikaSerializationExtensions](https://github.com/project-fika/Fika-Plugin/blob/main/Fika.Core/Networking/FikaSerializationExtensions.cs) have tons of good extension methods to handle data, e.g. packing a `float`. If precision is not important to the last decimal, it's recommended to pack your primitives.

## Mod Examples

You can find an example sync-mod from the creator of Fika for the mod **MergeConsumables** [here](https://github.com/Lacyway/MergeConsumables/tree/master/fika).


# FAQ and Guides

{% hint style="info" %}

## Other Guides and Answers

There are other FAQ and Guides which can be found in the Table of Contents by clicking the <i class="fa-bars">:bars:</i> in the top-left.

If you have a question not covered here, please join us in our [Discord](https://discord.gg/project-fika) server and ask in the #questions channel.
{% endhint %}

### :question:I do not see my friend(s) on the Online Players list on the main menu / I cannot see my friend's raid in the raid list

{% hint style="warning" %} <mark style="color:$warning;">**Only one person in the group launches SPT.Server.exe.**</mark>
{% endhint %}

* Decide which person is the server host. That person alone runs `SPT.Server.exe` and follows the [Hosting a Fika server](/hosting-a-fika-server/choose-your-hosting-method) instructions.
* Everyone else **does not run `SPT.Server.exe`** and instead follows the [Joining a Fika server](/joining-a-fika-server/choose-your-connection-method) instructions.
* Make sure that everyone has Fika [installed](/installing-fika/installation). On the main menu, it should say FIKA in the bottom-left of the screen.
* If you are sure you have done all the requisite steps and it is still not working restart the PCs of everyone that is involved.
  * In rare cases a latent SPT.Server.exe may be running in the background for someone who has recently installed Fika and it may be intercepting connections. Restarting fixes this.

***

### :question:There is an error about opening ports when joining a raid

{% hint style="info" %}
**Make sure everyone is following** [**the instructions for hosting/joining a raid**](/installing-fika/hosting-or-joining) **correctly.**
{% endhint %}

#### If you are *not* using a headless client and your group is using Radmin VPN (or any other VPN client)

* Whoever clicks the `HOST RAID` button needs to follow these instructions **exactly as they are written**:
  * Navigate to the Fika.Core plugin settings in your F12 configuration menu and scroll down to the Network header. Select <mark style="color:$warning;">**your own VPN IP**</mark> from the `Force Bind IP` dropdown selection box, then type that <mark style="color:$warning;">**same exact IP**</mark> in the `Force IP` box just above.\
    \
    If you do not see the correct IP available in the `Force Bind IP` selection box, make sure you have the VPN client installed and are connected and then re-read the paragraph above very carefully.\
    \
    If you have enabled Advanced options visibility, both UPnP and NAT Punching should be **disabled.** If you do not see those options, ignore this since they are disabled by default.

#### If you are *not* using a headless client and your group is port forwarding

* Whoever clicks the `HOST RAID` button needs to ensure that they have port-forwarded 25565/udp in their router to the PC where they are playing SPT. The raid is hosted by the game client of the person who clicks `HOST RAID`, not by the `SPT.Server` backend server.
* Make sure all settings in F12 -> Fika.Core -> Network are **default**:
  * `Force IP` should be blank
  * `Force Bind IP` should be Disabled or `0.0.0.0`
  * Port should match the port for which a port forward rule was created (25565 is default)
  * If you have enabled Advanced options visibility, both UPnP and NAT Punching should be **disabled.** If you do not see those options, ignore this since they are disabled by default.

#### If you are using headless client

* If you are using the headless client to host raids and you are getting this error, you need to make sure the headless client is set up to accept incoming connections the same way any normal client would be.&#x20;
  * **If you are port forwarding**, your port forward rule for 25565/udp needs to go to the PC that is running the headless client. All settings in `BepInEx/config/com.fika.core.cfg -> Network` section should be **default**.
  * **If you are using a VPN**, you need to open up your `<headless install>/BepInEx/config/com.fika.core.cfg` in a text editor and make sure the VPN IP of the headless client machine is set for both `Force IP` and `Force Bind IP`. The VPN client must also be installed and configured on the headless client PC as well.

    <figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F5WG7CcVIKEqfvTwVaFra%2Fimage.png?alt=media&amp;token=336ed02e-9d8f-4e18-ba39-0ce7988392e2" alt=""><figcaption></figcaption></figure>

***

### :question:F8 is not successfully extracting me from a raid

This has two common causes: either a mod is causing errors or something is intercepting the F8 key press.

Try pressing F12 to bring up the BepInEx Configuration Manager settings window. If that worked, try finding the Fika.Core setting for extract hotkey and rebinding it to a different key.

If F12 did not work or you were unable to rebind the extract hotkey to a different key (or if it shows it is bound to F13), you likely have something intercepting your F-keys. This is often overlay software like Overwolf or MSI Afterburner or similar, or it could be a joystick / steering wheel / other controller plugged in that is intercepting the F-keys. Try closing all overlay software and unplugging all control peripherals.

If none of the above worked, it is likely a mod that is causing issues. You will have to close your game client via ALT+F4 and then look in your Player.log file found in the folder below:

```
C:\Users\YOURUSERNAME\AppData\LocalLow\Battlestate Games\EscapeFromTarkov\
```

Open Player.log in a text editor and search for `F8 pressed` and see if there are any errors nearby that hint at which mod may be the cause. If you are unsure, come visit us in the [Discord](https://discord.gg/project-fika) #questions channel and explain what you've tried and upload your Player.log for assistance.

***

### :question: I cannot enable quest sharing in F12 -> Fika.Core settings

Review the fika-server mod [configuration options](/fika-configuration/server). These changes must be done by the server host.

Open `fika.jsonc` in a text editor and find the option named `sharedQuestProgression` and change it from `false` to `true`, then save your changes and restart the server.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FAXCwrb4TyeNeMBwqIbUq%2Fimage.png?alt=media&amp;token=daef4f7c-a48a-44f8-a24d-721fdde8c789" alt=""><figcaption></figcaption></figure>

***

### :question:Can I enable SPT chatbots like Commando?

Review the fika-server mod [configuration options](/fika-configuration/server). These changes must be done by the server host.

Open `fika.jsonc` in a text editor and find the option named `disableSPTChatBots` and change it from `true` to `false`, then save your changes and restart the server.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fv8k6Jn6nDoh9l8ngULuw%2Fimage.png?alt=media&amp;token=3dcc814d-5c4b-48a6-8615-81b7f9fc72f2" alt=""><figcaption></figcaption></figure>

***

### :question:I changed `http.json` but my server still says `0.0.0.0`

{% hint style="warning" %}
Please do not watch video guides, they are often out of date.
{% endhint %}

The only place where IPs need to be edited is in [`fika.jsonc`](/fika-configuration/server)

* You must run `SPT.Server.exe` at least once with `fika-server` installed for `fika.jsonc` to generate.

Please follow the instructions for <a href="/hosting-a-fika-server/choose-your-hosting-method" class="button primary" data-icon="arrow-right-long">Hosting a Fika server</a>

***

### :question:How do I uninstall Fika?

Start `Fika-Installer` and choose `Uninstall Fika`.

Alternatively, you can do it manually using the following steps:

* Navigate to `BepInEx/plugins/` and delete the `Fika/` folder
* Navigate to `SPT_Runtime/user/mods/` and delete the `fika-server/` folder


# Headless Client FAQ and Common Issues

### :question:FikaHeadlessManager displays an error on start

* **Error**: <mark style="color:red;">**Could not reach SPT.Server at \<URL> Please ensure SPT.Server is running and accessible.**</mark>
  * FikaHeadlessManager is unable to verify the server is running.\
    \
    Check that SPT.Server is running and accessible using your SPT.Launcher; verify that you can connect and launch your game like normal.\
    \
    In the root folder of your headless install, find `HeadlessConfig.json` and open it in a text editor. Verify that the URL is correct and is pointing to where the headless client can access SPT.Server.
* **Error:&#x20;**<mark style="color:red;">**Could not access \<URL> Ensure Fika Server mod is installed. Please review the installation process in the documentation.**</mark>
  * FikaHeadlessManager is unable to verify that Fika is fully installed on the server to which it is connecting.\
    \
    Ensure you have followed all the steps for [Installing Fika](/installing-fika/installation) in the folder where you are running SPT.Server.

***

### :question:We cannot connect to a headless client hosted raid or we are getting an error about ensuring ports are open

The headless client needs to be able to accept incoming connections on the raid port configured in `<Headless Folder>/BepInEx/config/com.fika.core.cfg` -> `Network` -> `Port` (default 25565/udp).

If you are port forwarding, the port needs to be forwarded to the PC where the headless client is running. If you are using a VPN, the PC where the headless client is running must be connected to the same VPN and both `Force IP` and `Force Bind IP` must be configured in `com.fika.core.cfg`.

See [this FAQ entry](/faqandguides#if-you-are-using-headless-client) for more information.

***

### :question:How do I change the name of the headless client that is displayed when hosting a raid?

1. Open [fika.jsonc](/fika-configuration/server) in a text editor.
2. Find the `headless` -> `profiles` -> `aliases` section.
3. Add one line per headless client in the format `"ID": "Alias"`

   1. The `ID` is the profile ID of the headless character profile for which you wish to change the name.
   2. You can find the profile ID by opening `HeadlessConfig.json` in a text editor.
   3. If you are adding multiple profiles, each line needs to end in a comma `,` except the last line.

   <div align="left" data-full-width="false"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F4uQZbN9GvhMFqqHZKRfP%2Fimage.png?alt=media&amp;token=18b7fb1d-cc85-404a-bc02-4b1fcb8c1c28" alt=""><figcaption></figcaption></figure></div>
4. Save changes to `fika.jsonc` and close the text editor.
5. Restart SPT.Server.

***

### :question:Does performance of the headless client matter?

Yes, to a point. Performance of the headless client matters insofar as the headless client must stay **above 30 FPS** during all raid scenarios.

To test for this, connect to a headless client hosted raid and, once you have spawned in, open the in-game console on your game client (default key is `~`), enter command `debug t`, and then press Enter.

This will open a debug window that shows the amount of bots spawned, your ping/RTT, and also the 'Server FPS' which is the FPS of the headless client. Play through the raid, get into fights, throw grenades, etc, and keep an eye on the Server FPS value. As long as it stays in the 30s or above, you should not experience any issues.

If it is dipping into the 20s or teens, you will likely experience issues with AI acting strange and physics objects (such as grenades) teleporting or moving in slow-motion. Reduce the number of bots spawned or the number of mods in use to bring performance back up above the important 30 FPS threshold.

If performance dips below 30 FPS even with no other mods, your PC is likely not strong enough to host a headless client. If you see the FPS value stuck at 59, that is expected behavior and is not indicative of a problem.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FNSkWHH5ypa25us1GKw8P%2Fimage.png?alt=media&amp;token=aa483582-2533-41ca-9d25-7cc3092d8d28" alt=""><figcaption></figcaption></figure>

***

### :question:I get an error about "A patch in SPT.CustomPlugin FAILED"

The error `A patch in SPTCustomPlugin FAILED. The type initializer for 'SPT.Custom.Patches.CustomAiPatch'...` should mostly be avoided with latest versions of FikaHeadlessManager. Make sure you have the latest version by re-running Fika-Installer in your headless client install folder and choosing `Advanced` -> `Update Fika Headless`.

If you are still getting this error even with the latest FikaHeadlessManager, likely something is blocking your headless client `EscapeFromTarkov.exe` specifically from connecting to the server, such as a VPN or firewall.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FFKV5fIhHl5fMRSSiYvOX%2Fimage.png?alt=media&amp;token=4c990b40-5e2f-4263-8c20-7c67c69a094e" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}

#### Ensure SPT.Server is running and able to accept connections

Test connectivity using SPT.Launcher: make sure you can launch the game and reach your stash and access traders.

If your SPT.Launcher is not able to connect to your server, figure out why and address that issue first. If the server is currently running but SPT.Launcher cannot connect, revisit the [Hosting a Fika server](/hosting-a-fika-server/choose-your-hosting-method) instructions.

**NOTE**: the headless client **does not replace SPT.Server**. The backend server is required to be running at all times.
{% endhint %}

If you have already generated `HeadlessConfig.json` and it is in the root directory of your headless install, open it in a text editor and change the URL to match how you connect to your server. This may include a VPN IP or the public IP of the server. Save the changes to the file and restart `FikaHeadlessManager.exe`

If you have not generated `HeadlessConfig.json` or the headless profile yet, revisit the [steps for installing the Headless client](/advanced-features/headless-client/remote-headless-client) and pay close attention to the [step about editing `fika.jsonc`](https://wiki.project-fika.com/faqandguides/pages/0z3pofKBt94d9uQqyEir#optional-set-url-in-fika.jsonc)


# Configure mods for the headless client

Created by Shynd

## General instructions

* If the PC where the headless client is installed has a GPU, you can simply open the headless client in graphics mode by pressing G when prompted by FikaHeadlessManager during startup. In graphics mode you can access F12 (or F6 for SAIN) to configure your mods.
* If the PC where headless client is installed does NOT have a GPU, close FikaHeadlessManager and the headless client. Install the plugins you wish to configure on the SPT instance where you will be playing (NOT THE HEADLESS), configure the options however you want, then copy the necessary .cfg files from `<SPT Install>/BepInEx/config/` into the `<Headless SPT>/BepInEx/config/` folder for your headless client install.

## SAIN

* SAIN settings are stored in the `BepInEx/plugins/SAIN/Presets/` folder. I suggest using your main game to configure SAIN options however you want them to be on the headless client, then copy your entire `BepInEx/plugins/SAIN/` folder over to the headless client, overwriting all when prompted.

## Donuts

* Donuts settings are stored in the `BepInEx/plugins/dvize.Donuts/Config` folder. Same as SAIN above, I suggest configuring Donuts settings using the GUI from your main game and then copying over the entire `BepInEx/plugins/dvize.Donuts/` folder to the headless client.

***


# Guidance on which mods should be used on the headless client

Created by Shynd

## Note: The headless client is a *client* — clients only load things in `BepInEx/`. Any mod that is in `SPT/user/mods/` is loaded only by the backend server, SPT.Server.exe.

To expand a bit on what I mean about the difference between a plugin I assume the headless client **needs** vs a plugin I assume the headless client does not need:

* <mark style="color:$warning;">Does it only have an effect while in stash or hideout? If yes, then it's probably</mark> <mark style="color:$warning;"></mark>*<mark style="color:$warning;">not</mark>* <mark style="color:$warning;"></mark><mark style="color:$warning;">necessary for the headless client.</mark>
  * This would be something like QuickSell. It is not necessary to have on the headless client because it only affects in-stash behavior.
  * Plugins in this category may be fine to leave installed on the headless client and they may cause issues. They are unlikely to *solve* any issues.
* <mark style="color:$warning;">Does it only change how information or graphics are displayed, without changing that information? If yes, then it's probably</mark> <mark style="color:$warning;"></mark>*<mark style="color:$warning;">not</mark>* <mark style="color:$warning;"></mark><mark style="color:$warning;">necessary for the headless client.</mark>
  * This would include things like MoreCheckmarks, AmandsGraphics, DynamicMaps, ItemSellPrice, et al. These plugins take existing information that is available already in the game client and display it in a different way. They do not add or change any behavior.
  * Plugins in this category also may be fine to leave installed on the headless client, and they also may cause issues. They are unlikely to *solve* any issues.
  * Remember that the headless client is navigating menus automatically to start a raid and finish a raid. Anything that changes menus or patches menus may cause problems.
* <mark style="color:$warning;">Does it change in-raid behavior in some way? If yes, it's probably necessary.</mark>
  * This would be something like SAIN, which affects AI behavior, or bot spawn mods, or UIFixes which changes *how inventory behaves*, or anything else that you think ***might*** have an effect on in-raid behavior.
  * Plugins in this category are sometimes difficult to spot. Something like UIFixes may not be obvious that it *changes* inventory behavior, and it may not be apparent to users that the raid host is authoritative on inventory actions.
  * Some plugins that seem to fall in to this category are simply displaying other ways to trigger vanilla behavior and thus do not need to be on the headless client, but often do not hurt to have installed anyway. Things like ItemContextMenuExtended, for instance, make it so that you can right-click a flashlight to toggle it on/off, but they do not *change* that behavior, only make it accessible in a new way, and thus are not *required* to be on the headless client.

There are some plugins, like SearchOpenContainers, that are difficult to discern where they need to be or if they'd cause issues. One might reasonably assume that searching a container that is open is changing behavior so it needs to be installed for the headless client; one might also reasonably assume that searching an open container is entirely client-side and since the headless client character will never be searching containers it is not necessary. Plugins that feel ambiguous should be tested to make sure they do not cause issues one way or another.&#x20;

At the end of the day, there is often no *benefit* to having plugins that do not improve the experience for the headless client to be installed on the headless client, but often there's also no issues. Sometimes more plugins does cause more processing overhead and thus lower in-raid FPS. If that doesn't matter to you, install everything and only remove plugins that cause problems! If that does matter, be selective and test for yourself.&#x20;

I personally use the above logic as a starting point for testing. I remove any plugins that I'm very sure are not necessary and leave in any plugins that I am not sure about, and then I run raids and specifically test plugin behaviors. I look through logs for errors. If everything is working, I move on. Thus far, this has served me well.

Here is an illustration of the modding setup of headless client vs Fika instance:

**Headless client**

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FYDUGmwg5kTw0J9pdahpH%2Fimage.png?alt=media&amp;token=d12a618e-ed03-479c-9b7d-ad46877bbd04" alt=""><figcaption></figcaption></figure>

**Fika instance**

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FWQpx1Qg8KWparJkipCNq%2Fimage.png?alt=media&amp;token=92675a92-11a6-4936-9a1a-f9d2010b1244" alt=""><figcaption></figcaption></figure>


# Set up required/optional mods

Setting up the required/optional mods section in `fika.jsonc` can be frustrating. What do I put there? How do I find mod GUIDs? What's the difference between required and optional. Let's attempt to demystify this powerful feature and make it more widely used. First, let's start with a simple Powershell script that will snag all the plugin GUIDs that you currently have loaded.&#x20;

Before executing this script, make sure you have **all the plugins you want the names of** installed and launch your SPT client. This will refresh your Player.log with currently installed plugin information, which we will pull with the script below. Copy and paste the script below directly into a Powershell command window and execute it. It'll print out a string of mod GUIDs properly formatted for pasting directly into `fika.jsonc`.

```powershell
$LocalLow = [System.Environment]::GetFolderPath("LocalApplicationData").Replace("Local", "LocalLow")
$LogFile = Join-Path $LocalLow "\Battlestate Games\EscapeFromTarkov\Player.log"

$ModGuids = @()

Get-Content $LogFile | ForEach-Object {
    if ($_ -match '^\[Info\s+:FikaModHandler\].*?GUID \[([^\]]+)\]') {
        $ModGuids += '"' + $matches[1] + '"'
    }
}

$CSVOutput = $ModGuids -join ', '

Write-Host $CSVOutput
```

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F9r3qFrfwsQZIg3fgKfJN%2Fimage.png?alt=media&amp;token=7dd47fc2-7348-4d5d-83bf-e5c9570c3f22" alt=""><figcaption></figcaption></figure>

Copy and paste the output into `fika.jsonc` -> `"mods": { "required": [ <HERE> ]` if you want everyone who joins the server to be required to have the same plugins that you have loaded. You can move some of the GUIDs down to the `"optional": [ ]` section if you don't want to enforce certain plugins but still have them allowed. Anyone who has a plugin loaded that is not in either of these lists or missing a plugin in the required list will get an error message with a large `EXIT` button:

> Your client doesn't meet server requirements, check logs for more details

This way you can keep friends from installing mods that may give an unfair advantage or at least make sure that everyone has the same mods, which avoids issues.


# ADVANCED: How Fika Establishes Raid Connections

This page will describe how Fika facilitates clients connecting to the raid host. This may help troubleshooting issues if you have a non-standard network setup (proxy, tunnels, ddns, docker, etc).

{% hint style="warning" %}
This article is intended for Advanced Users who have a non-standard network setup. Whereas it may be interesting for others, if you have a simple network you may be better off just following the [hosting instructions](/hosting-a-fika-server/choose-your-hosting-method) and not worrying about the inner-workings of Fika. If port forwarding isn't working, use a [VPN like Radmin](/hosting-a-fika-server/host-using-a-vpn).
{% endhint %}

### Definition of Terms

* **SPT Server / backend server**
  * SPT Server or backend server refers to `SPT.Server.exe` which handles synchronizing profiles and stash management. It is modified by the fika-server mod to allow for players to host and join raids.
* **fika-server mod**
  * This is a modification of the backend server that allows for hosted raids to populate in a list and be joinable by clients. It forwards information about connection methods from the raid host to joining clients.
* **Fika client plugin**
  * The client plugin is a BepInEx plugin in the form of a .dll file that lives in `BepInEx\plugins\Fika\` and hosts the networking functionality for the raid. It is what listens for connections for the raid host or establishes a connection for a joining client. When you are changing settings in the F12 configuration menu, you are changing settings for the cilent plugin.
* **Plugin configuration**
  * This is the list of settings that can be changed in the BepInEx Configuration Manager, often accessed by pressing F12 inside your gaming client. These values can also be modified by opening `BepInEx/config/com.fika.core.cfg` in a text editor and editing the values directly.

## Fika Network Workflow

### How the Raid is Advertised to Clients

When the raid host starts setting up a raid for others to connect, it first looks in the `Force IP` field for the client plugin configuration for the client that is to be the host. If that field is populated, it stores that IP in memory, hereafter referred to as `IP_1`. If the `Force IP` field is blank, the plugin will attempt to resolve the Public/WAN IP by querying (at the time of writing) three IP resolution services and then it stores the Public IP as `IP_1`.

The client plugin will also query local network adapter(s) and store a list of IPs that correspond with the local network adapters (generally `192.168.x.x` or `10.0.x.x`) as `IP_2/IP_3/etc`. If a VPN such as Radmin is installed, the VPN IP will be stored in this list of local IPs.

Then the client plugin will look at the `Port` field in the plugin configuration and record that to memory.

Next, the client plugin will look at the `Force Bind IP` field. If that field has a value other than 'Disabled', it will start listening for connections on the adapter related to the IP selected.

* For `0.0.0.0` it will listen to connections that come from anywhere. This is also the behavior if `Force Bind IP` is set to 'Disabled'.
* For a specific IP, like `192.168.x.x` or `26.x.x.x`, it will listen for connections that only come from that network adapter. This should only be used if `0.0.0.0` or 'Disabled' do not work.

{% hint style="danger" %}
None of the settings in Fika.Core -> Network affect the client that is **joining** the raid. These settings only affect the raid host.
{% endhint %}

Once all of the values have been recorded to memory, the client plugin will attempt to establish a service that listens for incoming connections. Then the plugin will send a list of available IP:Port combinations to the fika-server mod so that the backend server can forward that information to any other client that may want to connect. The list will look like:

* `IP_1:Port` - This is generally either the value in `Force IP` or your Public/WAN IP + Port from plugin configuration
* `IP_2:Port` - This is generally your LAN IP + Port from plugin configuration
* `IP_3:Port` - If applicable, a 2nd LAN IP or VPN IP
* etc

### How a Client Connects to an Advertised Raid

When a client navigates to the raid screen and clicks the `JOIN` button on a particular raid in the list of available raids, the backend server forwards the information discussed above to the joining client's Fika plugin, which includes a list of IP:Port combinations to which they will attempt to connect.

The connecting client will then attempt to connect to `IP_1:Port`,  `IP_2:Port`, etc, in series. If none of the IP:Port combinations in the list successfully connect, an error will be displayed suggesting to confirm that all ports are open and incoming connections are allowed by the raid host.

{% hint style="info" %}
Note: a **direct connection** between game clients is being established, not a connection that is routed through the backend server. If the path of the direct connection is obstructed or unavailable it will fail, even if both clients are able to connect to the backend server.
{% endhint %}

### Further Troubleshooting

If you or a friend are still getting errors when attempting to join a raid, you should open the Player.log of the person getting the error and look for which IPs are being sent to them. Player.log can be found at the location below, and the picture below that shows an example of the log lines for which you are looking.

```
C:\Users\YOURUSERNAME\AppData\LocalLow\Battlestate Games\EscapeFromTarkov\
```

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FRblBhc1q96K1ur9Uhh8Z%2Fimage.png?alt=media&amp;token=420dbc02-a8f9-464f-8454-15a5f41744cf" alt=""><figcaption></figcaption></figure>

The IPs listed will be `IP_1`, `IP_2`, etc, from the [Fika Network Workflow](#fika-network-workflow) section.

## Why This Matters

This is very different from the way most 'dedicated server' game hosting scenarios play out. If you've ever hosted another game server — like Minecraft or Valheim or ARK or Palworld or 7D2D — you may be surprised to learn that Fika hosting is completely different, and thus nearly all of the knowledge you've acquired from hosting for your group of friends in the past is less than useful.

In most other games, the 'dedicated server' application takes care of all network synchronization. You and a friend both connect to the server and neither of you have to be able to accept incoming connections to play together. With SPT+Fika, this is not the case: you can both connect to the backend server, interact with traders and send each other items, but you will not be able to play in raids together unless one of you is able to accept incoming connections **to your EscapeFromTarkov.exe game client.** This is because raids are hosted by Fika Plugin on your game client, not the backend server.

If the PC where the raid is being hosted is only accessible behind a proxy or tunnel, you may have to utilize the information above to come up with a value to enter in to `Force IP` such that other clients can connect to the advertised raid. This may be as simple as creating a dynamic DNS entry that resolves differently inside your network than it does outside — for instance, `fika.yourdomain.com` that is resolved to a LAN IP for users inside your network (locally by your router) but your public IP for users outside your network via an A record from your domain registrar.

{% hint style="success" %}
If any of the above information still does not help you figure out what values you can enter for Force IP or Force Bind IP, come join us in the [Fika Discord](https://discord.gg/project-fika) and explain your network setup, what you're trying to do, what you've tried, and what's not working.
{% endhint %}


# Contribute to Fika

Different ways you can contribute to Fika.

## Development

You can contribute to the development of Project Fika by visiting our [GitHub organization](https://github.com/project-fika). Project Fika consists of multiple components, each with its own repository. Create a pull request and one of our developers will review it. Ensure that you follow the guidelines for code submission.

## Translation

Project Fika is localized by the community at [Crowdin](https://crowdin.com/project/project-fika). Feel free to help us translate it into any available languages!

## Wiki

You can contribute to the Wiki by submitting a pull request to its [GitHub repository](https://github.com/project-fika/gitbook-wiki). We recommend using [GitBook](https://www.gitbook.com/)'s editor to make your changes. To do this, fork the repository and add it to your GitBook account using GitBook's GitHub Sync integration app, then submit a pull request.

You can also request to become an editor in our [Discord](https://discord.gg/project-fika). Contact one of the staff member.


# Credits

A page listing all the credits for each project and individuals who contributed to Project Fika and/or the Tarkov modding community in no specific order.

### Project credits

<table><thead><tr><th width="240">Project</th><th>License</th></tr></thead><tbody><tr><td>SPT.Modules</td><td><a href="https://dev.sp-tarkov.com/SPT/Modules/src/branch/master/LICENSE.md">NCSA</a></td></tr><tr><td>SPT.Server</td><td><a href="https://dev.sp-tarkov.com/SPT/Server/src/branch/master/LICENSE.md">NCSA</a></td></tr><tr><td>SIT</td><td><a href="https://github.com/project-fika/Fika-Plugin/blob/main/LICENSE-SIT.md">NCSA</a> (<code>Forked from SIT.Client master:9de30d8</code>)</td></tr><tr><td>Open.NAT</td><td><a href="https://github.com/lontivero/Open.NAT/blob/master/LICENSE">MIT</a> (for UPnP implementation)</td></tr><tr><td>LiteNetLib</td><td><a href="https://github.com/RevenantX/LiteNetLib/blob/master/LICENSE.txt">MIT</a> (for P2P UDP implementation)</td></tr><tr><td>Mirror Networking</td><td><a href="https://github.com/MirrorNetworking/Mirror/blob/master/LICENSE">MIT</a> (for Snapshot Interpolation implementation)</td></tr></tbody></table>

### Individual credits

| Name            | Notes                                                                                         |
| --------------- | --------------------------------------------------------------------------------------------- |
| Lacyway         | Creator of Fika and its community; many contributions to the Tarkov modding scene             |
| SSH             | Co-creator of Fika; creator of multiple mods such as visceral dismemberment                   |
| Archangel       | Active developer of Fika and contributor to SPT                                               |
| chomp           | Massive contributions to the SPT project                                                      |
| Nexus           | Many contributions to Fika, helping with complex issues                                       |
| TheSparta       | Many contributions to Fika, rewrote a large portion of the server plugin                      |
| Senko           | Many contributions to Fika; helping whenever possible                                         |
| DeadLeaves      | Many contributions to Fika; creator of multiple mods                                          |
| Ghostfenixx     | Creator of SVM, a widely used mod on SPT; a dedicated individual within the Fika community    |
| RaiRaiTheRaichu | Creator of many widely used mods on SPT; massive dedication to the SPT community              |
| CWX             | Many contributions to Fika, widely known modder and dedicated to the Tarkov modding community |
| Shynd           | Active contributor and resident helper of Fika                                                |


# Before installing Fika

{% hint style="warning" %}
**WARNING**

Escape from Tarkov must be installed on your computer using the official BSG launcher.
{% endhint %}

You must have a working SPT installation before attempting to install Fika. This means you must be able to start a game in SPT without any issues, and you should not be running any mods before installing Fika. Please ensure this is the case before continuing with the next steps.

{% hint style="info" %}
If you do not have SPT installed, click [here](https://sp-mod.com/installer) to download the SPT installer and follow the steps to install SPT.
{% endhint %}

<p align="center"><a href="/installing-fika/hardware-requirements" class="button primary" data-icon="circle-right">I understand</a></p>


# Hardware requirements

**Your computer must at least have the following specifications for Fika to run properly.**

<table><thead><tr><th width="142">Hardware</th><th width="233">Model</th><th>Notes</th></tr></thead><tbody><tr><td>CPU</td><td>i7 8700k / Ryzen 5 3600X</td><td>The AMD X3D chips performs the best.</td></tr><tr><td>GPU</td><td>GTX 2070 / RX 5700 XT</td><td></td></tr><tr><td>Memory</td><td>32GB</td><td>16GB <em>may</em> work but performance and stability will be affected.</td></tr><tr><td>Storage</td><td>SSD</td><td>HDD is <strong>NOT</strong> supported.</td></tr><tr><td>Storage space</td><td>50GB</td><td>We recommend having more than 50GB for virtual paging.</td></tr></tbody></table>

<p align="center"><a href="/installing-fika/installation" class="button primary" data-icon="circle-right">I have the necessary hardware requirements</a></p>


# Installation steps

{% stepper %}
{% step %}

### Download [Fika-Installer](https://github.com/project-fika/Fika-Installer/releases/latest)

{% endstep %}

{% step %}

### Copy `Fika-Installer.exe` to the root of your SPT install folder

Do not copy inside `SPT` folder!

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FfQOUwDFaiecDjfafudPf%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2F5yu7c0P4PT4gSQwcgOw5_2Fimage.png?alt=media&amp;token=c66acd8b-c707-4771-966a-3b3f1e946da0" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `Fika-Installer.exe`

If you get an admin rights prompt, this is normal. Fika-Installer requires admin rights to set up the firewall rules.
{% endstep %}

{% step %}

### Choose `Install Fika`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FKWGp4PpMBPK803fXTXJT%2Fimage.png?alt=media&amp;token=7c59250b-0537-47a7-9ddb-6f3ca806e2e9" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Close `Fika-Installer` when installation is completed

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FZSXokohMP3YBB3Yt61nz%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2FD9VHauheMEVLMpsMRod5_2Fimage.avif?alt=media&amp;token=cdcead13-a00d-477a-aecb-2e0baf6e7bfa" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FlZfa6hVfcUTBztlqMtZ7%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2FLRc3xTCQ6XWf6cP3JDMG_2Fimage.png?alt=media&amp;token=753539b3-82de-4914-b278-19af214bb1e5" alt=""><figcaption></figcaption></figure>

You should see `Mod: server version: x.x.x (targets SPT: 4.x.x) by: Fika loaded`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F6OjJvWrvXfauueXAlWG6%2Fimage.png?alt=media&amp;token=3adeeba3-994f-4477-9a31-4e3b07a08441" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Launcher`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F89xf4fwAOWUZlYNbpj1u%2Fimage.png?alt=media&amp;token=6d0ae45c-f9a5-4adf-805e-cb68896b6a22" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Select the server "Local Server" and create a new profile

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FxVnousHuofsAj77AqoE9%2F2026-09-29%2013-49-57.png?alt=media&amp;token=ff852043-da62-4bbb-9be2-0785d9db574e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fc0L29t2AGAY5A5kIgXcr%2F2026-09-29%2013-52-56.png?alt=media&amp;token=834d35e6-489d-4fed-8c72-9a6d1d9d7166" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Select your profile and click "Start Game"

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FUg9K2hZwAgnDYdiaRVRK%2F2026-09-29%2013-54-06.png?alt=media&amp;token=c4cc0feb-1340-4ede-96ef-bfa68f3ece13" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate that Fika successfully loaded

`FIKA x.x.x | SPT x.x.x` should appear at the bottom left corner of the main menu. You should also see the `Online players` widget on the right side of the main menu.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FK6fwroZ1W61Lu7UAKmsi%2Fimage.png?alt=media&amp;token=11456873-8ed4-4c00-85aa-f398c2f9f069" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Exit the game

{% endstep %}
{% endstepper %}

<p align="center"><a href="/installing-fika/hosting-or-joining" class="button primary" data-icon="circle-right">Continue</a></p>


# Hosting or joining

<p align="center">Please choose below if you are planning to host the Fika server or join a Fika server.</p>

<p align="center"><a href="/hosting-a-fika-server/choose-your-hosting-method" class="button primary" data-icon="circle-right">I am hosting the Fika server</a> <a href="/joining-a-fika-server/choose-your-connection-method" class="button primary" data-icon="circle-right">I am joining a Fika server</a></p>


# Choose your hosting method

Getting started with hosting a Fika server.

See below for the different methods for hosting a Fika server. Choose the one that is appropriate to your network configuration.

{% hint style="warning" %}
**WARNING**

Some technical knowledge is required to host a Fika server. If you are unsure, please visit our Discord for assistance.
{% endhint %}

{% tabs %}
{% tab title="Port Forwarding" %}
Port Forwarding is the process of opening a port externally to a device within your network. Players can enter your external IP and connect directly to the server running on your computer.

**Pros**

* Direct connection between players and your server (best performance).
* No software dependencies.

**Cons**

* Requires access to your router configuration.
* Certain ISP or network configuration such as CGNAT/shared public IP cannot port forward.
* Your device local IP may change which will break the port forwarding rule (can be addressed by static IP allocation).

<a href="/hosting-a-fika-server/host-using-port-forwarding" class="button primary" data-icon="up-right-from-square">Host using Port Forwarding</a>
{% endtab %}

{% tab title="Virtual Private Network (VPN)" %}
A Virtual Private Network (VPN) allows you to join a virtual network provided by a centralized server. All communication goes through the centralized server and then is shared between peers connected to the same network.

**Pros**

* No port forwarding required
* Easy to set up and use
* Works with restricted networks such as CGNAT/shared public IP

**Cons**

* Direct connection is not possible in some instances. Communication will be relayed through the centralized server, which can severely degrade performance
* Requires all players to install and configure the VPN client
* Your external IP address is shared with the VPN service

<a href="/hosting-a-fika-server/host-using-a-vpn" class="button primary" data-icon="up-right-from-square">Host using VPN</a>
{% endtab %}

{% tab title="LAN (Local)" %}
Fika supports hosting on a local server with or without access to Internet. A router is required to be able to establish a connection to the local IP address of the server.

<a href="/hosting-a-fika-server/host-over-lan" class="button primary" data-icon="up-right-from-square">Host over LAN</a>
{% endtab %}
{% endtabs %}


# Host using port forwarding

Step-by-step process for hosting a Fika server using port forwarding.

{% hint style="warning" %}
**WARNING**

Not all Internet Service Providers (ISP) allows port forwarding. If you find yourself unable to port forward, you can use a public VPN service such as Radmin, ZeroTier, etc.). Click [here](/hosting-a-fika-server/host-using-a-vpn) to learn how to host using a VPN.
{% endhint %}

{% hint style="info" %}
We do not provide a step-by-step tutorial for port forwarding because the router settings interface varies between different models and manufacturers. You may be able to find guides for your router on [PortForward.com](https://portforward.com/) or by searching Google.
{% endhint %}

{% stepper %}
{% step %}

### Access your router configuration

Your router configuration can be accessed by typing the [gateway IP](https://www.whatismyip.com/finding-your-default-gateway-address/) in your browser.
{% endstep %}

{% step %}

### Access the port forward menu

The port forward menu can have different names; usually "port forwarding" or "virtual server".
{% endstep %}

{% step %}

### Add port forward rules

Add the following port forward rules and make sure they are associated with your computer:

* 6969 TCP (SPT backend server).
* 25565 UDP (Fika in-game networking).
  {% endstep %}

{% step %}

### Start `SPT.Server`

If everything is working properly, you should see something similar in the console output:

<pre><code>ModLoader: loading: 1 server mods...
<strong>Mod: server version: 2.2.0 (targets SPT: >=4.0.11) by: Fika loaded
</strong>Loading OnWebAppBuildMods...
[Fika Server] Overriding SPT configuration
Finished loading OnWebAppBuildMods...
Loaded self-signed certificate (./user/certs/server.crt)
Server: executing startup callbacks...
┌─────────────────────────────────────────┐
│ SPT 4.0.11                              │
│ https://discord.sp-tarkov.com           │
│                                         │
│ This work is free of charge             │
│ If you paid money, you were scammed     │
│ Commercial use is prohibited            │
└─────────────────────────────────────────┘
Loading PreSptMods...
Finished loading PreSptMods...
Importing database...
Database import finished
Generating flea offers...
<strong>Started webserver at https://0.0.0.0:6969
</strong><strong>Started websocket at wss://0.0.0.0:6969
</strong><strong>Server has started, happy playing
</strong></code></pre>

{% hint style="warning" %}
If you see errors (red text) then your configuration is invalid or you are unable to host using the configured IP address/port. Please double-check your settings.
{% endhint %}
{% endstep %}

{% step %}

### Start `SPT.Launcher`

{% endstep %}

{% step %}

### Login to your profile

{% endstep %}

{% step %}

### Start game

{% endstep %}
{% endstepper %}

<p align="center"><a href="/testing-connectivity/test-port-forward-connectivity" class="button primary" data-icon="circle-right">I followed all the steps</a></p>


# Host using a VPN

Step-by-step process for hosting a Fika server using a VPN client.

{% hint style="warning" %}
**WARNING**

Free VPNs services are known to cause performance or connectivity problems, so <mark style="color:$warning;">use at your own risk</mark>.&#x20;

The officially supported way of playing Fika is with port forwarding. We will not provide support for issues caused by VPN services.

Custom firewalls such as **BitDefender** may also block your connection while playing. Make sure that you allow the connection or temporarily disable it while playing!

You may also experience issues if you are using another VPN service, even if it is disabled. If you have problems, consider uninstalling any other virtual network adapters.
{% endhint %}

{% stepper %}
{% step %}

### Download Radmin

Navigate to the [Radmin website](https://www.radmin-vpn.com/) and download the Radmin VPN client.
{% endstep %}

{% step %}

### Install Radmin

Run the installer and proceed with the installation steps.
{% endstep %}

{% step %}

### Reboot your computer

This is important to ensure that the virtual network adapter is correctly installed. **Do not skip this step!**
{% endstep %}

{% step %}

### Create a network in Radmin

Open Radmin VPN client (from the taskbar or from the start menu) an Click `Create network`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FLAzbAD6gtW0Q7fxOKdPQ%2Fimage.png?alt=media&amp;token=63313826-723b-474c-966b-fba7217ee54b" alt=""><figcaption></figcaption></figure>

Enter a network name and a password. Make sure to note the network name and password, you will need to share it with your friends.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FC5ddfGBTBa7RPE2ldrMw%2Fimage.png?alt=media&amp;token=ea651181-a071-41c6-929e-113122114d8f" alt=""><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### Add Radmin to Windows firewall exclusions

Go to `System` -> `Firewall Exceptions` and click  `Allow All Apps`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F9eTc4E8HlTFuHt2vtvoR%2Fimage.png?alt=media&amp;token=d8b9a79f-29b8-4e74-b8a8-a56cbe30438f" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server`

Wait for `SPT Server` to be fully loaded.

<div align="left"><figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F9vUAkGC2vm3RgM4AE9Uj%2F2026-09-29%2013-56-42.png?alt=media&amp;token=70dbdd89-09ec-4732-9f69-e5460b8708c8" alt=""><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}

### Start `SPT.Launcher`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FQIK2fJ1ONoqXIAA3v9tl%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2F89xf4fwAOWUZlYNbpj1u_2Fimage.png?alt=media&amp;token=d1745aca-224b-4153-a9e2-ff1546bc6cad" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Login to or create your profile

{% endstep %}

{% step %}

### Start the game

Press the arrow on the right corner. You should now be able to create your profile and log in to the server. Start the game.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FUg9K2hZwAgnDYdiaRVRK%2F2026-09-29%2013-54-06.png?alt=media&amp;token=c4cc0feb-1340-4ede-96ef-bfa68f3ece13" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

<p align="center"><a href="/testing-connectivity/test-vpn-connectivity" class="button primary" data-icon="circle-right">I followed all the steps</a></p>


# Host over LAN

{% stepper %}
{% step %}

### Open command prompt

Press `Windows key`, type `cmd` and press `ENTER`.
{% endstep %}

{% step %}

### Get your local IP address

Type `ipconfig` in command prompt and press `ENTER`.

Find the adapter section that you are using. Generally, `Ethernet adapter` for cable connection and `Wireless LAN adapter` for Wi-Fi.

Save the IP address next to `IPv4 Address`. <mark style="color:$warning;">You will need to share it with your friend(s)</mark>.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FsdesNdnmowZF3t1oaewG%2Fimage.png?alt=media&amp;token=ae1c48b5-ac21-4ad7-acec-b3c43c5bee5b" alt="" width="443"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Server`

{% endstep %}

{% step %}

### Start `SPT.Launcher`

{% endstep %}

{% step %}

### Login to your profile

{% endstep %}

{% step %}

### Start game

{% endstep %}
{% endstepper %}

<p align="center"><a href="/playing-fika/hosting-a-raid" class="button primary" data-icon="right-to-bracket">I followed all the steps</a></p>


# Test port forward connectivity

{% stepper %}
{% step %}

### Make sure `SPT Server` is running

{% endstep %}

{% step %}

### Obtain your public IP address

You can obtain your public IP address [here](https://api.ipify.org/).
{% endstep %}

{% step %}

### Test port connectivity

You can test your port connectivity using an [online port checker](https://portchecker.co).&#x20;

Enter your public IP address and port 6969, then click `Check`.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
If the port is closed, you may have an invalid configuration, Windows Firewall blocking the connection or your ISP does not allow port forwarding. Validate all your network settings or consider using a [VPN client](/hosting-a-fika-server/host-using-a-vpn).

Visit our Discord for assistance if you are stuck.
{% endhint %}

<p align="center"><a href="/landing/congratulations" class="button primary" data-icon="circle-right">I confirm that my server is accessible</a></p>


# Test VPN connectivity

Before testing VPN connectivity, make sure that your friend(s) have successfully installed Fika and completed the steps [here](/joining-a-fika-server/connect-using-a-vpn).

{% stepper %}
{% step %}

### Open Radmin

{% endstep %}

{% step %}

### Ping your friend(s)'s device

Right-click their name in Radmin and click `Ping`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FZb5qlXZihjgUiD9Xk4s2%2Fimage.png?alt=media&amp;token=2c52f899-3c2c-4e65-9138-3593f93a6768" alt="" width="243"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate ping success

Ensure that the ping is successful in the command prompt. If you see "Request timed out" then the ping failed.
{% endstep %}

{% step %}

### Close command prompt

{% endstep %}
{% endstepper %}

{% hint style="warning" %}
If the ping fails then it means that the VPN connection is not working correctly. Everyone should try rebooting their PC and make sure that everyone joined the same network in Radmin.

Custom firewalls such as `BitDefender` can block VPN communication - try turning it off.
{% endhint %}

<p align="center"><a href="/testing-connectivity/test-vpn-connectivity/ensuring-direct-connection" class="button primary" data-icon="circle-right">I confirm that I can ping everyone</a></p>


# Ensuring direct connection

{% stepper %}
{% step %}

### Open Radmin

{% endstep %}

{% step %}

### Open your friend(s)'s connection properties

Right-click your friend's name in Radmin and click `Properties`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FzCgqmu3LxK8ZdsRiLKjm%2Fimage.png?alt=media&amp;token=a180008a-717b-4408-be99-1afe81321330" alt="" width="245"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate channel type

Validate that the Channel type is `TCP/out` or `UDP/out`. This mean you have a direct connection to this peer.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FcYerBNYv2Eeg8Sz1TYL4%2Fimage.png?alt=media&amp;token=31e5b15b-9b2d-47fb-a1d5-76a398e17768" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
If you see `TCP/relay`, then the communication is relayed through Radmin's servers. The performance will be severely degraded. Try disabling any firewall and/or antivirus in your system and reconnect to the network in Radmin.

You *can* play with TCP/relay, but expect lag. You have been warned.
{% endhint %}

<p align="center"><a href="/landing/congratulations" class="button primary" data-icon="circle-right">I validated the channel type</a></p>


# Choose your connection method

The connection method depends on how the Fika server was set up. Make sure to ask the server host which hosting method they used.

<p align="center"><a href="/joining-a-fika-server/join-using-direct-connection" class="button primary" data-icon="circle-right">The server host uses Port Forwarding</a></p>

<p align="center"><a href="/joining-a-fika-server/connect-using-a-vpn" class="button primary" data-icon="circle-right">The server host uses VPN</a></p>

<p align="center"><a href="/joining-a-fika-server/connect-locally" class="button primary" data-icon="circle-right">The server host is local</a></p>


# Connect using direct connection

Step-by-step process for joining a Fika server.

{% stepper %}
{% step %}

### Start `SPT.Launcher`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F6VvP1Zv91r18PGHsINU8%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2F89xf4fwAOWUZlYNbpj1u_2Fimage.png?alt=media&amp;token=78e4eec3-5342-453a-909e-fa5d40e80396" alt="" width="455"><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### Configure server IP in `SPT Launcher`

Ask the server host to provide their <mark style="color:$warning;">external IP address</mark>.

Click `Add New Server`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FCS4va8oMm35KYdSGTXkN%2F2026-09-29%2013-57-33.png?alt=media&amp;token=364b1ed0-7037-418b-a115-6947aeaaac89" alt=""><figcaption></figcaption></figure>

Give the server a name and enter the host's IP address in the address section.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Ff0SNRN0DMVh2SCYFrhPI%2F2026-09-29%2013-59-06.png?alt=media&amp;token=69ee5f9c-6e57-4bdc-856b-415b35534161" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Create your profile

{% endstep %}

{% step %}

### Start the game

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FUg9K2hZwAgnDYdiaRVRK%2F2026-09-29%2013-54-06.png?alt=media&amp;token=c4cc0feb-1340-4ede-96ef-bfa68f3ece13" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

<p align="center"><a href="/landing/congratulations" class="button primary" data-icon="circle-right">I confirm I was able to connect to the server</a></p>


# Connect using a VPN

Step-by-step process for joining a Fika server using a VPN client.

{% hint style="warning" %}
Free VPNs services are known to cause performance or connectivity problems, so use at your own risk. The officially supported way of playing Fika is with port forwarding. We will not provide support for issues caused by VPN services.

Custom firewalls such as **BitDefender** may also block your connection while playing. Make sure that you allow the connection or temporarily disable it while playing!

You may also experience issues if you are using another VPN service, even if it is disabled. If you have problems, consider uninstalling any other virtual network adapters.
{% endhint %}

{% stepper %}
{% step %}

### Download Radmin client

Navigate to the [Radmin website](https://www.radmin-vpn.com/) and download the Radmin VPN client.
{% endstep %}

{% step %}

### Install Radmin client

Run the installer and proceed with the installation steps.
{% endstep %}

{% step %}

### Reboot your computer

This is important to ensure that the virtual network adapter is correctly installed. **Do not skip this step!**
{% endstep %}

{% step %}

### Open Radmin

Open Radmin VPN client from the taskbar or from the start menu.
{% endstep %}

{% step %}

### Join the server host's Radmin network

Click `Join network`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fl54uwpQDr936l4wcb87B%2Fimage.png?alt=media&amp;token=224e0194-cefe-4ef5-b81b-03d8ad9cfdb9" alt="" width="243"><figcaption></figcaption></figure>

Enter the network name and password used by the server host.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FJ5WThSq26mpSm9vkTY1A%2Fimage.png?alt=media&amp;token=a27e477a-583e-4369-8b45-b8b0e6bcd1f1" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate that you can see server host

You should now be able to see the list of connected peers including the host.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FjXeJrTHajdri3mWomMLC%2Fimage.png?alt=media&amp;token=9a2dbf3b-e072-4237-abed-0792c28bc383" alt="" width="243"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Add Radmin to Windows firewall exclusions

Go to `System` -> `Firewall Exceptions` and click  `Allow All Apps`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Fwe6GPQBIOxbO0ibqmcLs%2Fimage.png?alt=media&amp;token=1adeae53-d2d0-4382-9269-c9797637196e" alt="" width="243"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Start `SPT.Launcher`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F692RZVOM2pfWthc8LYSg%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2F89xf4fwAOWUZlYNbpj1u_2Fimage.png?alt=media&amp;token=c18fc193-29b8-48e1-9886-595de8621c5f" alt="" width="455"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Open `SPT Launcher` settings

Click `Add New Server`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FCS4va8oMm35KYdSGTXkN%2F2026-09-29%2013-57-33.png?alt=media&amp;token=364b1ed0-7037-418b-a115-6947aeaaac89" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Connect to the server host

Give the new server a name and enter the **host's VPN address and port** in the address section.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FwgzJRqOcM87haBZ0avXE%2Fimage.png?alt=media&amp;token=7de13467-ed4d-4416-9656-9c083f0d06ba" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Create your profile

Other profiles that already exist on the server will show up the first time you connect. Do not log in to someone else's profile, create your own profile.
{% endstep %}

{% step %}

### Start the game

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FUg9K2hZwAgnDYdiaRVRK%2F2026-09-29%2013-54-06.png?alt=media&amp;token=c4cc0feb-1340-4ede-96ef-bfa68f3ece13" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

<p align="center"><a href="/joining-a-fika-server/connect-using-a-vpn/ensuring-direct-connection" class="button primary" data-icon="circle-right">I confirm I was able to connect to the server</a></p>


# Ensuring direct connection

{% stepper %}
{% step %}

### Open Radmin

{% endstep %}

{% step %}

### Open the server host's connection properties

Right-click the server host in Radmin and click `Properties`.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FzCgqmu3LxK8ZdsRiLKjm%2Fimage.png?alt=media&amp;token=a180008a-717b-4408-be99-1afe81321330" alt="" width="245"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Validate channel type

Validate that the Channel type is `TCP/out` or `UDP/out`. This mean you have a direct connection to this peer.

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FcYerBNYv2Eeg8Sz1TYL4%2Fimage.png?alt=media&amp;token=31e5b15b-9b2d-47fb-a1d5-76a398e17768" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
If you see `TCP/relay`, then the communication is relayed through Radmin's servers. The performance will be severely degraded. Try disabling any firewall and/or antivirus in your system and reconnect to the network in Radmin.

You *can* play with TCP/relay, but expect lag. You have been warned.
{% endhint %}

<p align="center"><a href="/landing/congratulations" class="button primary" data-icon="circle-right">I validated the channel type</a></p>


# Connect locally

Step-by-step process for joining a Fika server.

{% stepper %}
{% step %}

### Start `SPT.Launcher`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2F6VvP1Zv91r18PGHsINU8%2Fhttps___files.gitbook.com_v0_b_gitbook-x-prod.appspot.com_o_spaces_2FKIBpsnthxy8OSpsWzsDI_2Fuploads_2F89xf4fwAOWUZlYNbpj1u_2Fimage.png?alt=media&amp;token=78e4eec3-5342-453a-909e-fa5d40e80396" alt="" width="455"><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### Open `SPT Launcher`'s settings menu

Click `Add New Server`

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FCS4va8oMm35KYdSGTXkN%2F2026-09-29%2013-57-33.png?alt=media&amp;token=364b1ed0-7037-418b-a115-6947aeaaac89" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Configure server IP

Ask the server host to provide their <mark style="color:$warning;">local IP address</mark>.\
Give the server a name and enter the host's <mark style="color:$warning;">local IP address</mark> in the address section.&#x20;

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2Ff0SNRN0DMVh2SCYFrhPI%2F2026-09-29%2013-59-06.png?alt=media&amp;token=69ee5f9c-6e57-4bdc-856b-415b35534161" alt=""><figcaption></figcaption></figure>

{% endstep %}

{% step %}

### Create your profile

{% endstep %}

{% step %}

### Start the game

<figure><img src="https://625400337-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKIBpsnthxy8OSpsWzsDI%2Fuploads%2FUg9K2hZwAgnDYdiaRVRK%2F2026-09-29%2013-54-06.png?alt=media&amp;token=c4cc0feb-1340-4ede-96ef-bfa68f3ece13" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

<p align="center"><a href="/landing/congratulations" class="button primary" data-icon="circle-right">I confirm I was able to connect to the server</a></p>


# Host or join a raid

<p align="center">Choose if you want to host or join a raid.</p>

<p align="center"><a href="/playing-fika/hosting-a-raid" class="button primary" data-icon="circle-right">Host a raid</a><a href="/playing-fika/joining-a-raid" class="button primary" data-icon="circle-right">Join a raid</a></p>


# Hosting a raid

{% hint style="info" %}
If you are hosting a raid but not the server host, you may need to do additional setup to accept incoming connections. See [this FAQ entry](/faqandguides#there-is-an-error-about-opening-ports-when-joining-a-raid) for more information.
{% endhint %}

{% stepper %}
{% step %}

### Click `Escape From Tarkov` in the main menu

{% endstep %}

{% step %}

### Choose `PMC` or `SCAV`

{% endstep %}

{% step %}

### Choose a raid location and time phase

{% endstep %}

{% step %}

### Click `Next` in Practice Game Mode screen

{% endstep %}

{% step %}

### Click `Next` in Insurance screen

{% endstep %}

{% step %}

### Click `Host Raid` in Lobby screen

{% endstep %}

{% step %}

### Press `Start`

{% endstep %}
{% endstepper %}

{% hint style="info" %}
Once your raid is loaded, you'll see `Waiting for host to start the raid`. Your friends can now see your raid in the lobby screen and join it.

When all players joined, you can start the raid by pressing `Start Raid` at the bottom.
{% endhint %}


# Joining a raid

{% stepper %}
{% step %}

### Click `Escape From Tarkov` in the main menu

{% endstep %}

{% step %}

### Choose `PMC` or `SCAV`

{% endstep %}

{% step %}

### Choose a raid location and time phase

{% endstep %}

{% step %}

### Click `Next` in Practice Game Mode screen

{% endstep %}

{% step %}

### Click `Next` in Insurance screen

{% endstep %}

{% step %}

### Find your friend's raid in the lobby list and click `Join`

{% endstep %}
{% endstepper %}

{% hint style="info" %}
Once your raid is loaded, you'll see "Waiting for host to start the raid." The raid will start when the host presses on `Start Raid`.
{% endhint %}

{% hint style="warning" %}
If you do not see a raid list, revisit [Installing Fika](/installing-fika/installation).

If you do not see your friend's raid in the raid list even though they claim to have hosted one, [see this FAQ entry](/faqandguides#i-do-not-see-my-friend-s-on-the-online-players-list-on-the-main-menu-i-cannot-see-my-friends-raid-in).

If you or your friend is getting an error about verifying ports are open, [see this FAQ entry](/faqandguides#my-friend-is-getting-an-error-about-open-ports-when-trying-to-join-my-raid).
{% endhint %}


# Congratulations

## You have successfully installed Fika! :tada:

You may find useful resources about Fika below.

<p align="center"><a href="/playing-fika/host-or-join-a-raid" class="button primary" data-icon="up-right-from-square">How do I host or join a raid?</a></p>

<p align="center"><a href="/general-information#main-features" class="button primary" data-icon="up-right-from-square">Review Fika features</a></p>

<p align="center"><a href="/fika-configuration" class="button primary" data-icon="up-right-from-square">Configure Fika</a></p>

<p align="center"><a href="/faqandguides" class="button primary" data-icon="up-right-from-square">Common issues &#x26; guides</a></p>

<p align="center"><a href="https://discord.gg/project-fika" class="button primary" data-icon="discord">Join our Discord</a></p>


