Telemelt

Passing the controller around while hanging with friends has been a consistent joy throughout our lives, and one of the rituals we miss the most with the ones we're separated from right now. We wanted a way to play single player/hotseat games with friends remotely. Netplay has always been unsatisfying for this, since only the host had low enough latency for games that require tight timing.

**

This project intentionally omits things like social features, logins, and achievements. Instead, it aims to provide a free, easy way to reconnect and celebrate games with friends, even if they are not tech savvy, with the lowest hassle possible.

Features

  • Nothing to install, no IPs or port forwarding just visit the site in Edge/Chrome and share the link
  • No registration, no tracking, no social features, no paid ads, free!
  • Active player runs in real-time and not subject to any network latency
  • Low bandwidth requirements for international friends / those with network issues (only sync/controller/event data sent - no A/V)
  • NES, SNES, Genesis/SMS/GG, GB/GBC, GBA, TG16/PCE cores built in
  • Most major USB/BT gamepads supported via Retroarch autoconfigs (PS3, PS4, XB360, Switch Pro etc..)
  • Real time sfx and viewer reactions using gamepad or keyboard to cheer for your pals
  • Guaranteed <1sec of latency for viewer (will fast forward if there are network issues)
  • Users can load content from Dropbox, and everyone will automatically retrieve it from a temporary URL (great for testing homebrew/public domain)
  • Full uncompressed audio/video rendered locally on the client
  • Distributed save/load state features
  • Splash screen is an actual 6502 NES ROM ;)
  • Up to 8 players per room

Quick start - Open up a Discord/Zoom/Meet etc.. with friends and try some of these!

  • Minigame collections (player transfer system is fast enough to keep up with switching on every stage)
  • Practice for a week then hold live olympic games (world/winter/summer/california games etc)
  • Live sound test or NSF/VGM listening party
  • Golf / bowling / fishing games to chill
  • Create music collaboratively in LSDJ/NTRQ
  • TV Gameshows
  • Painting games (mouse support)
  • Grind through an rpg over a few weeks (savestates work great for this)
  • Alternate co-piloting a game no one has played before on gamefaqs
  • Teach techniques for speedruns where you can demonstrate and hand off for practice
  • Homebrews, hacks, and live demoparties (with live reactions)
  • Hotseat tactical / turn based games
  • Teach a friend to speedrun with the ability to demonstrate and practice together

Known Issues (8/27)

  • When using local content mode the room creator may need to load the content twice when switching cores
  • Loading broken content can crash a core and leave the room in an unusable state, verify that the file is working in the corresponding native retroarch core
  • The new content loading system may unassign a player when changing content, if the current player is empty/stuck then just click become player to fix

Changelog

v0.91
  • Fast-forward indicator
v0.86-v0.90 (live)
  • Enhanced user experience for new players

    • Tooltips for most buttons, mouse over a button to see a pop up with contextual information
    • Settings storage cleanup
  • Session initials and icon are now set at join screen

    • Removes live profile traffic and optimizes heartbeat exchange
    • Redesigned profile input system
    • Assignment of roles for the session
  • Provide local content room option

    • New display that prompts users with file details to provide their own matching content
    • Providing a matching checksum/CRC32 will allow the user to join the session
  • Saved room configuration preferences

  • Fixed emoji search bar and broken scrollbars

  • Rooms will now only allow one connection from an IP when the server is congested

  • Content detail system

    • URL content is now manually accepted in URL mode
    • Content display to verify CRC/size before downloading
    • Checkbox to automatically trust content from a session
  • New room options configuration page

  • Restricted controller room option

    • When enabled, only the room creator may grab the controller
    • The current player may pass to any active user
    • NOTE: The controller is passed to the room creator on disconnect if available, otherwise it will be randomly assigned
  • Restricted content change room option

    • When enabled, only the room creator may load new room content
    • A new room will need to be created to change content if the room creator leaves
  • Adjustable room size

    • Telemelt supports 2-8 players, smaller sized rooms keep the system fast for everyone. Spectators consume the same amount of bandwidth as players so please stream to non-participants if that's an option.
  • Network engine optimization

    • Reduced overall traffic for room state / delta updates
    • Live integrity check of socket messages
    • Auth token system
  • Server shutdown warning for new updates

  • Room lock feature

    • The room creator may lock/unlock a room using the '🔒 Lock Room' button on the main bar
    • When locked, no new users may join the room - it must be unlocked by the room creator to allow new users
    • NOTE: The room will unlock automatically when changing cores - this will be fixed in 1.0
  • Room creator role

    • The room creator (🔸) is assigned automatically to the user who set it up, you may leave the room and come back but the role cannot be reassigned
    • Ctrl+LeftClick on a user will kick (👢) them from the room, that user can return at any time
    • Ctrl+Alt+LeftClick on a user will block (❌) them from the room, that user's IP will not be able to return to this room
    • Please note that these are for utility and cannot effectively moderate in an IP based / registration-free system. Sessions are still intended to be private and the only way to avoid undesired behavior from users is to control the room key. Please see the FAQ for more details.
  • Rooms now expire when left unoccupied for a fixed amount of time

v0.85
  • Remap configuration UI
    • Reactions may now be mapped to keyboard or gamepad
    • System hotkeys can now be mapped (quick save, reset etc..)
