BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Self-hosted manager for the game library you already own. Sorts it, fills in the cover art, and pushes titles to an Android handheld over adb.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Self-hosted manager for the game library you already own.
Sorts it, fills in the cover art, and pushes titles to an Android handheld over adb.
Beta. Romule works and is used daily, but it is young. Some features are
explicitly labelled beta in the interface. The public /api/v1 is stable;
the routes the interface uses for itself are not, and are not documented as
such. Read Known limitations before exposing it to the
internet.README 전문 보기 ↗Beta. Romule works and is used daily, but it is young. Some features are explicitly labelled beta in the interface. The public
/api/v1is stable; the routes the interface uses for itself are not, and are not documented as such. Read Known limitations before exposing it to the internet.
romule doctor prints everything a bug
report should contain; romule user passwd gets you back in when the
password and the second factor are both gone; ROMULE_LOG=debug turns
docker logs into something worth reading.| Emulators | Eden, Yuzu, Sudachi, Citron, Ryujinx — as profiles, not hard-coded paths |
| Handhelds | Any Android device over adb, USB or Wi‑Fi: AYN Odin 2 / Odin 3 / Thor, Retroid Pocket, Anbernic, AYANEO, GPD |
| Artwork & metadata | SteamGridDB (covers), IGDB / Twitch (summaries, year, publisher), Wikipedia (fallback), titledb (Switch versions) |
| Community settings | EmuReady — per-game emulator settings, matched to your device (beta) |
| Conversion | nsz for .nsz / .xcz, unar and 7z for archives dropped into _import |
| Authentication | Internal accounts with scrypt + TOTP, or OpenID Connect — Authentik, Keycloak, Authelia, Pocket ID, Zitadel, Google, GitHub |
| Reverse proxies | Traefik, Caddy, nginx, NGINX Proxy Manager — with ROMULE_TRUSTED_PROXIES so forwarded headers are only honoured from proxies you name |
| Notifications | Discord, Slack, Telegram, ntfy, Gotify — or any webhook. The service is worked out from the address |
| Dashboards & automation | Any client that can send a header: Homarr, Homepage, Glance, Uptime Kuma, n8n, cron, curl — through the HTTP API |
| Containers | Docker and Docker Compose, multi-arch amd64 / arm64 — Synology, unRAID, TrueNAS, Proxmox LXC, Raspberry Pi |
| Desktop & mobile | Installable as a PWA (standalone window, home-screen icon) on macOS, Windows, Linux, iOS and Android |
docker run -d --name romule --restart unless-stopped \
-p 8787:8787 \
-e ROMULE_ROOT=/data -e ROMULE_BASES=/library \
-v romule-data:/data \
-v /path/to/your/games:/library \
ghcr.io/romule-app/romule:latest
docker logs romule # prints the address to open
Open it, answer the wizard — an account, or no password — and point Romule at
your library. Nothing else needs configuring. The image is
multi-arch (amd64, arm64) and ships adb, nsz, unar and 7z.
A Compose file is the better shape if you plan to keep it — same thing, one file to edit.
git clone https://github.com/romule-app/romule
cd romule
python3 -m romule
Romule starts on ~/.local/share/romule and asks you where your games are —
you pick the folder from the interface. Pass ROMULE_ROOT to put its own
data (settings, accounts, artwork) somewhere else.
Python 3.10 or newer. No install step, no virtualenv, no build — Romule uses the standard library only.
An installation nobody has claimed answers everybody, and opens on its setup wizard — the same thing Jellyfin, Home Assistant and the *arr stack do. Its access step cannot be skipped, and it settles the question once:
Until you answer, every start says so in capitals. From the terminal, the door can always be settled where the data is:
docker compose exec romule python3 -m romule access status
docker compose exec romule python3 -m romule access open # no password
docker compose exec romule python3 -m romule access close # require a login
docker compose exec romule python3 -m romule user create [email protected]
Prefer a shared secret? ROMULE_TOKEN, or romule token reset. The refusal
page then carries a field to paste it into, and a cookie remembers it per
browser. Nothing generates one for you.
Twenty-three are recognised out of the box:
Nintendo Switch · PlayStation 1/2/3 · PSP · PS Vita · GameCube · Wii · Wii U · Nintendo 3DS · DS · 64 · SNES · NES · Game Boy Advance · Game Boy / Color · Dreamcast · Saturn · Mega Drive · Arcade (MAME/FBN) · Xbox · Xbox 360 · PC
The list is not a limit. Settings → Your console → Add a platform… takes a display name, a folder on the console and a list of extensions — Neo Geo, MSX, a handheld nobody ported yet — and that platform is then scanned, filtered, counted and pushed like any other. It is also how you handle a console Romule does know but that you keep in a folder it would not guess. How to add one.
Switch is the only platform whose files Romule opens: title IDs, base/update/DLC relationships and missing updates come from reading the container. Every other platform — built-in or added — is identified by folder and extension.
The target device and emulator are profiles, not hard-coded paths.
| Profile | Verified on real hardware |
|---|---|
| Eden | yes — the reference profile |
| Yuzu, Sudachi, Citron, Ryujinx | no, provided as-is |
| Generic (games folder only) | no |
Unverified profiles are labelled as such in the interface. Pick yours in Settings → Your console.
Romule reads its settings from the interface; environment variables cover what must be known before it starts.
| Variable | Default | What it does |
|---|---|---|
ROMULE_ROOT | ~/.local/share/romule | Service data folder: settings, accounts, artwork, logs |
ROMULE_LIBRARY | — | Pins the games folder and locks it against changes from the interface |
ROMULE_BASES | — | Folders the interface may browse, separated like a PATH |
ROMULE_WEB_PORT | 8787 | Port to listen on |
ROMULE_BIND | see below | Interface to bind to |
ROMULE_TOKEN | — | Access token; overrides the generated one |
ROMULE_LAN | — | 1 opens network access without a password |
ROMULE_KEYS | ~/.romule/prod.keys | Path to the decryption keys |
ROMULE_TRUSTED_PROXIES | — | Comma-separated IPs whose forwarded headers are honoured |
ROMULE_UPLOAD_MAX | 64 GiB | Largest accepted upload |
ROMULE_DISK_MARGIN | 2 GiB | Free space kept in reserve |
ROMULE_NO_BROWSER | — | 1 stops Romule opening a browser at startup |
ROMULE_TIMEOUT | 300 | Socket timeout, seconds |
ROMULE_MAX_CONN | 64 | Simultaneous connections |
ROMULE_RATE | 600 | Requests per minute per client |
ROMULE_BIND defaults to 127.0.0.1, except in a container or when network
access has been enabled — otherwise a published port would reach nothing.
All 49 settings in the configuration file are edited from the interface and documented on the documentation site.
All optional. Missing ones disable a feature; none prevent Romule from starting. The Docker image ships all of them.
| Tool | Needed for |
|---|---|
adb | Talking to the console |
nsz | Converting .nsz / .xcz (also needs prod.keys) |
unar, 7z | Unpacking archives dropped into _import |
Romule has no built-in TLS. It speaks plain HTTP and expects a reverse
proxy in front of it for anything reachable from the internet. If you run one,
name it in ROMULE_TRUSTED_PROXIES — otherwise its forwarded headers grant
nothing, by design, because a proxy on the same host makes every request look
local.
A few things it does on its own:
127.0.0.1 unless you say otherwise.Run python3 -m romule.audit after any change: it reports on the configuration
actually running, and the CI fails on anything it rates grave.
Reporting a vulnerability: see SECURITY.md.
style-src allows 'unsafe-inline'. Inline style= attributes are
common in the generated markup. A style is not executed, so this is a much
narrower exception than the script-src one removed in 0.2.0.Said plainly, because you are about to run it on your own machine.
Romule was written with an AI assistant — most of its code, its tests and its documentation. It was not typed line by line by a person who holds the whole design in their head. That has consequences worth knowing:
If that is not for you, that is a fair call. If it is, bug reports are especially useful here.
Romule is a library manager. It does not provide games, console keys, or any means of obtaining them, and it contains no links to either. It manages files that are already on your disk.
Whether you may legally hold those files depends on where you live and how you obtained them. That question is yours, not this project's. Please do not open issues asking where to find games or keys; they will be closed.
Romule never ships, generates, or helps you obtain console keys. Decrypting
.nsz / .xcz is delegated to nsz, a
separate tool you install yourself and point at a key file you supply. Romule
works without any of it — keys are needed only for those two formats.
Be aware that in some jurisdictions, extracting or using such keys may be restricted even for content you own. Romule takes no position on that and gives no guidance on it.
Romule bundles no emulator and distributes none. An emulator profile is nothing more than a description of where a given third-party program keeps its files, so that Romule can copy games to the right place. Naming a program is not an endorsement, a partnership, or a claim that anyone authorised it.
Nintendo Switch, and the names of every console, publisher and emulator mentioned here, are trademarks of their respective owners. Romule is an independent project, not affiliated with, endorsed by, or connected to any of them. Those names are used only to say what the software works with.
| Document | What it covers |
|---|---|
| Documentation site | Install, first run, console setup, full configuration reference — in English and French |
| Documentation en français | La même, traduite intégralement |
| HTTP API | Keys, the fourteen routes, pagination, errors |
| Roles and access | The two roles, the three modes, and OIDC group mapping |
| CHANGELOG.md | What changed, release by release |
| CONTRIBUTING.md | Zero-dependency rule, house style, how to run the suites |
| SECURITY.md | How to report a vulnerability, and what is in scope |
python3 lancer_tests.py # unit, server and audit suites
python3 lancer_tests.py --navigateur # adds the real-Chrome interface suites
python3 -m romule.audit # self-audit
python3 outils/verifier-fuite.py # refuses personal data in the git index
python3 outils/mesurer-perf.py # timings on a synthetic library
Romule is free software under the GNU Affero General Public License v3.0 or later.
The AGPL was chosen deliberately: Romule is a network service, and the AGPL
is what keeps a hosted fork open. If you run a modified Romule and let others
reach it over a network, section 13 requires you to offer them your source. The
interface footer carries that offer — it links to the source and shows the
running version, and /api/health reports both. Keep it working if you fork.