All apps · 0 apps
Frontend-Killer
Docker app from fansmall's Repository
Overview
Readme
View on GitHub
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;ThreadPoolExecutorwith 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.jsonconfiguration; 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
ThreadResourceManagercounter corruption; media downloads now use an independentSemaphoredecoupled 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
variablesblock) - 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_mappingtable) with 261 seed entries normalizes genre synonyms across languages and frontends (e.g. "Beat'em Up" / "act" → unified target);map()andmapFirst()expression functions available in v3 export templates for genre subdirectory generation; Racing/Driving dialect mapping added - Export & Filter Fixes -
poor_qualityscrape-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
中文
功能特性
- 游戏列表管理(增删改查),支持搜索和过滤
- 支持多种前端模板导入(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 共享目录的文件归属正确。
访问地址
日本語
機能特徴
- ゲームリスト管理(追加、削除、更新、検索)、フィルタリング対応
- 複数のフロントエンドテンプレートからのインポート(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 共有のファイル所有権を合わせてください。
アクセスアドレス
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
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
fansmall/frontendkiller:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8080]- Network
bridge- Shell
bash- Privileged
- false
Template configuration
Web interface port. Container listens on 8080.
- Target
- 8080
- Default
- 8080
- Value
- 8080
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/
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/
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
Process Group ID. Files written to the mapped paths will be owned by this GID (unRAID users = 100).
- Default
- 100
- Value
- 100
Container timezone, e.g. Asia/Shanghai, Europe/London, America/New_York.
- Target
- TZ
- Default
- Asia/Shanghai
- Value
- Asia/Shanghai
JVM options. Increase -Xmx for very large libraries.
- Target
- JAVA_OPTS
- Default
- -Xmx2g -Xms512m -XX:+UseG1GC
- Value
- -Xmx2g -Xms512m -XX:+UseG1GC
Active Spring profile.
- Target
- SPRING_PROFILES_ACTIVE
- Default
- default
- Value
- default
Tomcat working directory, kept on the persistent volume.
- Target
- SERVER_TOMCAT_BASEDIR
- Default
- /data
- Value
- /data
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