Frontend-Killer

Frontend-Killer

Docker app from fansmall's Repository

Overview

Frontend-Killer is a web-based game list manager for emulator frontends. Import, manage, export and scrape game metadata and media across Pegasus, ES-DE, RetroBat, EmuELEC, Lakka and more, with full ScreenScraper integration (auto metadata/media download, CRC32 matching, quota monitoring).

Frontend-Killer

Frontend-Killer

A web-based game list management tool for emulator frontend metadata. Import, manage, export, and scrape game metadata across multiple frontend formats.

What's New in 1.2

  • Unified Scraping Task Pool & Dynamic Threads - Completely redesigned scraping architecture: database-backed task queue (scrape_task) replaces in-memory thread management; ThreadPoolExecutor with runtime dynamic resizing (no restart when SS maxThreads changes); three-level priority scheduling (user scrape > media download > arcade auto-download); SS quota auto-validation on every API call; app restart auto-recovers interrupted tasks
  • Theme Package System - Customizable UI themes with data/themes/{themeId}/theme.json configuration; supports colors (dark/light mode), custom fonts, and per-theme sound effects; theme grid UI in system settings with live preview cards
  • Scraper Stability Fix - Fixed scraping hang/deadlock caused by ThreadResourceManager counter corruption; media downloads now use an independent Semaphore decoupled from the shared game-info thread pool
  • Media Download Performance - Media download throughput improved with 64KB buffer (was 8KB) and independent concurrency control (3 parallel downloads) that no longer competes with game info scraping threads
  • Template Variables (v3 variables block) - Optional global variables declared in templates, set by the user before import/export; shared across {var} placeholders and expressions
  • Searchable Multi-Select Filters - Developer, publisher and genre (two-level with sub-genres) filters in the game list now use searchable multi-select dropdowns; genre filtering now works correctly for multi-genre games and scrape-status filtering offers four states
  • Notification Center - Real-time task notifications via SSE push, with unread badge and auto-created alerts on task completion/failure
  • Scraper Media Path Restructure - New storage layout keyed by ScreenScraper system/game ID (data/scraper/games/{ssSystemId}/{ssGameId}/), with local-file reuse to skip already-downloaded media
  • Batch Aggregation Endpoints - Single GROUP BY queries replace N+1 COUNT/statistics calls for media-download summaries and platform stats
  • Template Media-Type Preset - Scrape modals can preset media types directly from an export template
  • Thymeleaf Migration & UI Polish - Unified server-side layout, icon-based action buttons, and row-click editing across pages
  • Genre Dialect Mapping - Term mapping system (term_mapping table) with 261 seed entries normalizes genre synonyms across languages and frontends (e.g. "Beat'em Up" / "act" → unified target); map() and mapFirst() expression functions available in v3 export templates for genre subdirectory generation; Racing/Driving dialect mapping added
  • Export & Filter Fixes - poor_quality scrape-status filter redefined to check metadata completeness (desc/developer/publisher/genre/releasedate) instead of media presence
  • Performance & Stability Fixes - Fixed import performance, SSE zombie connections, missing xz dependency, and H2 summary bugs
  • Internationalization - Continued Chinese / English / Japanese coverage across pages
  • Batch Platform Operations - Checkbox + always-visible toolbar on platform management page for batch scrape, translate, swap translations, scan stats, and delete across multiple platforms at once
  • Failed Task Viewer - Click failed count on the media-download page to open a styled modal showing failed tasks with game links (jump to game-edit), platform info, error messages, and one-click retry
  • Separate Scrape Progress Tracking - Game info and media download progress now displayed as two independent cards with categorized counts (pending/running/completed/failed)
  • Fixed Table Scroll & Sticky Headers - Game list and platform management tables scroll within fixed-height containers with sticky table headers, keeping toolbar and search area always visible
  • Empty Field Filters - Search for games with empty name, description, genre, players, publisher, or rating fields via new checkbox filters in the search area
  • Search Auto-fill from Filename - Game edit page search modal now pre-fills with the ROM filename (without extension) when the game name is empty

Upgrading from 1.1-RC1? The scraper media directory structure changed, so previously scraped media files may not be reused directly and may require re-scraping.


