{"id":20639269,"url":"https://github.com/marianogappa/sctool","last_synced_at":"2026-04-17T23:31:56.063Z","repository":{"id":57605354,"uuid":"162719382","full_name":"marianogappa/sctool","owner":"marianogappa","description":"Starcraft: Remastered replay analyzer library and CLI tool","archived":false,"fork":false,"pushed_at":"2019-01-19T19:36:50.000Z","size":355,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-16T09:58:55.300Z","etag":null,"topics":["cli","cli-app","data-science","replays","starcraft","starcraft-broodwar","starcraft-remastered"],"latest_commit_sha":null,"homepage":"","language":"Go","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/marianogappa.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}},"created_at":"2018-12-21T13:49:07.000Z","updated_at":"2025-01-29T09:14:34.000Z","dependencies_parsed_at":"2022-08-27T22:40:53.296Z","dependency_job_id":null,"html_url":"https://github.com/marianogappa/sctool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/marianogappa/sctool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marianogappa%2Fsctool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marianogappa%2Fsctool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marianogappa%2Fsctool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marianogappa%2Fsctool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marianogappa","download_url":"https://codeload.github.com/marianogappa/sctool/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marianogappa%2Fsctool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31950209,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T17:29:20.459Z","status":"ssl_error","status_checked_at":"2026-04-17T17:28:47.801Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","cli-app","data-science","replays","starcraft","starcraft-broodwar","starcraft-remastered"],"created_at":"2024-11-16T15:23:11.901Z","updated_at":"2026-04-17T23:31:56.024Z","avatar_url":"https://github.com/marianogappa.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sctool [![Build Status](https://img.shields.io/travis/marianogappa/sctool.svg)](https://travis-ci.org/marianogappa/sctool) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/marianogappa/sctool/master/LICENSE) [![Go Report Card](https://goreportcard.com/badge/github.com/marianogappa/sctool?style=flat-square)](https://goreportcard.com/report/github.com/marianogappa/sctool) [![GoDoc](https://godoc.org/github.com/marianogappa/sctool/analyzer?status.svg)](https://godoc.org/github.com/marianogappa/sctool/analyzer)\n\n\nsctool is a Starcraft: Remastered replay analyzer library and CLI tool built with 4 main use cases:\n\n1. enabling Data Science research\n2. organising replay directories\n3. learning by analyzing and tinkering with pro gamer replays' data\n4. improving one's skill by discovering strengths and weaknesses on one's past games\n\n## Status\n\nsctool is NOT ready for mainstream use. Help beta-testing is appreciated.\n\n## Installation\n\nPlease visit the releases page (TODO: not yet available) and download the right binary for your operating system.\n\n## Installation for Go devs\n\n```\n$ go get -u github.com/marianogappa/sctool\n$ sctool -help\n```\n\n## Summary\n\n- sctool allows you to analyze a replay, list of replays or directory (recursive) of replays with a number of \"analyzers\". An example analyzer is: `--matchup-is 1v1`.\n\n- All analyzers that return true/false results are also available as \"filters\" and \"filter-nots\". For example, `--filter--matchup-is 1v1` will only match replays with only 2 players on 2 separate teams (i.e. 1v1 games), and `--filter-not--matchup-is 1v1` will only match replays that contain 3 or more players.\n\n- sctool further allows you to copy all replays that matched your filter criteria to a given folder. This should enable you to organise a replay folder by whatever supported criteria you want, e.g. UMS games, 1v1 games, TvZ games, games on a particular map, etc.\n\n- sctool's output is CSV by default, making it ideal for streamlining into a Data Science research project, but it can also return JSON, which is handy to compose with [jq](https://stedolan.github.io/jq/) and then possibly into [chart](https://github.com/marianogappa/chart) for charting.\n\n- Thanks to DateTime analyzers and different kinds of filtering and segmentation, sctool can track your progress: for example, you can see your APM improvement on 1v1 games on this season's maps for the matchup you're having difficulties with.\n\n## Usage\n\n```\n$ sctool -help\nUsage of sctool:\n  -copy-to-if-matches-filters string\n    \tcopy replay files matched by -filter-- and not matched by -filter--not-- filters to specified directory\n  -date-time\n    \tAnalyzes the datetime of the replay.\n  -duration-minutes\n    \tAnalyzes the duration of the replay in minutes.\n  -duration-minutes-is-greater-than string\n    \tAnalyzes if the duration of the replay in minutes is greater than specified.\n  -duration-minutes-is-lower-than string\n    \tAnalyzes if the duration of the replay in minutes is lower than specified.\n  -filter--duration-minutes-is-greater-than string\n    \tFilter for: Analyzes if the duration of the replay in minutes is greater than specified.\n  -filter--duration-minutes-is-lower-than string\n    \tFilter for: Analyzes if the duration of the replay in minutes is lower than specified.\n  -filter--is-1v1\n    \tFilter for: Analyzes if the replay is of an 1v1 match.\n  -filter--is-2v2\n    \tFilter for: Analyzes if the replay is of a 2v2 match.\n  -filter--is-there-a-race string\n    \tFilter for: Analyzes if there is a specific race in the replay.\n  -filter--matchup-is string\n    \tFilter for: Analyzes if the replay's MatchupIs is equal to the specified one (only works for 1v1 for now).\n  -filter--my-game\n    \tFilter for: Analyzes if the -me player played the game.\n  -filter--my-matchup-is string\n    \tFilter for: Analyzes if the replay's matchup is equal to the specified one, from the -me player perspective (only works for 1v1 for now).\n  -filter--my-race-is string\n    \tFilter for: Analyzes if the race of the -me player is the one specified.\n  -filter--my-win\n    \tFilter for: Analyzes if the -me player won the game.\n  -filter-not--duration-minutes-is-greater-than string\n    \tFilter-Not for: Analyzes if the duration of the replay in minutes is greater than specified.\n  -filter-not--duration-minutes-is-lower-than string\n    \tFilter-Not for: Analyzes if the duration of the replay in minutes is lower than specified.\n  -filter-not--is-1v1\n    \tFilter-Not for: Analyzes if the replay is of an 1v1 match.\n  -filter-not--is-2v2\n    \tFilter-Not for: Analyzes if the replay is of a 2v2 match.\n  -filter-not--is-there-a-race string\n    \tFilter-Not for: Analyzes if there is a specific race in the replay.\n  -filter-not--matchup-is string\n    \tFilter-Not for: Analyzes if the replay's MatchupIs is equal to the specified one (only works for 1v1 for now).\n  -filter-not--my-game\n    \tFilter-Not for: Analyzes if the -me player played the game.\n  -filter-not--my-matchup-is string\n    \tFilter-Not for: Analyzes if the replay's matchup is equal to the specified one, from the -me player perspective (only works for 1v1 for now).\n  -filter-not--my-race-is string\n    \tFilter-Not for: Analyzes if the race of the -me player is the one specified.\n  -filter-not--my-win\n    \tFilter-Not for: Analyzes if the -me player won the game.\n  -help\n    \tReturns help usage and exits.\n  -is-1v1\n    \tAnalyzes if the replay is of an 1v1 match.\n  -is-2v2\n    \tAnalyzes if the replay is of a 2v2 match.\n  -is-there-a-race string\n    \tAnalyzes if there is a specific race in the replay.\n  -json\n    \toutputs a JSON instead of the default CSV\n  -map-name\n    \tAnalyzes the map's name.\n  -matchup\n    \tAnalyzes the replay's matchup.\n  -matchup-is string\n    \tAnalyzes if the replay's MatchupIs is equal to the specified one (only works for 1v1 for now).\n  -me string\n    \tcomma-separated list of player names to identify as the main player\n  -my-apm\n    \tAnalyzes the APM of the -me player.\n  -my-first-specific-unit-seconds string\n    \tAnalyzes the time the first specified unit/building/evolution was built, in seconds.\n  -my-game\n    \tAnalyzes if the -me player played the game.\n  -my-matchup\n    \tAnalyzes the replay's matchup from the point of view of the -me player\n  -my-matchup-is string\n    \tAnalyzes if the replay's matchup is equal to the specified one, from the -me player perspective (only works for 1v1 for now).\n  -my-name\n    \tAnalyzes the name of the -me player.\n  -my-race\n    \tAnalyzes the race of the -me player.\n  -my-race-is string\n    \tAnalyzes if the race of the -me player is the one specified.\n  -my-win\n    \tAnalyzes if the -me player won the game.\n  -quiet\n    \tdon't print any errors (discouraged: note that you can silence with 2\u003e/dev/null).\n  -replay string\n    \t(\u003e= 1 replays required) path to replay file\n  -replay-dir string\n    \t(\u003e= 1 replays required) path to folder with replays (recursive)\n  -replay-name\n    \tAnalyzes the replay's name.\n  -replay-path\n    \tAnalyzes the replay's path.\n  -replays string\n    \t(\u003e= 1 replays required) comma-separated paths to replay files\n```\n\n## Building on top of the analyzer library\n\nIf rather than creating a CSV/JSON you're looking to access the replay analysing results programatically, don't use\nthe sctool; instead, import the sctool/analyzer library in your go code. Refer to [main.go](main.go) as an example\nuse and to the [godoc](https://godoc.org/github.com/marianogappa/sctool/analyzer#Analyzer) as reference.\n\nTODO sample code\n\n## Contribute\n\nI'm happy to review Issues and PRs!\n\n## Acknowledgements\n\nsctool is only possible thanks to the amazing effort by [András Belicza](https://github.com/icza) who built the [screp](https://github.com/icza/screp) library that sctool is built on top of.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarianogappa%2Fsctool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarianogappa%2Fsctool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarianogappa%2Fsctool/lists"}