1. Introduction
  3. List of emulators without Kaillera
  4. Kaillera SDK
  5. Contact


Kaillera offers the possibility to play video games online through the use of emulators, it consists of a client and a server. The client is embedded into the emulators and the server is a stand-alone application that needs to be run on a PC.

The project needs C++ programmers in order to add Kaillera support to newer emulators and/or to improve the Kaillera client(s), plus Java developers to improve the EmuLinker SF server.

Image Feel free to join our Discord group here.

Please note that this group it’s dedicated to Kaillera related development. There are other Discord groups to organize game sessions.

Downloads (Emulators)

Downloads (Kaillera software - Clients)

Downloads (Kaillera software - Servers & Tools)

Downloads (Various softwares)

List of emulators without Kaillera

[Notes] It’s recommended to fork the projects on GitHub. The idea is to keep the emulators with Kaillera up to date once new versions are released in their respective repositories.

“appName” should have a ++ (Plus! Plus!) added next to the emulator name, as a way to differenciate it from regular versions (as in the MAMEPPK era).

E.g. bsnes would be “bsnes++ v115”, MAMEUI would be “MAMEUI++ 0.220”, etc.

  1. Arcades & Neo·Geo / Homebrew & Hacks ¹
  2. ATARI
  5. NEC
  7. SEGA
  8. SONY
  9. Various
    • Multi-system emulator: byuu

¹ Check the MAMEPPK src for a implementation reference.

Kaillera SDK

kailleraclient.h (overview)


#ifdef _WIN32
#include <windows.h>


#define DLLEXP __declspec(dllexport) WINAPI
#define DLLEXP __declspec(dllimport) WINAPI

#ifdef __cplusplus
extern "C" {

  typedef struct {
    char *appName;
    char *gameList;

    int (WINAPI *gameCallback)(char *game, int player, int numplayers);

    void (WINAPI *chatReceivedCallback)(char *nick, char *text);
    void (WINAPI *clientDroppedCallback)(char *nick, int playernb);

    void (WINAPI *moreInfosCallback)(char *gamename);
  } kailleraInfos;
     Call this method to retrieve kailleraclient.dll's version
     - version must point to a char[16] buffer
  DLLEXP kailleraGetVersion(char *version);
     Call this method when your program starts
  DLLEXP kailleraInit();
     Call this method when your program ends
  DLLEXP kailleraShutdown();
     Use this method for setting up various infos:
     - appName must be 128 chars max.
     - gameList is composed of all the game names separated by a NULL char (\0).
       The list ends with 2 NULL chars (\0\0).
       Be sure to only put available games there.
     - gameCallback will be the function called when a new game starts
       game -> name of the selected game
       player -> player number (1-8). 0 for spectator.
       numplayers -> number of players in the game (1-8)

     - chatReceivedCallback will be the function called when a chat line text
       has been received. Set it to NULL if you don't need/want this callback.
     - clientDroppedCallback will be the function called when a client drops
       from the current game. Set it to NULL if you don't need/want this callback.
     - moreInfosCallback will be the function called when the user selects
       "More infos about this game..." in the game list context menu.
       Set it to NULL if you don't need/want this feature.
  DLLEXP kailleraSetInfos(kailleraInfos *infos);
     Use this method for launching the Kaillera server dialog
  DLLEXP kailleraSelectServerDialog(HWND parent);

     You must call this method at every frame after you retrieved values from your input devices.
     This method will record/bufferize the values you send in and will manage to mix them with 
     the other players.

     Basically, each players sends his values and receive all players values concatened.

     t   - player 1 sends "867F"            - player 2 sends "964F"
     t+1 - player 1 receives "867F964F"     - player 2 receives "867F964F"

     you may want to look at the modified MAME source code available on kaillera's home page
     to have a working example out of this (look in inptport.c)*


     Ideally, your input values should be defined like 1 bit for a given key, which has to be 
     unset when the key is not pressed and set when the key is pressed.

     The size of the values you pass to this function is the size for ONE player's values.
     Also, it must be the SAME for a given game and should be kept to a minimum (for network 
     speed and latency issues).

     Be sure that the values parameters has enough space for receiving all inputs from all players
     (8 players max.)

     returns: length received or -1 on network error (player no more in the game)
  DLLEXP kailleraModifyPlayValues(void *values, int size);
      Use this function to send a line of chat text during a game
  DLLEXP kailleraChatSend(char *text);

      Your emulation thread must call this method when the user stops the emulation
  DLLEXP kailleraEndGame();

#ifdef __cplusplus