English

Features

  • Game list management (CRUD) with search and filtering
  • Import from multiple frontend templates (Pegasus, RetroBat, ES-DE, EmuELEC, Lakka, Skraper, and more)
  • Export to multiple frontend templates with v3 expression engine
  • ScreenScraper integration for automated game metadata and media scraping
  • Media file management (images, videos, manuals)
  • Platform merge and data migration
  • Background task management with progress tracking
  • Multi-language support (Chinese, English, Japanese)

Tech Stack

  • Java 17 + Spring Boot 3.2.x
  • H2 Database (embedded)
  • MyBatis + Flyway
  • HTML5 + JavaScript (no frontend framework)
  • Docker support

Deployment

Option 1: Docker (Recommended)

docker pull fansmall/frontendkiller:latest

mkdir -p ./data ./roms

docker run -d \
  --name frontend-killer \
  -p 8080:8080 \
  -v ./data:/data \
  -v ./roms:/data/roms \
  -e SPRING_PROFILES_ACTIVE=default \
  -e SERVER_TOMCAT_BASEDIR=/data \
  -e SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input \
  -e JAVA_OPTS="-Xmx2g -Xms512m -XX:+UseG1GC" \
  -e PUID=0 -e PGID=0 -e TZ=Asia/Shanghai \
  --restart unless-stopped \
  fansmall/frontendkiller:latest

Option 2: Docker Compose

services:
  frontend-killer:
    image: fansmall/frontendkiller:latest
    container_name: frontend-killer
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./roms:/data/roms
    environment:
      - SPRING_PROFILES_ACTIVE=default
      - SERVER_TOMCAT_BASEDIR=/data
      - SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input
      - JAVA_OPTS=-Xmx2g -Xms512m -XX:+UseG1GC
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
    restart: unless-stopped

Run: docker compose up -d

Option 3: JAR File

Requires Java 17+.

java -jar webGamelistOper-1.2.jar

Option 4: Windows EXE (No Java Required)

Download the EXE package from GitHub Releases, extract and run Frontend-Killer.exe.

unRAID / NAS (Community Applications)

Frontend-Killer ships an unRAID template at unraid/frontend-killer.xml. Install it from Community Applications, or manually via Docker → Add Container with image fansmall/frontendkiller:latest, port 8080, volumes <appdata>:/data and <roms>:/data/roms, and set PUID=99 / PGID=100 so files land with correct ownership on unRAID shares.

Access

http://localhost:8080


中文

功能特性

  • 游戏列表管理(增删改查),支持搜索和过滤
  • 支持多种前端模板导入(Pegasus、RetroBat、ES-DE、EmuELEC、Lakka、Skraper 等)
  • 支持多种前端模板导出,v3 表达式引擎支持
  • ScreenScraper 集成,自动刮削游戏元数据和媒体文件
  • 媒体文件管理(图片、视频、手册)
  • 平台合并与数据迁移
  • 后台任务管理与进度追踪
  • 多语言支持(中文、英文、日文)

技术栈

  • Java 17 + Spring Boot 3.2.x
  • H2 数据库(嵌入式)
  • MyBatis + Flyway
  • HTML5 + JavaScript(无前端框架)
  • Docker 支持

部署方式

方式一:Docker 部署(推荐)

docker pull fansmall/frontendkiller:latest

mkdir -p ./data ./roms

docker run -d \
  --name frontend-killer \
  -p 8080:8080 \
  -v ./data:/data \
  -v ./roms:/data/roms \
  -e SPRING_PROFILES_ACTIVE=default \
  -e SERVER_TOMCAT_BASEDIR=/data \
  -e SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input \
  -e JAVA_OPTS="-Xmx2g -Xms512m -XX:+UseG1GC" \
  -e PUID=0 -e PGID=0 -e TZ=Asia/Shanghai \
  --restart unless-stopped \
  fansmall/frontendkiller:latest

方式二:Docker Compose 部署

services:
  frontend-killer:
    image: fansmall/frontendkiller:latest
    container_name: frontend-killer
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./roms:/data/roms
    environment:
      - SPRING_PROFILES_ACTIVE=default
      - SERVER_TOMCAT_BASEDIR=/data
      - SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input
      - JAVA_OPTS=-Xmx2g -Xms512m -XX:+UseG1GC
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
    restart: unless-stopped

