$ show SYJun404/frank
Frank is a desktop assistant for League of Legends, built with Tauri (Rust) and Vue 3. It interacts with the League Client Update (LCU) API to provide features such as automatic match acceptance, champion pick/ban, rune recommendations, champion performance statistics, teammate analysis, and personal notes/blacklist management. The application consists of multiple windows: a main UI for home, rankings, runes, teammate analysis, and records; a background window that monitors game flow and auto-actions; an overlay for recent match details during gameplay; a match query window; and a post-game analysis window. It communicates with the LoL client via a custom Rust wrapper (shaco) that handles REST calls, WebSocket subscriptions, and the in-game API, and also fetches external data from Tencent CDN, lolfrank.cn, and a custom backend server for blacklist persistence. The architecture is modular, with separate Vue entry points for each window, Pinia state management, and a Rust backend that handles LCU integration, keyboard listening, window management, and system tray features. The code demonstrates significant reverse engineering of Riot's client APIs and game state management, packaged into a polished cross-platform desktop app.
The LLM identified 3 files worth highlighting for reuse:
The shaco library provides a complete abstraction over the League Client Update (LCU) API, including REST client, WebSocket connection, and Ingame API access. It handles authentication (basic auth with LCU password), certificate pinning, request building, and WebSocket subscription management. The module is self-contained with its own error types, models, and utilities (process discovery, request helpers). It could be extracted and reused in any project that needs to interact with the LoL client, requiring only minimal adaptation (changing the process info lookup for other games). It demonstrates solid Rust patterns, proper error handling, and deep knowledge of the LCU protocol.
The BaseMatch class abstracts fetching and parsing match history from the LCU/SGP APIs. It provides methods to get match lists with pagination, parse match details (participants, kills, assists, items, runes, etc.), and handle various game modes (classic, ARAM, URF, etc.). The class is generic enough to be reused by any part of the application that needs match data, and it includes proper TypeScript interfaces for the parsed data. It encapsulates state (current page, total games) and supports both LCU and SGP data sources. This pattern is a clean example of separating data access from UI components and could be adapted for other game APIs.
TaskTracker is a singleton utility class that tracks how many times a specific task has been performed in a month, using localStorage for persistence. It increments a counter for a given task key, stores the count per month (e.g., '2026-08'), and allows querying the count. The implementation is simple, type-safe, and self-contained. It solves a common problem of rate-limiting or usage tracking without a backend, and can be easily extracted into any web or Tauri application that needs client-side monthly counters.