Skip to content

muditjuneja/koin

Repository files navigation

koin.js

Browser Retro Game Emulation for React

24 systems. Cloud saves. Multi-language. Zero backend required.

Try the Demo NPM Version License

The drop-in React component for browser-based retro game emulation. Built on Nostalgist.js, adding production-ready features like cloud saves, touch controls, gameplay recording, and RetroAchievements.

koin.js

Features

๐ŸŽฎ Core Emulation

  • 25 Consoles โ€” NES to PlayStation, Game Boy to Saturn
  • Automatic Core Selection โ€” Best emulator core per system
  • BIOS Management โ€” Multi-file BIOS support with UI selection
  • Performance Optimized โ€” SharedArrayBuffer for maximum speed

โ˜๏ธ Save System

  • Slot-Based Saves โ€” Multiple save states with screenshots
  • Auto-Save โ€” Periodic background saves (configurable interval)
  • Emergency Saves โ€” Automatic save on tab hide/close
  • Cloud-Ready API โ€” Bring your own backend with async handlers

๐ŸŽจ Display & Effects

  • 10 CRT Shaders โ€” Lottes, Geom, Easymode, Hyllian, zFast, and more
  • Runtime Shader Switching โ€” Change filters without restart
  • System Theming โ€” Per-console accent colors
  • Screenshot Capture โ€” PNG snapshots with hotkey support

๐Ÿ•น๏ธ Controls

  • Keyboard Remapping โ€” Per-console custom key bindings
  • Gamepad Support โ€” Auto-detect Xbox, PlayStation, Nintendo controllers
  • Touch Controls โ€” GPU-accelerated virtual D-pad and buttons for mobile
  • Control Persistence โ€” Saves user preferences across sessions

โช Special Features

  • Rewind โ€” Time-travel gameplay (auto-enabled for 8/16-bit)
  • Speed Control โ€” 0.25x to 4x with hotkey toggle
  • Fast-Forward โ€” Turbo mode for grinding

๐Ÿ“น Recording & Overlays

  • Gameplay Recording โ€” VP9/VP8 WebM capture at 30fps
  • Performance Overlay โ€” FPS, frame time, memory stats
  • Input Display โ€” Virtual controller overlay for streaming
  • Toast Notifications โ€” Non-intrusive save/load feedback

๐Ÿ† RetroAchievements

  • Official RA Integration โ€” Track unlocks across sessions
  • Hardcore Mode โ€” Disable saves/cheats for leaderboard eligibility
  • Achievement Browser โ€” Filter by locked/unlocked status
  • Progress Tracking โ€” Points remaining per game

๐ŸŒ Internationalization

  • 3 Built-in Languages โ€” English, Spanish, French
  • Type-Safe Translations โ€” Full TypeScript support
  • Partial Overrides โ€” Customize specific strings
  • Custom Languages โ€” Implement your own translation set

๐ŸŽฏ Developer Experience

  • TypeScript First โ€” Complete type definitions
  • Zero Config โ€” Works out of the box
  • Customizable UI โ€” Accent colors, shaders, controls
  • Web Component โ€” Use without React

Installation

npm install koin.js
# or
yarn add koin.js
# or
pnpm add koin.js

Quick Start

import { GamePlayer } from 'koin.js';
import 'koin.js/styles.css';

export default function App() {
  return (
    <GamePlayer
      romId="game-123"
      romUrl="/roms/mario.nes"
      system="NES"
      title="Super Mario Bros."
    />
  );
}

Cloud Integration

import { GamePlayer } from 'koin.js';

<GamePlayer
  romId="game-123"
  romUrl="/roms/game.nes"
  system="NES"
  title="My Game"
  
  // Cloud save handlers
  onSaveState={async (slot, blob, screenshot) => {
    await fetch(`/api/saves/${slot}`, {
      method: 'POST',
      body: blob,
    });
  }}
  onLoadState={async (slot) => {
    const res = await fetch(`/api/saves/${slot}`);
    return res.ok ? await res.blob() : null;
  }}
  onAutoSave={async (blob, screenshot) => {
    await fetch('/api/autosave', { method: 'POST', body: blob });
  }}
  
  // Customization
  systemColor="#FF3333"
  shader="crt/crt-lottes"
  initialLanguage="es"
/>

Internationalization

<GamePlayer
  initialLanguage="es"  // Spanish UI
/>

// Or provide custom translations
import { en } from 'koin.js';

<GamePlayer
  translations={{
    controls: {
      ...en.controls,
      play: 'START GAME',
    }
  }}
/>

Web Component

<script src="https://unpkg.com/koin.js/dist/web-component.global.js"></script>

<retro-game-player
  rom-url="./game.nes"
  system="nes"
  title="My Game"
  rom-id="game-1"
></retro-game-player>

Supported Systems

System Key Core Source
NES / Famicom NES fceumm Nostalgist
Super Nintendo SNES snes9x Nostalgist
Nintendo 64 N64 mupen64plus_next BinBashBanana
Game Boy / Color GB, GBC gambatte Nostalgist
Game Boy Advance GBA mgba Nostalgist
Nintendo DS NDS melonds BinBashBanana
PlayStation PS1 pcsx_rearmed Nostalgist
Sega Genesis / Mega Drive GENESIS genesis_plus_gx Nostalgist
Sega Master System MASTER_SYSTEM gearsystem Nostalgist
Game Gear GAME_GEAR gearsystem Nostalgist
Sega Saturn SATURN yabause BinBashBanana
Neo Geo NEOGEO fbalpha2012_neogeo Nostalgist
Arcade (FBNeo) ARCADE fbneo Nostalgist
Atari 2600 ATARI_2600 stella2014 BinBashBanana
Atari 5200 ATARI_5200 a5200 BinBashBanana
Atari 7800 ATARI_7800 prosystem BinBashBanana
Atari Lynx LYNX handy Nostalgist
PC Engine / TurboGrafx-16 PC_ENGINE mednafen_pce_fast Nostalgist
WonderSwan / Color WONDERSWAN, WONDERSWAN_COLOR mednafen_wswan Nostalgist
Virtual Boy VIRTUAL_BOY mednafen_vb Nostalgist
Neo Geo Pocket / Color NEOGEO_POCKET, NEOGEO_POCKET_COLOR mednafen_ngp Nostalgist
Commodore 64 C64 vice_x64 Nostalgist

Note: Systems marked BinBashBanana use cores from BinBashBanana/webretro via jsDelivr. Dreamcast and PSP are currently unavailable due to lack of compatible WASM cores.

Full system details โ†’

Requirements

COOP/COEP Headers Required for SharedArrayBuffer:

// next.config.js
async headers() {
  return [{
    source: '/:path*',
    headers: [
      { key: 'Cross-Origin-Opener-Policy', value: 'same-origin' },
      { key: 'Cross-Origin-Embedder-Policy', value: 'require-corp' },
    ],
  }];
}

Documentation

License

MIT ยฉ Mudit Juneja

About

The high-performance, preservation-focused emulation engine powering Koin Deck. Built for those who remember blowing into cartridges, but demand the convenience of the cloud.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors

Languages