GD FEDL
GD FEDL is a small multi-page Geometry Dash list site with a static frontend and a lightweight Node.js backend for live list data, run submissions, and admin moderation.
What It Includes
index.htmllanding page with live list stats and featured entrieslists.htmlranked list browser with search, range filters, and video modal playbackrun.htmlrun submission form with a live submission queueadmelist.htmladmin panel for editing the list and reviewing submitted runsguess.htmlrank guessing gameroulette.htmldemon roulette picker with level ID lookupsrules.htmlsubmission and moderation rulesplayers.htmlbrowser-local player trackererrors.htmlplus individual HTTP-style error pages
Tech Stack
- Plain HTML, CSS, and JavaScript
- No build step
- Node.js
httpserver - Server-Sent Events for live updates
- Browser
localStorage/sessionStoragefor local state
Project Structure
index.htmlmain landing pagelists.htmllive list pagerun.htmlrun submission pageadmelist.htmladmin pageguess.htmlguessing gameroulette.htmlroulette pageplayers.htmllocal player managerrules.htmlrules pageerrors.htmlerror page gallery401.html,403.html,404.html,429.html,500.html,502.html,503.htmlstandalone error pagesapp.jsshared frontend logic for all pagesstyles.cssshared site stylingdata.txtstatic fallback list datalevel-ids.txtoptional local level ID lookup data for rouletteserver/server.jsbackend for list data, run submissions, auth, and live eventsserver/LINUX_SERVICE_SETUP.txtexamplesystemdsetup notesstart-server.commandmacOS launcher for the Node server
Data Format
The list data file uses one entry per line in this format:
category|position|title|url
Example:
new|1|Flamewall|https://youtu.be/x4Io4zkWVRw
The frontend parses that into:
level/ categorypositiontitleurl
Backend API
The Node server exposes these routes:
GET /api/listreturns the live listPUT /api/listreplaces the live list dataGET /api/runsreturns submitted runsPOST /api/runscreates a run submissionPUT /api/runs/:idupdates a submissionDELETE /api/runs/:iddeletes a submissionGET /eventsstreamslist-updateandruns-updateevents
If ADMIN_PASSWORD is set, list editing and run moderation routes require HTTP Basic auth.
Local Setup
- Make sure Node.js is installed.
- Create the server data files if they do not exist yet:
printf "new|1|Example Level|https://youtu.be/example\n" > server/data.txt
printf "[]\n" > server/runs.json
- Start the server:
node server/server.js
- Open the site at:
http://127.0.0.1:8090/fedl/
React App Version
A React-based version of the site is available in the app/ directory. This provides the same functionality with a modern component architecture.
Building the React Web App
-
Navigate to the app directory:
cd app -
Install dependencies:
npm install -
Start development server:
npm run dev -
Build for production:
npm run build
Building Native Desktop Apps
The React app can be packaged as native desktop applications for macOS and Windows using Electron.
-
In the
app/directory, install dependencies:npm install -
Run in development:
npm run electron -
Build installers:
- macOS:
npm run dist - Windows:
npm run dist -- --win - Both:
npm run dist -- --mac --win
- macOS:
Built installers will be in app/dist-electron/.
To expose it on your local network:
HOST=0.0.0.0 PORT=8090 node server/server.js
On macOS you can also run:
./start-server.command
Important Frontend Note
app.js currently uses this hardcoded live server base:
https://raspberrypi-1.tail46eacb.ts.net/fedl
That means:
- when the site is opened over
httporhttps, the frontend will try that remote live server first - when the site is opened directly from disk with
file://, it falls back to localdata.txt - if you want the frontend to use your own local Node server as the primary live backend, update
liveServerBaseinapp.js
Fallback Behavior
List loading tries these sources in order:
- Remote live API:
/api/list - Remote live data file:
/server/data.txt - Local
data.txt
Run data comes from the live runs API when available. If the live backend is unavailable, run submissions and moderation will not work.
Environment Variables
HOSTserver bind host, default127.0.0.1PORTserver port, default8090ADMIN_PASSWORDoptional admin password for protected write actions
Example:
ADMIN_PASSWORD=changeme HOST=0.0.0.0 PORT=8090 node server/server.js
Notes
players.htmlstores player data only in the current browser vialocalStorage- admin auth is stored only for the current browser session
roulette.htmlcan uselevel-ids.txtfirst, then fall back to the GD Browser API lookup- the backend automatically creates
server/runs.jsonif it is missing - the backend does not automatically create
server/data.txt, so create that file before first run
Linux Service
For running the server on boot with systemd, see:
server/LINUX_SERVICE_SETUP.txt
License
See LICENSE.