{"id":16386330,"url":"https://github.com/tmcw/running-for-nerds","last_synced_at":"2026-02-28T01:33:04.513Z","repository":{"id":25191225,"uuid":"28614701","full_name":"tmcw/running-for-nerds","owner":"tmcw","description":"like running, but for nerds","archived":false,"fork":false,"pushed_at":"2018-11-11T20:45:27.000Z","size":22,"stargazers_count":42,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-20T14:57:16.042Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmcw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-30T02:33:00.000Z","updated_at":"2023-02-22T03:47:33.000Z","dependencies_parsed_at":"2022-08-23T18:00:57.867Z","dependency_job_id":null,"html_url":"https://github.com/tmcw/running-for-nerds","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tmcw/running-for-nerds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmcw%2Frunning-for-nerds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmcw%2Frunning-for-nerds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmcw%2Frunning-for-nerds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmcw%2Frunning-for-nerds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmcw","download_url":"https://codeload.github.com/tmcw/running-for-nerds/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmcw%2Frunning-for-nerds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29922143,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"ssl_error","status_checked_at":"2026-02-27T19:37:41.463Z","response_time":57,"last_error":"SSL_read: 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":[],"created_at":"2024-10-11T04:16:58.135Z","updated_at":"2026-02-28T01:33:04.490Z","avatar_url":"https://github.com/tmcw.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"running-for-nerds\n=================\n\n_contribute! if you have facts to share, please submit a pull request or leave an issue_\n\nTypes of running websites:\n\n* \"Fitness Portals\" offered by hardware companies, like Garmin and Polar\n* \"Fitness Portals\" offered by web companies, like Strava and RunKeeper\n* Connectors, like [Tapiriik](https://tapiriik.com/) and [IFFT](https://ifttt.com/)\n\n## tapiriik\n\n[tapiriik](https://tapiriik.com/) is truly one of the best things for running nerds: it allows\nyou to automatically distribute your running data: upload just to Strava or to any of the supported\nwebsites, and it can push runs to all of the others, as well as a linked Dropbox bucket.\nIt's really quite good.\n\n## Websites\n\n\n* [Endomondo](https://www.endomondo.com/)\n  * **tapiriik support**\n* [RunKeeper](http://runkeeper.com/)\n  * [API](http://developer.runkeeper.com/healthgraph/overview)\n  * **tapiriik support**\n* [Strava](http://www.strava.com/)\n  * Actively developed.\n  * **tapiriik support**\n  * [API Reference](http://strava.github.io/api/)\n  * Custom JSON encoding for activities\n  * Strava's API is one of the most modern of the bunch, being that it's from a _real tech company_ and has some elite developers working on it. That said, it's frustratingly one-way: you can upload a GPX, FIT, or TCX file, but the only thing you can get back is Strava's custom, non-standard JSON encoding.\n* [Garmin Connect](http://connect.garmin.com/)\n  * Sporadic developer activity: Garmin is an old company that has had a really hard time modernizing at all, and as a result the interface has become a sort of trainwreck.\n  * **tapiriik support**\n  * [API Reference](http://developer.garmin.com/)\n* [Polar Flow](https://flow.polar.com/)\n  * **WALLED GARDEN**: AVOID\n  * _unsupported in tapiriik_\n  * [API Reference](http://www.polar.com/en/connect_with_polar/polar_accesslink)\n  * Polar is probably the worst watch brand for nerds: it's clear that the company wants to lock down the data _you_ create with the watches _you_ buy\n* [Nike+](http://nikeplus.nike.com/)\n  * [API](https://developer.nike.com/)\n  * _unsupported in tapiriik_\n  * [IFTTT Support](https://ifttt.com/nikeplus)\n* [Motivato](http://motivato.pl/#/): Polish Only\n  * **tapiriik support**\n* [Movescount](http://movescount.com/)\n  * Can be synced directly to Strava and other third party apps, but no public API available.\n* [Fitbit](http://www.fitbit.com/home)\n  * [TCX output for some devices](https://dev.fitbit.com/docs/activity/#get-activity-tcx)\n  * [Charges for data export](http://www.fitbit.com/premium/export)\n\n\n## Apps\n\n* [Ghostracer](http://getghostracer.com/)\n  * Excellent choice for use on Android Wear devices\n  * Uploads to Strava and Runkeeper\n\n## Watches\n\nRecommended:\n\n* TomTom: connects to many services, can save files locally\n* Garmin: supports a browser plugin that works on many websites - RunKeeper, Strava, Garmin Connect, etc.\n* Suunto: locked to Movescountvia Moveslink, but has exports to Strava and can also download as Garmin FIT files.\n* Fitbit Surge: uploads to Fitbit \u0026 RunKeeper\n* [Sony Smartwatch 3](http://www.sonymobile.com/global-en/products/smartwear/smartwatch-3-swr50/): Runs on Android Wear and has built-in GPS, so you can use it as a stand-alone device.\n* Polar M600: Android WearOS so can use any app available for WearOS (doesn't need to use the Polar Flow)\n\nNot recommended:\n\n* Polar: locked down to FlowSync (except M600, as above)\n\n## GPS\n\nThe basics of GPS:\n\nGPS is one system, but there are others, and some devices use more than one. For instance, a new iPhone\nconnects to GPS, GLONASS (Russia's system), as well as local wifi access points to derive an accurate location.\n\nGPS's accuracy has two user-facing problems\n\n* Time to first lock\n* Jitter\n\nThe first problem is often ameliorated by 'quickfix' tables - these store recent estimates of satellite\npositions so that your receiver can make better guesses initially for where exactly you are.\n\nThe second is based on a few different problems - in cities, [multipath propagation](http://en.wikipedia.org/wiki/Multipath_propagation) will distort a signal that bounces off of a big\nbuilding, making the track end up offset from its original location.\n\n## Formats\n\nRunning data is fun because it's potentially 5-dimensional: within a single GPX or TCX file, you can have\n\n* longitude \u0026 latitude \u0026 elevation `[x, y, z]`\n* heart rate\n* time\n\nBut traditional GIS formats like Shapefiles can't store all of this data in a non-hacky way,\nsince they only support attributes at the line level, not at the line-segment level.\n[toGeoJSON](https://github.com/mapbox/togeojson) converts GPX to GeoJSON with these properties\nput into arrays that work parallel to coordinates.\n\n* [GPX](http://www.topografix.com/gpx.asp)\n  * [GPSBabel](http://www.gpsbabel.org/) is an essential swiss-army knife\n* [TCX](http://en.wikipedia.org/wiki/Training_Center_XML)\n* [Strava activity format](https://strava.github.io/api/v3/activities/)\n\n## Sensors\n\nA few basic sensor types:\n\n* Heart rate\n* Cadence (for cycling)\n\nMost heart rate sensors work via [EKG](http://en.wikipedia.org/wiki/Electrocardiography), which means\nthat a big part of their effectiveness comes from skin contact and they often work better with sweat moisture.\n\nNot all do, however - for instance [Fitbit PurePulse](http://help.fitbit.com/articles/en_US/Help_article/Heart-rate-FAQs) uses an optical sensor to estimate blood flow and supposedly derives heart rate from this measurement. This system has [had mixed reviews based on its accuracy, which seems to be less than straps](http://recode.net/2015/02/02/three-new-fitbits-see-how-they-run/)\n\n### Protocols\n\n* [Bluetooth Low Energy](http://en.wikipedia.org/wiki/Bluetooth_low_energy)\n* [Polar Wearlink](https://groups.google.com/forum/#!topic/btstack-dev/TusCxtbq7ug) - proprietary\n\n#### ANT+\n\n[ANT+](http://en.wikipedia.org/wiki/ANT%2B) is a licensed protocol for accessories to communicate with other devices.\n\n* https://github.com/braiden/python-ant-downloader\n* https://github.com/Tigge/openant\n* https://github.com/Tigge/antfs-cli\n* https://github.com/mvillalba/python-ant\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmcw%2Frunning-for-nerds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmcw%2Frunning-for-nerds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmcw%2Frunning-for-nerds/lists"}