{"id":50157715,"url":"https://github.com/sound-barrier/recall","last_synced_at":"2026-05-31T04:00:46.636Z","repository":{"id":358619374,"uuid":"1242228986","full_name":"sound-barrier/recall","owner":"sound-barrier","description":"Tracks your Overwatch match history by OCR-ing post-match screenshots into a local SQLite database, with optional Prometheus metrics and a bundled Grafana dashboard.","archived":false,"fork":false,"pushed_at":"2026-05-25T07:32:54.000Z","size":3138,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T09:04:48.212Z","etag":null,"topics":["desktop-app","gaming","go","golang","grafana","match-history","ocr","overwatch","performance-tracker","prometheus","screenshot","sqlite","tesseract","vue","wails"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sound-barrier.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-05-18T08:34:02.000Z","updated_at":"2026-05-25T07:32:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sound-barrier/recall","commit_stats":null,"previous_names":["sound-barrier/recall"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/sound-barrier/recall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sound-barrier%2Frecall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sound-barrier%2Frecall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sound-barrier%2Frecall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sound-barrier%2Frecall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sound-barrier","download_url":"https://codeload.github.com/sound-barrier/recall/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sound-barrier%2Frecall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33718446,"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-05-31T02:00:06.040Z","response_time":95,"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":["desktop-app","gaming","go","golang","grafana","match-history","ocr","overwatch","performance-tracker","prometheus","screenshot","sqlite","tesseract","vue","wails"],"created_at":"2026-05-24T13:01:58.505Z","updated_at":"2026-05-31T04:00:46.631Z","avatar_url":"https://github.com/sound-barrier.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Recall\n\n[![CI](https://github.com/sound-barrier/recall/actions/workflows/ci.yml/badge.svg)](https://github.com/sound-barrier/recall/actions/workflows/ci.yml)\n[![Release](https://github.com/sound-barrier/recall/actions/workflows/release.yml/badge.svg)](https://github.com/sound-barrier/recall/actions/workflows/release.yml)\n[![Pages](https://github.com/sound-barrier/recall/actions/workflows/pages.yml/badge.svg)](https://github.com/sound-barrier/recall/actions/workflows/pages.yml)\n[![CodeQL](https://github.com/sound-barrier/recall/actions/workflows/codeql.yml/badge.svg)](https://github.com/sound-barrier/recall/actions/workflows/codeql.yml)\n[![Latest release](https://img.shields.io/github/v/release/sound-barrier/recall)](https://github.com/sound-barrier/recall/releases/latest)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)\n[![Go](https://img.shields.io/badge/go-1.26-00ADD8?logo=go\u0026logoColor=white)](https://go.dev/)\n[![Vue](https://img.shields.io/badge/vue-3-4FC08D?logo=vuedotjs\u0026logoColor=white)](https://vuejs.org/)\n[![Docs](https://img.shields.io/badge/docs-sound--barrier.github.io%2Frecall-7B36ED?logo=gitbook\u0026logoColor=white)](https://sound-barrier.github.io/recall/)\n[![API](https://img.shields.io/badge/API-Swagger%20UI-85EA2D?logo=swagger\u0026logoColor=black)](https://sound-barrier.github.io/recall/api/)\n[![Code of Conduct](https://img.shields.io/badge/code%20of%20conduct-defined-purple)](CODE_OF_CONDUCT.md)\n\n**Recall** is a desktop app for Overwatch players who want to understand\ntheir performance trends over time. It watches a folder of OW post-match\nscreenshots, reads them with Tesseract OCR, and stores per-match data in a\nlocal database. Optionally it exposes the match history as Prometheus metrics\nso a bundled Grafana dashboard can chart win rates, SR trends, and per-hero stats.\n\n```mermaid\nflowchart LR\n  A[OW screenshots\u003cbr/\u003eSUMMARY · TEAMS\u003cbr/\u003ePERSONAL · RANK] --\u003e|fsnotify watcher\u003cbr/\u003eor manual Parse| B(Tesseract OCR\u003cbr/\u003e+ per-screenshot\u003cbr/\u003eparsers)\n  B --\u003e C[Correlation pass\u003cbr/\u003eresolves match_key\u003cbr/\u003eby timestamp or E/A/D]\n  C --\u003e D[(SQLite\u003cbr/\u003e5 per-type tables\u003cbr/\u003e+ 5 child tables)]\n  D --\u003e E[Read-time\u003cbr/\u003eaggregator\u003cbr/\u003efolds by match_key]\n  E --\u003e F[Vue UI\u003cbr/\u003eWails desktop\u003cbr/\u003eor browser]\n  D -.-\u003e|optional| G[Prometheus\u003cbr/\u003ecollector\u003cbr/\u003e:9091/metrics]\n  G -.-\u003e H[Grafana\u003cbr/\u003edashboard]\n  classDef opt stroke-dasharray: 4 3\n  class G,H opt\n```\n\n📚 **Full documentation:** [sound-barrier.github.io/recall](https://sound-barrier.github.io/recall/) — installation guides, advanced usage, and the [API reference](https://sound-barrier.github.io/recall/api/). Auto-deployed from `main` on every doc change.\n\n## Table of Contents\n\n**Getting started**\n\n- [Quick start](#quick-start)\n- [Installation](#installation)\n  - [Verifying downloads](#verifying-downloads)\n  - [Windows](docs/install-windows.md) · [macOS](docs/install-macos.md) · [Linux](docs/install-linux.md)\n- [Capturing matches](#capturing-matches)\n\n**Advanced** — most users can skip these\n\n- [🖥️ Use without the desktop app](docs/server.md) — browser access, headless mode, run on startup\n- [🐳 Run in Docker](docs/docker.md) — containers, home lab, NAS\n- [📊 Charts \u0026 Dashboards](docs/grafana.md) — Grafana, SR over time, win-rate charts\n\n**Project**\n\n- [Contributing](#contributing)\n- [License](#license)\n\n## Quick start\n\nThe desktop app is the simplest way to use Recall. Five steps from zero to your first match record:\n\n1. **Install Recall** — grab `recall-{version}-windows-amd64-installer.exe` from [GitHub Releases](https://github.com/sound-barrier/recall/releases) and run it. Full step-by-step in the [Windows install guide](docs/install-windows.md). For macOS or Linux, see the [Installation](#installation) section below.\n2. **Install Tesseract OCR 5.x** — Recall uses it to read your screenshots. Download the **5.x** installer from [UB-Mannheim](https://github.com/UB-Mannheim/tesseract/wiki) and run it with the default options. Older 3.x / 4.x builds are detected and flagged with a warning — parsing may misread. (macOS/Linux instructions are in [docs/install-macos.md](docs/install-macos.md) and [docs/install-linux.md](docs/install-linux.md).)\n3. **Launch Recall and pick a screenshots folder** under **Settings → Directories**. Overwatch's default on Windows is `Documents\\Overwatch\\ScreenShots\\Overwatch\\`.\n4. **Capture screenshots in Overwatch** with **F12** after each match — see [Capturing matches](#capturing-matches) for which post-match tabs to screenshot.\n5. **Click *Parse → Run Parse*** to scan the folder, or flip on *Parse → Watch Folder* to auto-parse as new screenshots land. Parsed matches appear under the **Matches** tab.\n\nThat's all most users need. The [Advanced](#advanced) sections below cover running Recall headless and streaming matches into a local Grafana dashboard — neither is required for everyday use.\n\n## Installation\n\nPre-built binaries for every tagged release are on the [GitHub Releases](https://github.com/sound-barrier/recall/releases) page.\n\n| Platform | Desktop app | Server binary |\n|---|---|---|\n| **Windows** | `recall-{version}-windows-amd64-installer.exe` | `recall-server-{version}-windows-amd64.exe` |\n| macOS arm64 | `recall-{version}-darwin-arm64.dmg` | `recall-server-{version}-darwin-arm64.tar.gz` |\n| Linux | `recall-{version}-linux-amd64.tar.gz` · `recall-{version}-linux-amd64.deb` | `recall-server-{version}-linux-amd64.tar.gz` · `recall-server-{version}-linux-amd64.deb` |\n| Docker | — | `ghcr.io/sound-barrier/recall-server:latest` |\n\nFor per-platform setup details (SmartScreen / Gatekeeper bypass, package-manager Tesseract install, data paths), see the platform guides:\n\n- [Installing on Windows](docs/install-windows.md)\n- [Installing on macOS](docs/install-macos.md)\n- [Installing on Linux](docs/install-linux.md)\n\n### Verifying downloads\n\nEvery release binary ships with a `.sha256` checksum file — the\n[macOS](docs/install-macos.md#verifying-your-download) and\n[Linux](docs/install-linux.md#verifying-your-download) install guides\nhave the one-line `shasum --check` command. On Windows, PowerShell:\n\n```powershell\n(Get-FileHash recall-{version}-windows-amd64-installer.exe).Hash -eq `\n  (Get-Content recall-{version}-windows-amd64-installer.exe.sha256).Split()[0].ToUpper()\n```\n\n`True` / `OK` means the file is intact; any mismatch means re-download.\n\nFor stronger supply-chain guarantees, every binary **and its `.sha256`\nfile** are also signed with [SLSA provenance](https://slsa.dev/) via\nGitHub's Sigstore integration. Verify with the\n[GitHub CLI](https://cli.github.com/):\n\n```sh\ngh attestation verify recall-{version}-windows-amd64-installer.exe --repo sound-barrier/recall\n```\n\nEvery release also includes `recall-{version}-sbom.spdx.json` — a\nsoftware bill of materials listing every dependency.\n\n## Capturing matches\n\nRecall reads four kinds of post-match screenshots from Overwatch. Three are required for a complete match record; the fourth is optional but recommended for competitive play.\n\n| Screenshot | Required? | What it provides |\n|---|---|---|\n| **SUMMARY** | ✅ Required | Match result (victory/defeat/draw), final score, map, mode, date, game length, and the list of heroes played with playtime percentages. |\n| **TEAMS** (scoreboard) | ✅ Required | Eliminations, assists, deaths, damage, healing, mitigation. The in-game scoreboard (Tab key, mid-match) works as a fallback for the post-match tab. |\n| **PERSONAL** | ✅ Required (one per hero played) | Per-hero detailed stats: weapon accuracy, ult charges, role-specific cards. If you played multiple heroes in a single match, take one PERSONAL screenshot for each. |\n| **RANK** | ⭕ Optional (competitive only) | SR value, rank tier, rank change. Only appears after competitive matches. If it's missing but the SR change is captured, Recall infers the win/loss from the SR delta. |\n\nThe in-game screenshot key is **F12** by default (rebindable under *Options → Controls → General → Screenshot*). After a match ends, cycle through the post-match tabs and press F12 on each. Recall stitches the screenshots into a single match record using the filename timestamps Overwatch embeds — taking them within a couple of minutes of each other is enough.\n\nOverwatch saves screenshots to `Documents\\Overwatch\\ScreenShots\\Overwatch\\` on Windows by default. Point Recall at that folder under **Settings → Directories**; the watcher (enabled under **Parse → Watch Folder**) auto-parses any new `.png` / `.jpg` that lands in it.\n\n**What if a screenshot type is missing?** Each match row has a *Data Coverage* strip in the detail panel (click any row to open) that flags which of the four screenshot types were captured. Required-but-missing types are highlighted with a warning chip; the optional RANK is shown greyed out when absent. Screenshots Recall couldn't match to a known map collect in the **Unknown** tab for triage.\n\n### What each screenshot type looks like\n\nReal examples from Recall's parser-regression fixture set. The same PNG files live under `testdata/` in this repo and are the inputs `TestParseScreenshot_GoldenFiles` runs against on every change. Click any image for the full-resolution source.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eSUMMARY\u003c/th\u003e\n\u003cth align=\"left\"\u003eTEAMS scoreboard\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\" width=\"50%\"\u003e\n\u003ca href=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.31.03.png\"\u003e\u003cimg src=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.31.03.png\" alt=\"SUMMARY tab — Antarctic Peninsula, Juno, comp victory\" width=\"100%\"\u003e\u003c/a\u003e\n\u003csub\u003eAntarctic Peninsula · comp victory 2-1. The map name + game type + heroes-played list + per-10-min averages all come from this tab.\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd valign=\"top\" width=\"50%\"\u003e\n\u003ca href=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.33.04.png\"\u003e\u003cimg src=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.33.04.png\" alt=\"Post-match TEAMS scoreboard with both teams' stats\" width=\"100%\"\u003e\u003c/a\u003e\n\u003csub\u003eSame match. Eliminations / assists / deaths / damage / healing / mitigation all come from the highlighted row + the right-hand stat panel.\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003cth align=\"left\" colspan=\"2\"\u003ePERSONAL (one per hero played)\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\" width=\"50%\"\u003e\n\u003ca href=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.34.50.png\"\u003e\u003cimg src=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.34.50.png\" alt=\"PERSONAL tab — Juno hero-specific stats\" width=\"100%\"\u003e\u003c/a\u003e\n\u003csub\u003eJuno's PERSONAL tab. The 3×3 grid populates hero-specific stats (pulsar torpedoes damage, orbital ray healing, players saved, weapon accuracy).\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd valign=\"top\" width=\"50%\"\u003e\n\u003ca href=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.36.31.png\"\u003e\u003cimg src=\"testdata/Overwatch%202%20Screenshot%202026.05.24%20-%2022.36.36.31.png\" alt=\"PERSONAL tab — Mizuki hero-specific stats from a hero-swap match\" width=\"100%\"\u003e\u003c/a\u003e\n\u003csub\u003eMizuki's PERSONAL tab from the same match — the player swapped from Juno (67% played) to Mizuki (33% played). Recall captures one PERSONAL per hero and merges them into the same match record.\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e **RANK screen** — no fixture in the test corpus yet (rank screens hadn't been captured at fixture-curation time). The RANK tab shows your current competitive rank tier + per-hero SR values + the recent change — Recall parses it the same way as the others when it's present.\n\n---\n\n# Advanced\n\nIf you're just playing Overwatch and want to track your stats, you can stop\nreading here — the desktop app is all you need.\n\n| Guide | For when… |\n|---|---|\n| [🖥️ Use without the desktop app](docs/server.md) | You want browser access, or to run Recall on a headless machine. |\n| [🐳 Run in Docker](docs/docker.md) | You run containers on a home lab or NAS. |\n| [📊 Charts \u0026 Dashboards](docs/grafana.md) | You want SR-over-time graphs and win-rate charts in Grafana. |\n| [📘 API reference](https://sound-barrier.github.io/recall/api/) | You want to read or try the HTTP API — Swagger UI rendering of the OpenAPI spec, auto-deployed from `main`. |\n\n## Contributing\n\nBug reports, feature requests, and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, build instructions, coding conventions, and [git hook requirements](CONTRIBUTING.md#git-hooks-lefthook). The release/tagging process — automated via [release-please](https://github.com/googleapis/release-please), with `make release-beta` / `make release-fire` shortcuts for the manual bits — is documented in [RELEASES.md](RELEASES.md). Commits on `main` follow [Conventional Commits](https://www.conventionalcommits.org/).\n\nBy participating in this project — opening an issue, filing a PR, commenting on a discussion — you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md). Short version: be kind, and remember that Recall is given away free of charge and maintained in spare time, so no demands and no expectations of timely replies, bug fixes, or feature requests.\n\n## License\n\nLicensed under the [Apache License, Version 2.0](LICENSE).\n\nThird-party dependency attribution is in [NOTICE](NOTICE). A full software bill of materials (SPDX) is attached to each [GitHub Release](https://github.com/sound-barrier/recall/releases).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsound-barrier%2Frecall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsound-barrier%2Frecall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsound-barrier%2Frecall/lists"}