v0.84
  • CPU sync recovery
    • This should help less powerful systems that drop frames more often
    • Now runs on netbooks that would typically lag on GBA cores
  • Live controller input display for current player (can disable in settings)
    • Uses the data from the processed frame to display the player's inputs
    • Universal SNES style for all cores for now
  • Turn timer display (can disable in settings)
    • Timer resets on player pass
  • Reaction volume mixer system
v0.83
  • Spectator mode
    • A user may remove themselves from the pass controller rotation by clicking the 👁 icon
    • Spectators are shown on the right hand side of the toggle button
v0.82
  • UI Overhaul
    • Current player highlight
    • Vue / button callback cleanup
v0.81
  • NESpectre Integration
    • (link to doc)
  • Quick Save/Load
    • These are temporary and will be lost on reload
  • SNES Mouse Support
    • Currently will auto-detect based on content CRC, this will be updated to be selectable in the future

Roadmap

v1.0
  • uWebSockets engine port
  • SRM export
  • Controller port options

FAQ

Is the project still under active development? Can I request a feature?

Telemelt was originally designed as an internal tool to beta test homebrew NES/Genesis work with friends, as the platform developed we started routinely using it to play games together. The decision to grant public access to the system was strictly because I thought it would be useful for others looking for the same experience.

It took many, many months of effort to implement the synchronization system that makes Telemelt sessions run so smoothly, as of v1.0 I will consider Telemelt feature complete. It'll continue to be used to experiment with homebrew/game extensions, but otherwise no major changes to the platform itself after that.

Thank you to everyone who helped me test along the way, appreciate your insight/time and I hope you all had as much fun as I did.

Which controllers work with Telemelt?

Many USB/Bluetooth controllers are automatically supported out of the box thanks to the joy profiles in RetroArch. The default configuration will attempt to load an from the RetroArch autoconfig, but if the controller is not found then simply remap it in the settings.

My emulator stutters / fast-forwards

  • If you are on a laptop, be sure to plug it in and verify that it is set to performance mode since throttling the CPU can cause the emulator to run behind the player
  • Using a Bluetooth audio device can sometimes cause input lag with the browser, try using native audio on your system to see if it makes a difference
  • A high speed monitor (120/144/240hz) may cause judder since cores natively run near 60hz, try changing the refresh rate to 60hz
  • There are known issues with crackling in the audio buffer of the current Firefox, please use Edge or Chrome for best results

Will you ever support 2+ players?

Telemelt is unique in that it has been completely designed around the concept of a single controller. If you are looking for true multiplayer you can use netplay (RetroArch, Fightcade) and I personally have had great results with Parsec and Steam Remote Play.

Why are sessions intended to be private?

  • While I want as many people as possible to use this tool, posting the link publicly bogs down the server with unnecessary traffic, degrades performance for users and increases the cost. The reason Telemelt sessions runs so smoothly in comparison with other P2P systems is that there is a dedicated server that relays all of the control inputs/savestates in real time, but this is an intensive process since it broadcasts to every single user in the room. Users with no intention to play with a tab left open consumes resources on the backend, which is more like a traditional game server and less like a website.

  • Telemelt does not require registration. There is no reliable way to remove a user from a session since your IP is the only unique identifier, this is a technical limitation of an account free system. The only guaranteed way to avoid issues is to share the link in a secure place. Although the room creator can remove participants, a malicious user may find a way to ruin a session before you can react. Since the client is web-based the system needs to rely on some amount of trust in the active players emulator in order to maintain the fast synchronization that Telemelt offers.

The room key / URL is equivalent to your game server password and sharing it outside of trusted participants risks undesired behavior.

Where can I find content to try?

The retro development scene has come so far in recent years, some of the most unique and polished games/demos I've ever played on the GB/NES/Genesis have been freely available homebrew.

pdroms.de / Public domain roms

Itch.io / Homebrew section

pouet.net / Demoscene prods

Experiments using the Telemelt sync system

NESpectre

NESpectre is a software implementation of a hardware project that allowed live audience manipulation of RAM in an actual NES console. It was ported to Telemelt to test live-patching changes to the existing RAM synchronization. There are standard options to grant lives, powerups, etc. althrough the main intention is to manipulate the game audio/video/logic and crash in interesting ways. Save state often if you want to try to work your way through the glitches.

When loading a ROM detects if content is supported by checksum, a purple 👻 button will appear in the toolbar. Simply click any button on the NESpectre panel to manipulate the player's game live.

Distributed races
  • (diagram to be added @ v1.0)
IPS / randomizer deployment
  • (diagram to be added @ v1.0)

Will you support more cores?

The cores chosen for Telemelt are working within the restrictions of running in a browser. Since every user is running the emulator locally they'll need to run at full-speed on every client in order to maintain sync. Even though a machine might be powerful enough to run the core natively, it may suffer optimization loss in the port to webassembly.

Some issues that would disqualify a core:

  • Serialized states too large for player transfer (ex. one with large VRAM, would take seconds each controller pass/desync)
  • No emscripten port / unacceptable performance in browser
  • Non-deterministic or unserializable state
  • Additional configuration and peripherals (multi-file/disk drives, BIOS, keyboard, etc..)
  • CD-based systems / ISOs exceeding file size limit

Check out Steam Remote Play in RetroArch to emulate more advanced systems natively.