A beautiful, cross-platform web-based logcat viewer for Unity/Meta Quest development. Now with multi-device support for viewing logs from multiple Quest headsets over WiFi simultaneously.
# Clone and run
git clone https://github.com/G3dar/logcat.git
cd logcat
python3 logcat-web.pyThat's it! Your browser opens automatically to http://localhost:8765
Note: Requires Python 3.7+ and ADB. See Installation for auto-install scripts.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Unity Logcat Viewer [Scan] [Add] [USB Setup]β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β [All Devices] [β Quest 3] [β Quest Pro] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β [Search... ] Level: V D [I] W E [Clear][Pause]β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Q3 12:00:01 I [ConnectionManager] Creating public lobby β
β QP 12:00:02 W [Vivox] QuantumRunner not available β
β Q3 12:00:03 E [Network] Connection timeout β
β ... β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Total: 1,234 Errors: 5 Warnings: 23 2/2 devices 45/sec β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Live log streaming - Real-time logs via WebSocket
- Color-coded levels - Red (errors), Yellow (warnings), Green (info), Blue (debug)
- Level filter - Click V/D/I/W/E to set minimum level
- Category detection - Auto-detects Quantum, Vivox, Network, Analytics, Camera, Player
- Search - Real-time search with highlighting (Ctrl+K)
- Pause/Resume - Freeze display to read (Space key)
- Export - Download filtered logs as .txt
- Stats bar - Error/warning/total counts + logs/sec
- Dark theme - GitHub-style dark UI
- Network Scanner - Automatically discover Quest headsets on your WiFi network
- Multiple Devices - View logs from multiple Quest headsets simultaneously
- Device Tabs - Switch between individual devices or view "All Devices" combined
- Color-Coded Logs - Each device gets a unique color badge in combined view
- USB Setup Helper - One-click WiFi ADB setup from USB-connected devices
- Device Management - Add, remove, rename devices with right-click menu
- Persistent Config - Remembered devices auto-reconnect on startup
- Per-Device Stats - Track errors/warnings per device
git clone https://github.com/G3dar/logcat.git
cd logcat
python3 logcat-web.pygit clone https://github.com/G3dar/logcat.git
cd logcat
chmod +x install-mac.sh
./install-mac.shThe installer will:
- Install Homebrew (if needed)
- Install Python 3 (if needed)
- Install ADB (if needed)
- Install Python dependencies (aiohttp)
- Create double-click launcher
- Clone or download this repository
- Right-click
install-windows.batβ Run as administrator - Follow the prompts
The installer will:
- Install Python 3 via winget (if needed)
- Download and install ADB (if needed)
- Install Python dependencies
- Create double-click launcher
# Option 1: Double-click
open "Unity Logcat Viewer.command"
# Option 2: Terminal
./run.sh
# Option 3: Direct
python3 logcat-web.py# Option 1: Double-click "Unity Logcat Viewer.vbs"
# Option 2: Command prompt
run.bat
# Option 3: Direct
python logcat-web.pypython3 logcat-web.py- Enable Developer Mode on your Quest (via Meta app on phone)
- Connect Quest via USB to your computer
- Accept USB debugging prompt in the headset
- Run the viewer:
python3 logcat-web.py - Browser opens to
http://localhost:8765 - Click "USB Setup" β "Enable WiFi ADB" (optional, for wireless)
For each Quest headset:
- Connect Quest via USB
- Run the viewer
- Click "USB Setup" button
- Click "Enable WiFi ADB" next to your device
- Note the IP address shown (e.g.,
192.168.1.42) - Disconnect USB - device stays connected wirelessly!
Technical note: This runs
adb tcpip 5555which enables ADB over WiFi on port 5555. The setting persists until the Quest restarts.
Automatic Discovery:
- Click "Scan Network"
- All Quest devices with WiFi ADB enabled appear
- Click "Add & Connect" on each one
Manual Add:
- Click "Add Device"
- Enter the Quest's IP address (find it in Quest Settings β Wi-Fi β Connected network)
- Click "Add"
- "All Devices" tab - Combined view with color-coded device badges
- Individual device tabs - Filter to single device
- Right-click any tab - Connect/Disconnect, Rename, Remove
| Key | Action |
|---|---|
Ctrl+K / Cmd+K |
Focus search box |
Space |
Pause/Resume log stream |
Escape |
Close modal dialogs |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Web Browser β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Device Dashboard β β
β β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β β
β β βQuest 1 β βQuest 2 β βQuest 3 β β + Add β β β
β β β Online β β Online β βOffline β β Device β β β
β β ββββββ¬βββββ ββββββ¬βββββ βββββββββββ βββββββββββ β β
β βββββββββΌβββββββββββββΌβββββββββββββββββββββββββββββββββββββββ β
β β β β
β βββββββββΌβββββββββββββΌβββββββββββββββββββββββββββββββββββββββ β
β β Tabbed Log Viewer β β
β β [All Devices] [Quest 1] [Quest 2] β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β Q1 12:00:01 I [ConnectionManager] creating public Lobby β β
β β Q2 12:00:02 W [Vivox] QuantumRunner not available β β
β β ... β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
WebSocket (single connection)
β
βββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Python Server (port 8765) β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β βDevice Managerβ βNetwork Scannerβ βConfig Store β β
β β - track all β β - scan LAN β β - persist β β
β β - status β β - find 5555 β β - nicknames β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β βadb -s IP1 β βadb -s IP2 β βadb -s IP3 β β
β βlogcat Unity:Vβ βlogcat Unity:Vβ βlogcat Unity:Vβ β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
βββββββββββΌββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββββ
βWiFi βWiFi βWiFi
βΌ βΌ βΌ
βββββββββββ βββββββββββ βββββββββββ
β Quest 1 β β Quest 2 β β Quest 3 β
β192.168.xβ β192.168.yβ β192.168.zβ
βββββββββββ βββββββββββ βββββββββββ
The viewer exposes a WebSocket API at /ws for real-time communication:
// Scan network for devices
{action: 'scan'}
// Add device by IP
{action: 'add_device', device_id: '192.168.1.42:5555'}
// Connect to device
{action: 'connect', device_id: '192.168.1.42:5555'}
// Disconnect from device
{action: 'disconnect', device_id: '192.168.1.42:5555'}
// Remove device
{action: 'remove', device_id: '192.168.1.42:5555'}
// Set device nickname
{action: 'set_nickname', device_id: '192.168.1.42:5555', nickname: 'Dev Quest'}
// Get USB-connected devices
{action: 'get_usb_devices'}
// Enable WiFi ADB on USB device
{action: 'enable_wifi', device_id: 'SERIAL123'}
// Clear device stats
{action: 'clear_stats', device_id: '192.168.1.42:5555'}// Device list on connect
{type: 'device_list', data: [{id, name, status, color, stats, ...}]}
// Device added/updated
{type: 'device_update', data: {id, name, status, color, stats, ...}}
// Device removed
{type: 'device_removed', data: {id}}
// Log line
{type: 'log', data: {timestamp, level, tag, message, category, device_id, device_name, device_color}}
// Scan results
{type: 'scan_result', data: {devices: [{id, ip, known}]}}
// USB devices
{type: 'usb_devices', data: [{id, type: 'usb'}]}
// WiFi enabled result
{type: 'wifi_enabled', data: {success, ip, device_id} | {success: false, error}}GET / # Web UI
GET /ws # WebSocket endpoint
GET /api/devices # List all devices (JSON)
POST /api/devices/scan # Trigger network scan
~/.logcat-viewer/devices.json
{
"devices": [
{
"id": "192.168.1.42:5555",
"nickname": "Dev Quest",
"connection_type": "wifi"
},
{
"id": "192.168.1.50:5555",
"nickname": "Test Quest",
"connection_type": "wifi"
}
]
}Delete the config file to start fresh:
rm -rf ~/.logcat-viewer| Requirement | Version | Auto-installed |
|---|---|---|
| Python | 3.7+ | Yes (via installer) |
| ADB | Any | Yes (via installer) |
| aiohttp | Any | Yes (auto on first run) |
| Browser | Modern | - |
- All devices on same WiFi network
- Port 5555 not blocked by firewall
- Quest devices must have WiFi ADB enabled (one-time USB setup)
# Check if ADB sees the device
adb devices
# Should show something like:
# 2G0YC1ZF8108J4 device
# 192.168.1.42:5555 deviceIf empty:
- Reconnect USB cable
- Accept USB debugging prompt in headset
- Enable Developer Mode via Meta phone app
# Manual connection test
adb connect 192.168.1.42:5555
# Should show: "connected to 192.168.1.42:5555"If fails:
- Ensure same WiFi network
- Re-enable WiFi ADB: connect USB, run
adb tcpip 5555 - Check Quest IP in Settings β Wi-Fi β Connected network
- Disable VPN if active
- Ensure Unity app is running on Quest
- Check app uses
Debug.Log()statements - Verify filter isn't hiding logs (try clicking "V" level)
- Check device shows green "online" status
- WiFi ADB must be enabled on each device first
- Use USB Setup to enable WiFi ADB
- Some corporate networks block discovery - add manually
Edit logcat-web.py line 35:
PORT = 8766 # Change to any available portRun the installer script for your platform, or install manually:
Mac:
brew install python android-platform-tools
pip3 install aiohttpWindows:
winget install Python.Python.3.11
# Download ADB from https://developer.android.com/tools/releases/platform-tools
pip install aiohttpLinux:
sudo apt install python3 python3-pip adb
pip3 install aiohttplogcat/
βββ logcat-web.py # Main application (single file, ~1400 lines)
βββ install-mac.sh # Mac auto-installer
βββ install-windows.bat # Windows auto-installer
βββ README.md # This documentation
βββ .gitignore # Git ignore rules
β
# Created by installer:
βββ run.sh # Mac launcher script
βββ run.bat # Windows launcher script
βββ Unity Logcat Viewer.command # Mac double-click launcher
βββ Unity Logcat Viewer.vbs # Windows double-click launcher
# Run with auto-reload (manual restart needed)
python3 logcat-web.py
# The server runs at http://localhost:8765
# All HTML/CSS/JS is embedded in logcat-web.py# logcat-web.py structure:
# Configuration
PORT = 8765
DEVICE_COLORS = [...]
# Data Classes
@dataclass
class DeviceInfo:
id, ip, port, name, nickname, status, color, stats, last_seen
# Device Manager
class DeviceManager:
add_device(), remove_device()
connect_device(), disconnect_device()
run_logcat() # Per-device log streaming
scan_network() # Async port scanner
get_usb_devices() # List USB devices
enable_wifi_adb() # Run adb tcpip 5555
save_config(), load_config()
# HTTP Handlers
index_handler() # Serve HTML
websocket_handler() # WebSocket API
# Embedded Frontend
HTML_PAGE = '''...''' # ~800 lines of HTML/CSS/JS
# Entry Point
main() # Start server, open browser- Fork the repository
- Make changes to
logcat-web.py - Test with multiple devices if possible
- Submit a pull request
MIT License - Free to use, modify, and distribute.
Built with:
- aiohttp - Async HTTP server
- Tailwind CSS - Styling (via CDN)
- ADB - Android Debug Bridge
Created for Unity/Meta Quest VR development.