运行:docker compose up -d

方式三:JAR 包运行

需要 Java 17+。

java -jar webGamelistOper-1.2.jar

方式四:Windows EXE(无需 Java)

从 GitHub Releases 下载 EXE 安装包,解压后运行 Frontend-Killer.exe。

unRAID / NAS(Community Applications)

项目自带 unRAID 模板 unraid/frontend-killer.xml。可通过 Community Applications 安装,或手动:Docker → Add Container,镜像 fansmall/frontendkiller:latest,端口 8080,卷 <appdata>:/data 与 <roms>:/data/roms,并设置 PUID=99 / PGID=100 以保证 unRAID 共享目录的文件归属正确。

访问地址

http://localhost:8080


日本語

機能特徴

  • ゲームリスト管理(追加、削除、更新、検索)、フィルタリング対応
  • 複数のフロントエンドテンプレートからのインポート(Pegasus、RetroBat、ES-DE、EmuELEC、Lakka、Skraper など)
  • 複数のフロントエンドテンプレートへのエクスポート、v3 式エンジン対応
  • ScreenScraper 統合、ゲームメタデータとメディアファイルの自動スクレイピング
  • メディアファイル管理(画像、動画、マニュアル)
  • プラットフォーム統合とデータ移行
  • バックグラウンドタスク管理と進捗追跡
  • 多言語サポート(中国語、英語、日本語)

技術スタック

  • Java 17 + Spring Boot 3.2.x
  • H2 データベース(組み込み)
  • MyBatis + Flyway
  • HTML5 + JavaScript(フロントエンドフレームワークなし)
  • Docker サポート

デプロイ方法

オプション1:Docker(推奨)

docker pull fansmall/frontendkiller:latest

mkdir -p ./data ./roms

docker run -d \
  --name frontend-killer \
  -p 8080:8080 \
  -v ./data:/data \
  -v ./roms:/data/roms \
  -e SPRING_PROFILES_ACTIVE=default \
  -e SERVER_TOMCAT_BASEDIR=/data \
  -e SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input \
  -e JAVA_OPTS="-Xmx2g -Xms512m -XX:+UseG1GC" \
  -e PUID=0 -e PGID=0 -e TZ=Asia/Shanghai \
  --restart unless-stopped \
  fansmall/frontendkiller:latest

オプション2:Docker Compose

services:
  frontend-killer:
    image: fansmall/frontendkiller:latest
    container_name: frontend-killer
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./roms:/data/roms
    environment:
      - SPRING_PROFILES_ACTIVE=default
      - SERVER_TOMCAT_BASEDIR=/data
      - SPRING_RESOURCES_STATIC_LOCATIONS=classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input
      - JAVA_OPTS=-Xmx2g -Xms512m -XX:+UseG1GC
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
    restart: unless-stopped

実行:docker compose up -d

オプション3:JARファイル

Java 17+ が必要です。

java -jar webGamelistOper-1.2.jar

オプション4:Windows EXE(Java不要)

GitHub Releases から EXE パッケージをダウンロードし、解凍して Frontend-Killer.exe を実行してください。

unRAID / NAS(Community Applications)

unRAID 用テンプレート unraid/frontend-killer.xml を同梱しています。Community Applications から導入するか、手動で Docker → Add Container にイメージ fansmall/frontendkiller:latest、ポート 8080、ボリューム <appdata>:/data と <roms>:/data/roms を設定し、PUID=99 / PGID=100 で unRAID 共有のファイル所有権を合わせてください。

アクセスアドレス

http://localhost:8080


Roadmap

Completed

  • Import/export templates: Pegasus, RetroBat, ES-DE, EmuELEC, Lakka, Skraper
  • ScreenScraper API integration for game scraping
  • v3 template system with expression engine
  • Native Windows EXE distribution (jpackage)
  • Multi-language support (Chinese, English, Japanese)
  • File existence verification
  • Background task recovery

