Last updated on May 9th, 2023 at 10:38 am
There are no ROMS hosted here or links to ROMS or Emulators. This is an installation guide only
The purpose of EmulatorJS is to provide a self hosted solution for people looking to run Retro games in their web browsers. It consists of a backend application for scanning roms and ingesting art assets with a static frontend application for serving those files via any basic webserver. The backend application is more or less a run once deal, when you have finalized the menus how you like them the resulting static files of the frontend no longer require the backend helper.
Code Source: Github
Skip to Docker Run Code / Skip to Compose & Portainer Code
See DEMO of emulatorjs in action



Install Docker
Before we start, please ensure you have Docker installed. This can be installed through the Synology Package Center.
Create the Docker Folder
Head into File Station and open the Docker folder. Select Create, choose Create folder and name it emulatorjs. Inside this folder, we’re going to create a new folder called config. (see demonstration)
Create the Scheduled Task
We will now head into Control Panel > Task Scheduler > Create > Scheduled Task and click User-defined script. (see demonstration)

Configure the Scheduled Task
In the window that appears, insert the following:
In the General tab, In the Task field, enter emulatorjs. From the User list, select root. Uncheck the Enabled option.
In the Schedule tab, Select Run on the following date (make sure It’s today’s date). Now select Do not repeat.
In the Task Settings tab, under Notification, You can choose to turn this on, otherwise skip this. Now copy-paste the following code into the Run command area. Now click OK.
docker run -d \
--name=emulatorjs \
-e PUID=1026 \
-e PGID=100 \
-e TZ=Europe/London \
-e SUBFOLDER=/ `#optional` \
-p 3000:3000 \
-p 8083:8080 \
-p 4001:4001 `#optional` \
-v /volume1/docker/emulatorjs/config:/config \
-v /volume1/data/retro:/data \
--restart unless-stopped \
lscr.io/linuxserver/emulatorjs:latest
Important: Ensure you update the code to reflect your details.
Accept the warning prompt
When the below warning appears, press OK.

Run the Scheduled Task
You will now see your list of tasks. Select emulatorjs, now press Run. When asked to run, press Yes.

Create Reverse Proxy (Optional)
Head into Control Panel > Login Portal > Advanced. Click Reverse Proxy and then click Create. A dialog box will appear prompting you to edit the following settings (ensure you change the values to your own). If you do not yet have a DDNS, you can find a guide on how to do this here. Once done, press Save.
Reverse Proxy Name | arcade |
Protocol | HTTPS |
Hostname | arcade.yourhostname.me (You can change actual to whatever you like) |
Port | 443 |
Protocol | HTTP |
Hostname | localhost or your Synology IP address |
Port | 3000 |
Your app is now Installed
The installation process has now finished. Give it a few seconds to appear in your Docker list. Open your browser and enter the link to your new container http://synologyip:3000
On your first visit you will see a Download button, press this to download the default fileset. This process may take several minutes to complete.

Once complete, you will see the ‘Downloaded All Files‘ message. Press the little black box to the top right to exit this window.

You should now see the below screen. Your install is pretty much finished at this point. We just need to install some ROMS, legally of course.

To install your ROMS, head into the directory that you set as your data folder during install. For me this was /volume1/data/retro. Your folder should now look like the screenshot below with a list of folders. These are your ROM data folders.

I’ll be using SNES for this example. Click into the SNES folder. Inside the SNES folder, click into the roms folder.

This is the folder that you will upload your zipped roms to. You can use the Upload button, drag and drop, or you can visit the folders locally on your Network for ease. Go ahead and upload your ROMS.

Now go back to your install url http://synologyip:3000 and refresh the page. It should look similar to the screenshot below. I’ve also added in some extra roms. Press the Scan button for each folder. When the scan completes press the little exit button to the top right. You will know it’s completed when you see ‘Scan exited with code: 0‘

Your screen should now look like the screenshot below. You’ll notice now that to the left hand side you will have categories. Press into snes.

You should now see the list of SNES roms. You will notice some steps to the left. We’re now going to run through those steps. Press Download All Available Art. This process may take some time depending on how many ROMS you have as it also downloads video files during this process. At times it may look like it has stopped or frozen. Let it do it’s thing and wait for the message Downloaded All Files. Press the little exit icon to the top right to exit this box.

You should see your ROMS now in Green. From the left menu, press Add All Roms to Config. This should be a very quick step and it should return you back to the home screen. Follow the same process for any other ROMS you have added.

That’s you all done. Head over to http://synologyip:3000/frontend to access your games. It should look like below.

See Emulatorjs Demo
Docker Compose and Portainer
If you would prefer to install with Docker Compose or Portainer, use the following code. You can also view a demonstration here.
version: '3.3'
services:
linuxserver:
container_name: emulatorjs
environment:
- PUID=1026
- PGID=100
- TZ=Europe/London
- SUBFOLDER=/
ports:
- '3000:3000'
- '8083:8080'
- '4001:4001'
volumes:
- '/volume1/docker/emulatorjs/config:/config'
- '/volume1/data/retro:/data'
restart: unless-stopped
image: 'lscr.io/linuxserver/emulatorjs:latest'
More Guides:
Actual AdGuard airsonic Audiobookshelf autobrr Bitcoin Calibre-Web ChatpadAI Cleanarr Composerize Crypto DailyTxT Dashy deemix Deluge Emby EmulatorJS Ethereum Euterpe FileBot FilePizza FileZilla Flame Focalboard FreshRSS Grafana Grocy Heimdall Homarr Home Assistant Homebridge Jackett Jellyfin Jellyseerr Joplin Kavita Komga LanguageTool LibreOffice Lidarr Mealie MediaGoblin Medusa Memegen Minecraft Minecraft Bedrock MQTT MusicBrainz MyMediaForAlexa Navidrome Node-RED NZBGet NZBHydra Ombi Overseerr PaperlessNGX Pashword Password Cards Petio Pi-Hole Picard Plex Portainer PostgreSQL Prowlarr PUID & PGID pwndrop Radarr Radicale Readarr ruTorrent SABnzbd SearX Seed Phrase Shiori Sonarr SpeedTest Stash Storm Tailscale TasmoAdmin Tautulli Theia Trilium TubeSync Unpackerr Uptime Kuma Vaultwarden Watchtower WebPDF Whisparr Wordle YouTubeDL
