Skip to content

00cyre/gauntlet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gauntlet 🎮

A mobile-friendly web app for browsing and downloading games via magnet links. Browse game libraries from sources like FitGirl Repacks and SteamRip, search by title, and grab magnet links — all from a clean, dark UI that works great on both desktop and mobile.

Gauntlet

Gauntlet Screenshot


Features

  • 🔍 Search — Debounced client-side search across loaded games
  • 🎨 Cover Art — Automatically fetches game artwork from Steam CDN and SteamGridDB
  • 📱 Mobile-first — Responsive grid, touch-friendly (44px tap targets), works on 7" Android
  • Cached — Sources cached for 30 min, artwork cached for 24h (in-memory)
  • 🧩 Multi-source — Supports FitGirl Repacks, SteamRip, or all sources at once
  • 🪄 Graceful fallback — No artwork? Gets a colored gradient placeholder with title initial
  • 📄 Paginated — 50 games per page with a load-more button
  • 🖼️ Game detail modal — Click any card for full info + all download links

Stack

Layer Tech
Frontend React + Vite + TypeScript
Backend Node.js + Express + TypeScript
Styling Plain CSS — dark theme, CSS grid
Artwork Steam CDN, Hydra API, SteamGridDB

Getting Started

Prerequisites

  • Node.js 18+
  • npm 8+

Install & Run

git clone https://github.com/00cyre/gauntlet.git
cd gauntlet
npm install
npm run dev

This starts both servers concurrently:

  • Backendhttp://localhost:3001
  • Frontendhttp://localhost:5173

Environment Variables

Create a backend/.env file (see backend/.env.example):

PORT=3001
STEAMGRIDDB_API_KEY=your_key_here   # Optional — enables SteamGridDB as artwork fallback

The app works without a SteamGridDB key — it'll fall back to Steam CDN and Hydra API for artwork.


API Endpoints

GET /api/sources

Returns the list of available game sources.

[
  { "id": "fitgirl", "name": "FitGirl Repacks", "url": "..." },
  { "id": "steamrip", "name": "SteamRip", "url": "..." }
]

GET /api/games?source=fitgirl&q=cyberpunk

Fetches and filters games from a source. Proxies through the backend to bypass CORS/Cloudflare.

  • source — source id (fitgirl, steamrip). Omit or use empty string for all.
  • q — optional search query (case-insensitive title match)

Returns an array of:

{ "title": "string", "uris": ["magnet:..."], "fileSize": "string", "uploadDate": "string" }

GET /api/artwork?title=Cyberpunk+2077

Fetches cover art for a game title. Tries in order:

  1. Steam store search → Steam CDN cover
  2. Hydra public API
  3. SteamGridDB (if STEAMGRIDDB_API_KEY is set)

Returns:

{ "cover": "url", "background": "url", "title": "string" }

Project Structure

gauntlet/
├── backend/
│   ├── src/
│   │   ├── index.ts              # Express app entry
│   │   └── routes/
│   │       ├── sources.ts        # /api/sources
│   │       ├── games.ts          # /api/games
│   │       └── artwork.ts        # /api/artwork
│   ├── .env.example
│   ├── package.json
│   └── tsconfig.json
├── frontend/
│   ├── src/
│   │   ├── App.tsx               # Main app component
│   │   ├── main.tsx
│   │   └── index.css             # Dark theme styles
│   ├── index.html
│   ├── package.json
│   ├── tsconfig.json
│   └── vite.config.ts
├── package.json                  # Root workspace (runs both with concurrently)
└── SPEC.md

Adding Sources

Sources are defined in backend/src/routes/sources.ts. Each source points to a JSON feed in the hydralinks.cloud format:

{ id: "mysource", name: "My Source", url: "https://hydralinks.cloud/sources/mysource.json" }

License

MIT

About

Mobile-friendly web app for browsing and downloading games via magnet links. React + Vite frontend, Express backend, cover art from Steam/SteamGridDB.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors