28 systems. Cloud saves. Multi-language. Zero backend required.
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.
- 28 Consoles โ NES to PlayStation, Game Boy to Dreamcast
- Automatic Core Selection โ Best emulator core per system
- BIOS Management โ Multi-file BIOS support with UI selection
- Performance Optimized โ SharedArrayBuffer for maximum speed
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- TypeScript First โ Complete type definitions
- Zero Config โ Works out of the box
- Customizable UI โ Accent colors, shaders, controls
- Web Component โ Use without React
npm install koin.js
# or
yarn add koin.js
# or
pnpm add koin.jsimport { 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."
/>
);
}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"
/><GamePlayer
initialLanguage="es" // Spanish UI
/>
// Or provide custom translations
import { en } from 'koin.js';
<GamePlayer
translations={{
controls: {
...en.controls,
play: 'START GAME',
}
}}
/><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>| System | Key | Core |
|---|---|---|
| NES / Famicom | NES |
fceumm |
| Super Nintendo | SNES |
snes9x |
| Nintendo 64 | N64 |
mupen64plus_next |
| Game Boy / Color | GB, GBC |
gambatte |
| Game Boy Advance | GBA |
mgba |
| Nintendo DS | NDS |
desmume |
| PlayStation | PS1 |
pcsx_rearmed |
| PSP | PSP |
ppsspp |
| Sega Genesis / Mega Drive | GENESIS |
genesis_plus_gx |
| Sega Master System | MASTER_SYSTEM |
gearsystem |
| Game Gear | GAME_GEAR |
gearsystem |
| Sega Saturn | SATURN |
yabasanshiro |
| Sega Dreamcast | DREAMCAST |
flycast |
| Sega CD | SEGA_CD |
genesis_plus_gx |
| Neo Geo | NEOGEO |
fbalpha2012_neogeo |
| Arcade (FBNeo) | ARCADE |
fbneo |
| Atari 2600 | ATARI2600 |
stella |
| Atari 7800 | ATARI7800 |
prosystem |
| Atari Lynx | LYNX |
handy |
| PC Engine / TurboGrafx-16 | PCE |
mednafen_pce |
| WonderSwan / Color | WS, WSC |
mednafen_wswan |
| Virtual Boy | VB |
mednafen_vb |
| Vectrex | VECTREX |
vecx |
| Commodore 64 | C64 |
vice_x64 |
| DOS | DOS |
dosbox_pure |
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' },
],
}];
}- Quick Start โ Get up and running
- Usage Guide โ Cloud saves, BIOS, RA integration
- API Reference โ Complete props documentation
- Advanced Guide โ Shaders, recording, controls, i18n
- Systems List โ Per-console configuration
MIT ยฉ Mudit Juneja
