CLI - Command Line
Upload game builds up to 50 GB via command line
Quick Start
Download here: CLI Releases
Upload builds up to 50 GB directly to Cloudflare R2. Fast, secure, and perfect for CI/CD.

1. Login
Authenticate and save credentials locally.
gamelaunchercloud-cli login2. List Apps
See all apps you can upload to (owned + team apps).
gamelaunchercloud-cli list-apps3. Upload Build
Upload your game build (up to 50 GB, automatic multipart).
gamelaunchercloud-cli upload -a 1 -f "MyGame.zip" -n "Version 1.0"4. Check Status
Monitor build processing in real-time.
gamelaunchercloud-cli status 224 --watch5. Retry Failed Build (if needed)
Retry a failed or cancelled build without re-uploading.
gamelaunchercloud-cli retry 224Commands
login
loginAuthenticate with email/password. Saves JWT token locally for future commands.
gamelaunchercloud-cli login [-e email] [-p password]list-apps
list-appsList all apps you have access to (yours + team apps).
gamelaunchercloud-cli list-apps [--json]can-upload
can-uploadCheck if you can upload a file (permissions + quota).
gamelaunchercloud-cli can-upload -a <app-id> -f <file>upload
uploadUpload a build file. Calculates MD5 hash, uploads directly to R2, then notifies backend.
gamelaunchercloud-cli upload -a <app-id> -f <file> [-n "notes"]Options:
-a, --app-id- Application ID (get fromlist-apps)-f, --file- ZIP file path (up to 50 GB)-n, --notes- Build notes/changelog--no-status- Skip status display after upload
How it works:
Requests presigned URL from backend
Uploads directly to Cloudflare R2 (multipart if > 100 MB)
Notifies backend to start processing
status
statusCheck build processing status. Use --watch to poll until complete.
gamelaunchercloud-cli status <build-id> [--watch] [--json]Build Statuses:
Pending→Enqueued→DownloadingBuild→UnzippingBuild→CreatingPatch→CompletedFailed- Check errorMessage for details
Duration Fields:
Upload Duration - Time to upload file to R2 (shown immediately)
Total Duration - Complete processing time (only shown when Completed)
retry
retryRetry a failed or cancelled build using the already uploaded file. This saves time and bandwidth by reusing the original upload.
gamelaunchercloud-cli retry <build-id> [--watch]Options:
<build-id>- The build ID to retry (required)--watch- Monitor the retried build continuously (optional, default: true)
Requirements:
Build must have
FailedorCancelledstatusOriginal uploaded file must still exist in storage
Build must be from your apps or team apps
Example:
# Retry a failed build and watch progress
$ gamelaunchercloud-cli retry 224
Checking build #224...
✓ Build retry initiated successfully!
Watching build #224...
Press Ctrl+C to stop watching
╭─📊 Build Status──────────────────────╮
│ Build ID: #224 │
│ Status: ⏳ Enqueued │
│ File: MyGame_v1.2.0.zip │
│ Compressed Size: 2.01 GB │
╰──────────────────────────────────────╯
# ... (updates every 5 seconds until completed)When to use:
Build failed due to temporary server issues
Build was cancelled accidentally
Processing error occurred during patch creation
Ignore Paths
Exclude specific files and folders from patch generation. This feature helps reduce patch sizes and prevents temporary or user-specific files from being included in updates.
Configuration
Ignore paths are configured per application in the dashboard:
App Settings → Build & Patch → Ignored Paths
Each app can have its own set of ignored paths that apply to all future builds.
Default Ignored Paths
The system automatically adds:
*output_log.txt- Launcher log filesSelfUpdater\- Auto-updater files (for Apps, not Launchers)
Custom Ignored Paths
Add paths in the dashboard (one per line):
logs\
*.tmp
cache\*.dat
debug_output.txt
UserData\saves\Path Syntax
Directories: End with
\(Windows) or/(Linux/Mac)Wildcards: Use
*to match multiple files (e.g.,*.log)Relative paths: All paths are relative to build root
Case-sensitive: Paths are case-sensitive on Linux/Mac
Examples:
logs\
Ignore entire logs folder
*.tmp
Ignore all .tmp files
cache\*.dat
Ignore .dat files in cache folder
debug_output.txt
Ignore specific file
Temp\
Ignore Temp folder
*_backup.json
Ignore all backup JSON files
How It Works
Upload: You upload a build ZIP containing all files
Extract: Backend extracts the build to temporary storage
Patch Creation: PatchManager compares with previous build and creates patches
Files matching ignored paths are excluded from patches
Ignored files are not tracked for updates
Distribution: Clients only download changed files (excluding ignored paths)
Benefits
Smaller patches: Exclude logs, cache, and temporary files
Faster downloads: Less data to transfer to end-users
Cleaner updates: Avoid overwriting user-specific files
Flexibility: Configure once, applies to all future builds
Limits
Maximum 100 paths per application
Maximum 500 characters per path
No duplicate paths allowed
Validation occurs when saving in dashboard
Best Practices
Ignore log files and crash dumps
Ignore user-generated content folders
Ignore platform-specific cache files
Test with a small build first to verify paths work correctly
Complete Example
Full workflow from login to upload completion.
# Step 1: Login (first time only)
$ gamelaunchercloud-cli login
Email: [email protected]
Password: ********
✓ Login successful!
# Step 2: List your apps
$ gamelaunchercloud-cli list-apps
╭─🎮 Applications───────────────────────╮
│ ID │ Name │ Builds │ Owner │
├────┼────────────────┼────────┼────────┤
│ 1 │ My Game │ 15 │ You │
│ 2 │ Racing Game │ 8 │ Team │
╰────┴────────────────┴────────┴────────╯
# Step 3: Upload your build
$ gamelaunchercloud-cli upload -a 1 -f "MyGame_v1.2.0.zip" -n "Bug fixes and new features"
Calculating file hash (MD5)... ━━━━━━━━━━━━━━━━━━━ 100%
╭─🚀 Upload Build──────────────────────╮
│ App: My Game (#1) │
│ File: MyGame_v1.2.0.zip │
│ Size: 2.01 GB │
│ Hash: 157c9db3eb8dbc75d4c827feba... │
╰──────────────────────────────────────╯
Step 1/3: Requesting upload URL...
✓ Upload URL obtained (Build ID: #224)
Step 2/3: Uploading to cloud storage...
Uploading... ━━━━━━━━━━━━━━━━━━━━━━━ 100%
✓ Upload completed in 1m 41s
Average speed: 20.34 MB/s
Step 3/3: Notifying backend...
✓ Backend notified successfully
╔══════════════════════════════════════╗
║ 🎉 Build uploaded successfully! ║
║ Build ID: #224 ║
╚══════════════════════════════════════╝
# Step 4: Monitor processing (optional)
$ gamelaunchercloud-cli status 224 --watch
╭─📊 Build Status──────────────────────╮
│ Build ID: #224 │
│ Status: ⬇️ DownloadingBuild │
│ Compressed Size: 2.01 GB │
│ Upload Duration: 1m 41s │
╰──────────────────────────────────────╯
# ... (updates every 5 seconds) ...
╭─📊 Build Status──────────────────────╮
│ Build ID: #224 │
│ Status: ✅ Completed │
│ Compressed Size: 2.01 GB (55% saved) │
│ Upload Duration: 1m 41s │
│ Total Duration: 5m 6s │
╰──────────────────────────────────────╯
✓ Build completed successfully!CI/CD Examples
Automate build uploads on every release tag.
GitHub Actions
Triggers on version tags (e.g., v1.0.0).
name: Upload Build
on:
push:
tags: ["v*"] # Runs on v1.0.0, v2.0.1, etc.
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build
run: |
# Your build process
zip -r game-build.zip dist/
- name: Login
id: login
run: |
RESPONSE=$(curl -s -X POST "${{ secrets.GLC_API_URL }}/api/cli/build/login" \
-H "Content-Type: application/json" \
-d '{"email":"${{ secrets.GLC_EMAIL }}","password":"${{ secrets.GLC_PASSWORD }}"}')
TOKEN=$(echo $RESPONSE | jq -r '.result.token')
echo "token=$TOKEN" >> $GITHUB_OUTPUT
- name: Upload
run: |
FILE_SIZE=$(stat -c%s game-build.zip)
# Start upload
START=$(curl -s -X POST "${{ secrets.GLC_API_URL }}/api/cli/build/start-upload" \
-H "Authorization: Bearer ${{ steps.login.outputs.token }}" \
-H "Content-Type: application/json" \
-d "{\"appId\":${{ secrets.GLC_APP_ID }},\"fileName\":\"game-build.zip\",\"fileSize\":$FILE_SIZE,\"buildNotes\":\"Build ${{ github.ref_name }}\"}")
UPLOAD_URL=$(echo $START | jq -r '.result.uploadUrl')
BUILD_ID=$(echo $START | jq -r '.result.appBuildId')
KEY=$(echo $START | jq -r '.result.key')
# Upload to R2
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/octet-stream" \
--data-binary @game-build.zip
# Notify
curl -s -X POST "${{ secrets.GLC_API_URL }}/api/cli/build/file-ready" \
-H "Authorization: Bearer ${{ steps.login.outputs.token }}" \
-H "Content-Type: application/json" \
-d "{\"appBuildId\":$BUILD_ID,\"key\":\"$KEY\"}"Required Secrets: (Settings → Secrets)
GLC_API_URL:https://api.gamelauncher.cloudGLC_EMAIL: Your emailGLC_PASSWORD: Your passwordGLC_APP_ID: Application ID (fromlist-apps)
GitLab CI
Triggers on version tags.
stages:
- build
- upload
upload_build:
stage: upload
only:
- tags # Only runs on tags
script:
- zip -r game-build.zip dist/
- FILE_SIZE=$(stat -c%s game-build.zip)
# Login
- |
RESPONSE=$(curl -s -X POST "$GLC_API_URL/api/cli/build/login" \
-H "Content-Type: application/json" \
-d "{\"email\":\"$GLC_EMAIL\",\"password\":\"$GLC_PASSWORD\"}")
TOKEN=$(echo $RESPONSE | jq -r '.result.token')
# Start upload
- |
START=$(curl -s -X POST "$GLC_API_URL/api/cli/build/start-upload" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appId\":$GLC_APP_ID,\"fileName\":\"game-build.zip\",\"fileSize\":$FILE_SIZE,\"buildNotes\":\"Build $CI_COMMIT_TAG\"}")
UPLOAD_URL=$(echo $START | jq -r '.result.uploadUrl')
BUILD_ID=$(echo $START | jq -r '.result.appBuildId')
KEY=$(echo $START | jq -r '.result.key')
# Upload to R2
- curl -X PUT "$UPLOAD_URL" -H "Content-Type: application/octet-stream" --data-binary @game-build.zip
# Notify
- |
curl -s -X POST "$GLC_API_URL/api/cli/build/file-ready" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appBuildId\":$BUILD_ID,\"key\":\"$KEY\"}"Variables: (Settings → CI/CD → Variables)
GLC_API_URL,GLC_EMAIL,GLC_PASSWORD,GLC_APP_ID
Bash Script
Simple script for custom workflows.
#!/bin/bash
API_URL="https://api.gamelauncher.cloud"
EMAIL="[email protected]"
PASSWORD="password"
APP_ID=1
FILE="game.zip"
FILE_SIZE=$(stat -c%s "$FILE") # Get file size in bytes
# Step 1: Login and get token
TOKEN=$(curl -s -X POST "$API_URL/api/cli/build/login" \
-H "Content-Type: application/json" \
-d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}" | jq -r '.result.token')
# Step 2: Request presigned URL
START=$(curl -s -X POST "$API_URL/api/cli/build/start-upload" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appId\":$APP_ID,\"fileName\":\"$FILE\",\"fileSize\":$FILE_SIZE}")
UPLOAD_URL=$(echo $START | jq -r '.result.uploadUrl')
BUILD_ID=$(echo $START | jq -r '.result.appBuildId')
KEY=$(echo $START | jq -r '.result.key')
# Step 3: Upload directly to R2
curl -X PUT "$UPLOAD_URL" -H "Content-Type: application/octet-stream" --data-binary @"$FILE"
# Step 4: Notify backend
curl -s -X POST "$API_URL/api/cli/build/file-ready" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appBuildId\":$BUILD_ID,\"key\":\"$KEY\"}"
echo "✓ Upload complete! Build ID: $BUILD_ID"Troubleshooting
Common issues and quick fixes.
"Not authenticated"
Token expired. Run login again
"App not found"
Wrong app ID. Check with list-apps
"Upload failed"
Network issue. Check connection and retry
Build stuck in "Processing"
Large builds take 5-10 min. Use status --watch
"Email not confirmed"
Verify email in dashboard first
Configuration
Credentials are stored locally (JWT token + email).
Config file location:
Windows:
%APPDATA%\GameLauncherCloud\config.jsonmacOS:
~/Library/Application Support/GameLauncherCloud/config.jsonLinux:
~/.config/gamelaunchercloud/config.json
To reset: Delete config file and run login again.
Next Steps
CLI Releases - Download CLI binaries
Upload Builds - Upload builds via dashboard
Environments - Configure staging/production
Need Help? Join Discord or email [email protected]
Last updated
Was this helpful?