A modern web application to browse FiveM and RedM server lists with search, filtering, and real-time player statistics. Defaults to Thai 🇹🇭 servers.
- Vite + Vue 3 + TypeScript — Frontend framework
- Tailwind CSS 4.1 — Utility-first CSS (Vite plugin)
- Vue Router 4 — Client-side routing
- @msgpack/msgpack — Decode FiveM streaming server data
- Bun — JavaScript runtime & package manager
- GitHub Pages — Static hosting via GitHub Actions
- 🎮 Supports both FiveM and RedM
- 🇹🇭 Defaults to Thai servers with 17+ locale filters
- 🔍 Search by server name, gametype, or map
- 📊 Real-time online player statistics
- 🌙 Modern dark mode UI
- 📱 Fully responsive design
- 🌐 Multi-language support (English & Thai) with auto-detection
- 🔎 SEO optimized (meta tags, Open Graph, JSON-LD, sitemap)
- 📢 Adsterra ad integration (leaderboard, rectangle, banner)
- 🛡️ Ad blocker detection with user notification
- ♻️ Auto-refresh data every 60 seconds
- 🧩 Extensible architecture for future growth
# Install dependencies
bun install
# Dev server
bun run dev
# Build for production
bun run build
# Preview production build
bun run previewThis project auto-deploys via GitHub Actions on every push to the main branch.
- Go to Settings → Pages
- Set Source to GitHub Actions
- Push code to the
mainbranch
- Update
baseinvite.config.tsto match your repository name
| Endpoint | Description |
|---|---|
GET /api/servers/streamRedir |
All server data (msgpack stream) |
GET /api/servers/top/{locale} |
Top servers by locale |
GET /api/servers/single/{address} |
Single server details |
GET /runtime/counts.json |
FiveM player counts |
GET /runtime/counts_rdr3.json |
RedM player counts |
Data sourced from Cfx.re API
src/
├── components/
│ ├── common/ # Shared UI (Loading, Pagination, StatsBar, AdBlockDetector)
│ ├── layout/ # Header, Footer, AdBanner
│ └── server/ # Server card, list, search, filters
├── composables/ # Vue composables
│ ├── useServers.ts # Server data & filtering
│ ├── useServerIcon.ts # Lazy-load server icons
│ ├── useSeo.ts # Dynamic SEO meta tags
│ └── useAdBlock.ts # Ad blocker detection state
├── constants/ # Configuration & constants
├── i18n/ # Internationalization (EN/TH)
│ ├── locales/ # Translation files
│ └── types.ts # Translation schema
├── pages/ # Page components
├── router/ # Vue Router config
├── services/ # API service layer
├── types/ # TypeScript type definitions
└── utils/ # Helper utilities
public/
├── robots.txt # Search engine crawling rules
├── sitemap.xml # Sitemap for SEO
└── images/ # Static images
Ads are powered by Adsterra and managed centrally through AdBanner.vue. Current ad slots:
| Slot | Size | Location | Type |
|---|---|---|---|
header-banner |
728×90 | Top of page | Adsterra iframe |
inline-server-list |
728×90 | Between server cards (every 10) | Adsterra iframe |
sidebar-rect |
300×250 | Desktop sidebar | Adsterra iframe |
footer-banner |
720×90 | Footer | Static banner |
- Edit
AdBanner.vue— update Adsterra keys or replace with other ad code - Update Adsterra ad unit keys in
constants/index.ts(ADSTERRA.KEYS) - Toggle ad positions on/off via
AD_ENABLEDinconstants/index.ts - Ad blocker detection is handled by
AdBlockDetector.vuewith a modal notification
- Meta tags: title, description, keywords (EN+TH), robots
- Open Graph / Twitter: sharing previews with image
- JSON-LD: WebSite (with SearchAction) + WebApplication structured data
- Dynamic: meta tags update automatically when language is switched
- Sitemap & robots.txt: located in
public/ - Hreflang:
en,th,x-defaultfor multi-language support
MIT