{"id":20414331,"url":"https://github.com/argiopetech/timer","last_synced_at":"2025-03-05T03:27:59.825Z","repository":{"id":70007588,"uuid":"99868669","full_name":"argiopetech/timer","owner":"argiopetech","description":"A statistics-enabled split-based timing application for NCurses","archived":false,"fork":false,"pushed_at":"2019-02-09T03:36:17.000Z","size":160,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-15T13:31:52.706Z","etag":null,"topics":["bayesian-statistics","haskell","ncurses-tui","speedrun-timer","speedrunning","split-timing","stan","timer"],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/argiopetech.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}},"created_at":"2017-08-10T01:43:35.000Z","updated_at":"2019-02-09T03:36:18.000Z","dependencies_parsed_at":"2023-02-22T19:00:11.998Z","dependency_job_id":null,"html_url":"https://github.com/argiopetech/timer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/argiopetech%2Ftimer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/argiopetech%2Ftimer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/argiopetech%2Ftimer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/argiopetech%2Ftimer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/argiopetech","download_url":"https://codeload.github.com/argiopetech/timer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241958853,"owners_count":20049132,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bayesian-statistics","haskell","ncurses-tui","speedrun-timer","speedrunning","split-timing","stan","timer"],"created_at":"2024-11-15T06:09:15.576Z","updated_at":"2025-03-05T03:27:59.820Z","avatar_url":"https://github.com/argiopetech.png","language":"Haskell","readme":"![Image of a basic split file with one personal-best split](https://github.com/argiopetech/timer/raw/master/screenshot/test.png)\r\n\r\n# Timer\r\n\r\nA statistics-enabled splits-based timer application for NCurses.\r\n\r\n## Rationale\r\n\r\nSplit-based timing is encountered in a variety of fields. This specific application is designed for and tested with speedrunning.\r\n\r\nWhere most split timers are primarily focused on personal-best times and their associated metrics (sum of bests, possible time saves, etc), this timer focuses on consistency. It saves all splits (including invalid splits, see below) and outputs them to an R (programming language) data file which is read by [STAN](http://mc-stan.org/). STAN fits a (admittedly simple) empirical Bayesian model to the data and updates the splits.yaml file.\r\n\r\n## Status\r\nTimer is alpha software. It does not have a stable API, input or output format, or even statistical model. It probably won't `rm -rf /`, but I won't guarantee anything.\r\n\r\nHaving said this, I use timer almost daily for speedrunning. My splits.yaml file will be available for reference as soon as I finalize it.\r\n\r\n## Use\r\n\r\n### `timer`\r\n\r\nThe core of the system. Reads a `splits.yaml` file in the current directory and saves to `splits.dat`.\r\n\r\n#### Keys that change use when the timer is running\r\n\r\n| Key | Timer Stopped | Timer Running |\r\n|-----|---------------|---------------|\r\n|`SPACE` | Starts the timer   | Moves to the next split|\r\n|`RETURN`| Starts the timer   | Pauses the timer on the current split |\r\n| `r`    | Resets the current run | Nothing |\r\n| `s`    | Saves the current splits to a file and resets | Nothing |\r\n\r\n##### Other keys\r\n\r\n| Key  | Use |\r\n|------|-----|\r\n| `q`    | Quits the application without saving\r\n| `i`    | Toggles between valid/invalid for the current split\r\n| `PgDn` | Skips the current split, invalidating both it and the split following\r\n| `PgUp` | Moves the current split to the previous split, adding the current time to the previous split's time (see also \"Invalid splits\") |\r\n\r\n#### Saving Splits\r\nIn a complete run (all splits have a time), all splits (valid and invalid) are saved.\r\n\r\nIf not all splits are complete, the last split is not recorded. The rationale for this is that if the run was not completed, the last split was probably stopped prior to its completion (making it invalid). \r\n\r\n#### Invalid splits\r\nSplits marked invalid are saved in the data file for the purposes of calculating personal best \"full run\" times. Invalid splits are not exported to STAN.\r\n\r\nWhen an invalid split (the \"current\" split) is combined with the previous split using `PgUp` it validates the current split. Additionally, if the split previous to the previous split (the \"grandsplit\") is valid, it validates the previous split. This behavior is desirable to account for accidental uses of the skip functionality. If the previous split is actually invalid, it can be marked as such with the `i` key. \r\n\r\n### `level-bests`\r\nOutputs the name and best time for each split.\r\n\r\n### `total-time`\r\nOutputs the total time for all splits and all runs.\r\n\r\n### `output-split-timing`\r\nOutputs all valid split data for each split in a format compatible with `tools/unisplits.stan`.\r\n\r\n### `update-split-timing`\r\nReads a `stansummary` CSV file and updates a `splits.yaml` file based on the contents.\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fargiopetech%2Ftimer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fargiopetech%2Ftimer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fargiopetech%2Ftimer/lists"}