Planned

  • Multi-file game support (e.g., DOS games) - treat entire game folders as entries
  • Folder export configuration with configurable parent directory levels
  • Advanced game filtering options
  • Statistics dashboard for game collection analytics
  • Additional frontend templates: EmuDeck, Recalbox, Batocera

🔮 Coming in 1.3

  • 💿 Disc-Based Platform Scraping Overhaul - Smarter game identification for ISO/CHD/BIN disc images (PS1, PS2, Saturn, Dreamcast, PCE-CD, MD-CD, etc.): instead of relying on fragile whole-file CRC32 (which changes with even a single byte), the scraper will now extract stable identifiers — volume labels (ISO9660 PVD) and game serial numbers (e.g. SLUS-00001) — via a layered strategy: filename regex → ISO9660 sector read → system-specific parsing (SYSTEM.CNF, IP header) → CRC fallback. Supports .iso, .bin+.cue, .chd (filename-only), and raw .bin
  • 🆕 Brand New Onboarding Guide - A completely redesigned feature walkthrough with interactive tutorials, helping new users get up to speed in minutes instead of hours
  • ⚡ Multi-Threading Further Optimization - Deeper concurrency improvements across scraping, media download, and import/export pipelines for even better throughput and stability
  • 🐛 Bug Fixes from 1.2 - All known issues reported in 1.2 will be addressed, ensuring a smoother experience

🔮 Coming in 1.4

  • 🧭 Smart System Matching & Auto-Binding - When a platform has no scraper system bound, the app will automatically detect and suggest matching systems via fuzzy matching (Levenshtein + alias pool + extension analysis). Users can confirm, manually select, or skip — with a "remember this mapping" option that builds a self-learning alias dictionary over time. After binding, auto-scrape kicks in if the platform has unscraped games
  • 📂 Multi-File Game Support - Treat entire game folders as single entries (DOS games, multi-disc titles), with folder-level CRC/media strategies

Version: 1.2

Requirements

A ScreenScraper account (free) for scraping, and the path to your ROM library mapped in for import and CRC/file-existence checks.

Download Statistics

192
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
fansmall/frontendkiller:latest
Last Updated2026-09-15
First Seen2026-09-17

Runtime arguments

Web UI
http://[IP]:[PORT:8080]
Network
bridge
Shell
bash
Privileged
false

Template configuration

Web UI PortPorttcp

Web interface port. Container listens on 8080.

Target
8080
Default
8080
Value
8080
App Data (db / rules / media / logs)Pathrw

Persistent storage: H2 database, import/export rules, scraped media, input, output, backups and logs. Map to an appdata share so data survives container updates.

Target
/data
Default
/mnt/user/appdata/frontend-killer/
Value
/mnt/user/appdata/frontend-killer/
ROM LibraryPathrw

Your ROM library, used as the import source and for CRC/file-existence checks. Point this at the share holding your game files. Optional but recommended.

Target
/data/roms
Default
/mnt/user/data/roms/
Value
/mnt/user/data/roms/
PUIDVariable

Process User ID. Files written to the mapped paths will be owned by this UID (unRAID nobody = 99). Set to 0 to run as root.

Default
99
Value
99
PGIDVariable

Process Group ID. Files written to the mapped paths will be owned by this GID (unRAID users = 100).

Default
100
Value
100
TimezoneVariable

Container timezone, e.g. Asia/Shanghai, Europe/London, America/New_York.

Target
TZ
Default
Asia/Shanghai
Value
Asia/Shanghai
JVM OptionsVariable

JVM options. Increase -Xmx for very large libraries.

Target
JAVA_OPTS
Default
-Xmx2g -Xms512m -XX:+UseG1GC
Value
-Xmx2g -Xms512m -XX:+UseG1GC
Spring ProfileVariable

Active Spring profile.

Target
SPRING_PROFILES_ACTIVE
Default
default
Value
default
Tomcat Base DirVariable

Tomcat working directory, kept on the persistent volume.

Target
SERVER_TOMCAT_BASEDIR
Default
/data
Value
/data
Static Resource LocationsVariable

Extra static resource locations so media under /data can be served over HTTP.

Target
SPRING_RESOURCES_STATIC_LOCATIONS
Default
classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input
Value
classpath:/static/,file:/data,file:/data/roms,file:/data/output,file:/data/input