{"id":51195216,"url":"https://github.com/bobbyroylee/smiteless","last_synced_at":"2026-06-27T20:00:15.741Z","repository":{"id":366996241,"uuid":"1277158114","full_name":"bobbyroylee/smiteless","owner":"bobbyroylee","description":"SMITELESS - a WIP League Helper Tool","archived":false,"fork":false,"pushed_at":"2026-06-24T05:58:08.000Z","size":581,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T07:18:21.929Z","etag":null,"topics":["helper","league-of-legends","leagueoflegends","tool"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bobbyroylee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-22T16:28:04.000Z","updated_at":"2026-06-24T06:39:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bobbyroylee/smiteless","commit_stats":null,"previous_names":["bobbyroylee/smiteless"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/bobbyroylee/smiteless","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobbyroylee%2Fsmiteless","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobbyroylee%2Fsmiteless/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobbyroylee%2Fsmiteless/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobbyroylee%2Fsmiteless/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bobbyroylee","download_url":"https://codeload.github.com/bobbyroylee/smiteless/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobbyroylee%2Fsmiteless/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34866118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["helper","league-of-legends","leagueoflegends","tool"],"created_at":"2026-06-27T20:00:13.904Z","updated_at":"2026-06-27T20:00:15.734Z","avatar_url":"https://github.com/bobbyroylee.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Smiteless\n\n\u003e ⚠️ **Small personal project — Windows + NA only, no warranty.** Built for me and a few\n\u003e friends; it can break or change at any time, and there's no official support. **Not\n\u003e affiliated with or endorsed by Riot Games**; respect the\n\u003e [Riot API terms](https://developer.riotgames.com/policies/general) and the terms of any\n\u003e third-party sites it links to (op.gg, u.gg). The optional player scout needs your own free\n\u003e Riot API key.\n\n## ⬇️ Install (no Python or setup needed)\n\n**[Download the latest `SmitelessSetup.exe`](https://github.com/bobbyroylee/smiteless/releases/latest)**,\ndouble-click it, and click **Install**. Everything it needs is bundled — you do **not** need\nPython, AutoHotkey, or anything else. Works on **Windows 10/11 (64-bit)**. Run League in\n**Borderless** mode. Full step-by-step (with the optional Riot-key walkthrough) is in\n**[INSTALL.md](INSTALL.md)** — written so anyone can follow it.\n\nOnce installed it lives in your system tray (gold **S**), auto-opens at champ select and\nin-game, updates itself when a new version is out, and starts with Windows. Hotkeys:\n**Ctrl+Alt+X** (overlay), **Ctrl+Alt+B** (item widget).\n\nThe rest of this README is for building from source / hacking on it.\n\n---\n\nA League of Legends champ-select \u0026 in-game companion. It opens a **scoreboard-style\noverlay** — a live, always-on-top window that polls the League client/API directly and\nupdates **in place** as champ-select picks come in and the game progresses. It auto-opens\nwhen a match starts and never steals focus from the game.\n\n![Smiteless overlay](docs/overlay-v2.png)\n\nThe overlay has:\n\n1. **Build / runes header** — keystone, core items, summoners, and your champ's win\n   rate/tier, live from op.gg.\n2. **Both teams aligned by role** — each lane is `your champ` vs the **real enemy in\n   that role**, read straight from the live game (paired by slot, never inferred).\n3. **Gank rating per enemy lane** — a transparent weighted score (no AI): your lane's\n   matchup edge + the enemy laner's recent form + their win rate on the champ they're\n   playing + **your own champ's gank kit** (a Maokai's CC makes every lane gankable; a\n   Nidalee's lack of it doesn't). Starts as the matchup, then shifts as the live scout\n   loads (a tilted / off-role enemy becomes a clear gank).\n4. **Per-player rank, form + mastery** — each player's solo-queue **rank** (e.g. `D2 67LP`,\n   tier-colored), their last-10 W/L (the \"heater / tilted\" read), and their **mastery** on\n   the champ they're playing (`M7 1.2M` = one-trick) — all live from the Riot API, always\n   current unlike cached profile sites. Click an icon for u.gg.\n5. **Lane panel** — when you lock a **lane** (not jungle), a panel with your matchup, the\n   opponent's recent form, and a **specific, current matchup tip** (\"dodge her E, hold Wind\n   Wall for her R, all-in at 6…\"). Tips are generated once per patch by the LLM **with web\n   search** (so they're up to date, not stale recall) and cached to disk — instant every\n   game after, and the cache files are plain text you can hand-edit. Before a tip is cached\n   it falls back to an archetype-based macro line.\n6. **Duo / premade detection** — teammates who share several of their recent ranked games\n   get a matching **duo** marker (same color = same group). Inferred from match-history\n   overlap, since the API doesn't expose lobby premades directly.\n7. **Floating item helper** — a *separate* small, draggable, always-on-top widget (not part\n   of the board) you leave in a corner all game. It shows your **next item** from op.gg's\n   real per-champ pool, and surfaces a defensive piece (Zhonya's vs a fed AD threat, an MR\n   item vs magic, anti-heal vs a healer) **only when the enemy's actual built damage + who's\n   fed calls for it** — dropping each suggestion the moment you own it. Real op.gg items, no\n   generic tables, no AI. See [Floating item widget](#floating-item-widget) below.\n8. **Home / profile page** — open the overlay **outside a game** and instead of a \"no game\"\n   message you get your profile: rank, recent ranked form, champion win rates, a friendly\n   headline read, and your **last games each scored 0–100 against the whole lobby** (hard\n   carry / carried / rough one / could've done better). Needs a Riot key.\n\nEverything that states a number traces to a real source (op.gg or the Riot API).\n\n## Behavior\n\n- **Lives in your system tray.** A tray icon with a right-click menu: **Open overlay**,\n  **Item widget**, **Settings**, **Auto-open at champ select** (toggle), **Reload**, **Exit**.\n- **Auto-opens at champ select** and **fills in live** as picks lock — your team on the\n  left, your full rune page + build (and skill order) on the right (enemies are hidden in\n  champ select). At the loading screen / in-game it transitions to the full scoreboard,\n  matchups, gank tags, the player scout, and duo markers — all updating in the same window.\n- **The floating item widget auto-opens in-game** (or **Ctrl+Alt+B** / tray → *Item widget*):\n  drag it anywhere, it remembers the spot, and it closes itself after the game.\n- **Click a champ icon** to open that player's **u.gg** profile in your browser.\n- **Ctrl+Alt+X** opens the board manually (global). **Left-drag** moves it; **right-click or Esc**\n  closes it; it **auto-closes** ~1.5 min after the match ends so the next game is fresh.\n- **Never steals focus** (`WS_EX_NOACTIVATE`) — opens on your second monitor if you have one.\n- Run League in **Borderless** so the overlay renders over the game (fullscreen-exclusive\n  hides all overlays — same requirement as Blitz/Porofessor).\n\nThe tray app is `smiteless.ahk` (AutoHotkey — the reliable, zero-dep shell for the tray +\nglobal hotkey); the overlay and settings windows are Python/Tk (`smiteoverlay.py` /\n`smitesettings.py`). A **pure-Python alternative** (`smiteless_tray.py`, needs `pip install\npystray`) is included if you'd rather not use AutoHotkey.\n\n## Settings\n\nRight-click the tray icon → **Settings** (a Tk window). Everything applies **live** — the\noverlay re-reads it every frame, so gank tags update within a few seconds.\n\n- **Win/loss streak influence** (the headline dial) — how much an enemy's recent form and\n  win/loss streak swing the gank rating. **0** = ignore it (pure champ-vs-champ matchup);\n  **50** = balanced (matchup is the base, form nudges it); **100** = form/streak dominate.\n- **Gank decisiveness** — the score threshold for the GANK / TOUGH tags (lower = more lanes\n  tagged).\n- **Scout depth** — recent games pulled per player (more = steadier read, slower first scout).\n- **Auto-open at champ select** — same toggle as the tray menu.\n- **Start with Windows** — adds/removes a registry Run key so the tray launches at login.\n\nSaved to `~/.claude/smiteless_settings.json` (plain JSON you can also hand-edit).\n\n## The gank score (transparent, tunable)\n\nThe champ-vs-champ matchup is the **base** (dominant). Enemy recent form is a ~30%\nmodifier that **compounds** with the length of their win/loss streak, and an *extreme*\n(near-0%/100% last-10 or a long streak) **overrides** the matchup entirely:\n\n```\nscore =  your_champ_kit                                     # YOUR CC/engage: Maokai +6 … Nidalee -1\n       + 1.0  * (your_lane_winrate - 50)                    # matchup edge (the base)\n       + 0.15 * (50 - enemy_last10_winrate) * streak_comp   # enemy form, compounding w/ streak\n       + 0.10 * (50 - enemy_champ_winrate)                  # comfort on this champ (\u003e=3 games)\n       + 4.0   if the enemy is off their champ\n       ± 16    if the enemy is extreme (\u003c=15% / \u003e=85% last-10, or a 7+ streak) -\u003e overrides\nwhere  streak_comp = 1 + 0.18 * max(0, streak_len - 2)      # each game past 2-in-a-row amplifies form\nscore \u003e= +6  -\u003e gank      |  score \u003c= -6  -\u003e tough  |  else even\n```\n\nSo a tilted enemy on a long loss streak reads as a clear gank no matter the matchup,\na smurf/heater reads as tough even into a \"winning\" lane, and your own champion shifts\nevery lane up or down — the same enemy is a gank on Maokai and even on Nidalee. Weights/\nthreshold and the per-champ kit table live at the top of `smitecard.py` (`GANK_W_*`,\n`GANK_STREAK_COMP`, `GANK_EXTREME`, `GANK_T`, `GANK_KIT`).\n\n## Floating item widget\n\nA separate compact window (`smitewidget.py`) — always-on-top, never steals focus, draggable,\nand it **remembers where you drop it**. It auto-opens in-game (or **Ctrl+Alt+B** / tray →\n*Item widget*) and closes itself ~1.5 min after the game ends. Leave it in a corner and glance\nat it on each back.\n\nIt is **not** generic. The item pool is op.gg's real, per-champ build for your champ+role (the\nsame source as the build card), so the suggestions are always champ-correct. The **live game**\nthen drives them, so they're genuinely dynamic:\n\n- **Next item** — the first item in your champ's standard op.gg sequence you don't already own.\n  It advances every time you complete an item.\n- **Defensive swap** — surfaced only when the game calls for it: it reads the enemy's *actual\n  built* AD vs AP (from their live items, not their class) and who's **fed** (live KDA), then\n  pulls the matching resist/anti-heal/stasis item **from your champ's own pool** (e.g. Zhonya's\n  vs a fed Zed, an MR item vs a magic comp, a Grievous-Wounds item vs a healer). The moment you\n  buy it, it drops off.\n- **Boots cue** — Mercury's Treads over your standard boots when they're stacking CC or magic.\n\nIf your champ simply doesn't itemize against a threat (e.g. a burst mage vs magic damage), it\nsays so rather than inventing a fake item — it shows the threat readout and your next core.\n\nThe threat/recommendation logic is all in `lolitems.py` (`live_state` → `recommend`).\n\n## Requirements\n\n- **Python 3** + **Pillow**. The window uses **Tkinter** (stdlib) + Pillow's `ImageTk`.\n- **AutoHotkey v2** — runs `smiteless.ahk` (the tray + Ctrl+Alt+X hotkey + auto-open watcher).\n  *Or* skip AHK and run the pure-Python tray `smiteless_tray.py` (`pip install pystray`).\n- **Riot API key** (for the player scout) — put it in `~/.riot_api_key`. Dev keys expire\n  every 24h; a free production key lifts the rate limit and never expires. You can refresh\n  an expired key **right from the overlay**: the bottom bar has a **Get key** button (opens\n  developer.riotgames.com), a paste field, **Paste** (from clipboard) and **Save** — no need\n  to edit files. It applies on the next game.\n\n## Setup\n\n1. Clone, then `pip install -r requirements.txt`.\n2. (Optional) Save your Riot API key to `~/.riot_api_key` for the player scout.\n3. Run `smiteless.ahk`. It sits in your **system tray** (right-click for the menu),\n   auto-opens at champ select, and binds **Ctrl+Alt+X**. *(No AutoHotkey? Run\n   `pythonw tools/smiteless_tray.py` instead — `pip install pystray` first.)*\n\n\u003e **Heads-up:** Windows hides new tray icons in the **overflow** (the **^** chevron by the\n\u003e clock). If you don't see the gold \"S\", click the chevron and drag it onto the taskbar to\n\u003e pin it. The **Ctrl+Alt+X** hotkey works either way.\n\nVerify everything works: `python tools/selftest.py` — checks Pillow, Data Dragon, op.gg,\nyour Riot key, the claude CLI, and the live client. Run it after a dev-key rotation or a patch.\n\nRender a card standalone (writes a PNG): `python core/smitecard.py --out card.png`\n\n## Layout\n\n```\nsmiteless.ahk    the tray app + global hotkeys (the launcher; stays at the root)\ncore/            data + render engine — imported, not run directly\nui/              the windows you launch — overlay, item widget, settings\ntools/           standalone CLIs + helpers — selftest, coach, phase check, pystray tray\nassets/          icon\n```\n\nThe modules use flat imports (`import lolbuild`); each launchable script has a tiny\nbootstrap at the top that adds `core/`, `ui/`, and `tools/` to `sys.path`, so nothing else\nhad to change when the files moved into folders.\n\n## Components\n\n**`core/`** — data + rendering engine\n- `core/lolgame.py` — resolves the current game (your champ/role + both teams **with roles**)\n  from whichever source is live: champ-select session -\u003e Live Client API -\u003e gameflow.\n- `core/lolbuild.py` — op.gg build card + per-lane matchup win rates (**paired strictly by\n  role slot**) + cached, self-healing Data Dragon decode (champ names, icons, items, runes).\n- `core/lolscout.py` — Riot API per-player recent form (last-10 W/L + current-champ record),\n  rank, mastery, and the recent **match IDs** that drive duo detection; rate-limit aware,\n  permanent (capped) match caching.\n- `core/lolitems.py` — in-game item logic: pulls your champ's real item pool from op.gg, reads\n  the live game (your owned items, the enemy's *actual built* AD/AP, healing, CC, who's fed),\n  and picks the next item + the right defensive piece from that pool. No AI, no generic tables.\n- `core/lolprofile.py` — the home page: who you are (live client) + Riot-API rank, recent form,\n  champ win rates, and each recent game scored 0–100 against the whole lobby.\n- `core/lolmatchup.py` — per-matchup lane tips: generated once per patch via `claude` with web\n  search (current, not stale), cached to `~/.claude/cache/matchups/` as editable text.\n- `core/claudecli.py` — thin shared wrapper around the logged-in `claude` CLI (no API key);\n  used by the matchup tips and the standalone coach.\n- `core/smitecard.py` — the renderer: builds each scoreboard frame as a PIL Image\n  (`render_image`) and drives the resolve→render loop (`run()`, with the matchup tip generated\n  in the background so it never blocks the scout). Also a PNG CLI (`--out`) for debugging.\n- `core/smiteconfig.py` — tiny shared settings store (`~/.claude/smiteless_settings.json` +\n  the auto-open marker); read live by the overlay's gank math.\n\n**`ui/`** — the windows\n- `ui/smiteoverlay.py` — the live overlay window (Tk + Pillow `ImageTk`). Runs `smitecard.run()`\n  in a worker thread and updates the displayed image in place; topmost, no-focus-steal,\n  second-monitor, single-instance, auto-close at game end.\n- `ui/smitewidget.py` — the floating in-game **item widget** (Tk). Polls `lolitems.recommend()`,\n  shows next-item + defensive suggestions, draggable + position-remembering, no-focus-steal,\n  single-instance, auto-closes after the game.\n- `ui/smitesettings.py` — the Tk settings window (the streak-influence dial, gank threshold,\n  scout depth, auto-open).\n\n**`tools/`** — standalone CLIs + helpers\n- `tools/phasecheck.py` — tiny stdlib helper that prints the LCU gameflow phase; the AHK\n  watcher polls it to auto-open at champ select.\n- `tools/lolcoach.py` — standalone text coach (CLI): verified op.gg lane win rates + an AI\n  tactical read for a quick console look. Not used by the overlay.\n- `tools/smiteless_tray.py` — optional **pure-Python** tray (same role, `pip install pystray`):\n  `pystray` icon + native Win32 hotkey + watcher + a \"Start with Windows\" registry toggle.\n- `tools/selftest.py` — `python tools/selftest.py` health-checks every dependency (Pillow,\n  Data Dragon, op.gg, Riot key, claude CLI, LCU) and tells you what's working at a glance.\n\n**root**\n- `smiteless.ahk` — the persistent **tray app** (AutoHotkey, default): tray icon + right-click\n  menu, the **Ctrl+Alt+X** (overlay) / **Ctrl+Alt+B** (item widget) global hotkeys, and the\n  watcher that auto-opens the board at champ select and the widget in-game. Launches the\n  windows under `ui/`.\n\n## Notes \u0026 roadmap\n\n- **In-game only** for the full board — roles + player scout require the live game (the\n  loading screen only exposes placeholder IDs). Pre-game it shows your build + a heads-up.\n- **Rate limits:** with a dev key the 10-player scout is ~110 calls ≈ ~2 min cold, then\n  instant from cache. A production key makes it fast.\n- Config points still hardcoded for the author's setup (League drive, Python path, NA\n  region) — moving these to a config file is on the list.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobbyroylee%2Fsmiteless","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbobbyroylee%2Fsmiteless","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobbyroylee%2Fsmiteless/lists"}