Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/guancio/org-fit
https://github.com/guancio/org-fit
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/guancio/org-fit
- Owner: guancio
- Created: 2018-09-29T10:17:53.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2018-11-18T09:43:02.000Z (about 6 years ago)
- Last Synced: 2024-08-01T16:42:49.279Z (4 months ago)
- Language: Python
- Size: 441 KB
- Stars: 76
- Watchers: 7
- Forks: 5
- Open Issues: 5
-
Metadata Files:
- Readme: README.org
Awesome Lists containing this project
- my-awesome-github-stars - guancio/org-fit - (Python)
README
* org-fit
The idea is to develop a "fitness tracking utility" (i.e.
Strava/Runkeeper) based on org format. I started development mainly to
learn a bit of Elisp and because I was disappointed by the switch to
closed source license of Runalyze.
*For now it is just a small prototype*[[file:screen.png]]
[[file:export-html.png]]
The architecture consists of three components:
- org-mode (actually the org-mode text format) to store data in human
readable format. Org-mode format will play the same role of maildir
for mu4e and ledger files for ledger.
- a command line utility (server) to process and index org-mode files.
This plays the same role of mmu for mu4e and ledger
- a user interface (GUI) to present graph and statistics produced via
the server* org-fit format
For now I'm only working on gym notes: i.e. notes taken while
training in the gym. The idea is to have functionalities on par with
[[https://play.google.com/store/apps/details?id=com.github.jamesgay.fitnotes&hl=en]]Each workout is a top-level entity. The second string of the entity
title must be a date in format YYYY-MM-DD. The date will probably
become a property of the entity.
#+BEGIN_EXAMPLE
* Workout
:PROPERTIES:
:date: 2018-01-24
:END:
#+END_EXAMPLEEach exercise is a sub-entity of a workout entity. An exercise can
have the following optional properties :
- name; it's the name of the entity
- muscle: a string to identifying the type of exercise. E.g Cardio,
Abs, Legs.
- duration: duration of the exercise in format
hh:mm:ss
- distance: distance in meters, i.e. 3200.0 m
#+BEGIN_EXAMPLE
** Rowing Machine
:PROPERTIES:
:muscle: Cardio
:duration: 0:15:39
:distance: 3200.0 m
:END:
#+END_EXAMPLE
#+BEGIN_EXAMPLE
** Crunch Machine
:PROPERTIES:
:muscle: Abs
:END:
#+END_EXAMPLEAn exercise can have multiple sets. Sets are expressed as a =-= list.
#+BEGIN_EXAMPLE
- 11.0 kgs x 10 reps
- 11.0 kgs x 15 reps
- 11.0 kgs x 15 reps
#+END_EXAMPLE
Weight property for sets is optional
#+BEGIN_EXAMPLE
- 10 reps
- 15 reps
- 15 reps
#+END_EXAMPLEYou can find a complete example in [[file:example.org]]
* server
The server is implemented via a small command line python utility in
=cli/cly.py=.
The server has a prompt, which allows to load org-files (and in future
indexes) and process them without need of reloading them for each
invocation.The server supports the following commands
- =import csvfile orgfile= Converts a CSV file exported by fitnotes
Android app to org-fit format
- =quit= Quit the program
- =load_org orgfile= Loads an org-fit file
- =list_muscles= List the tags used to classify exercises
- =graph value groupby months muscle filename= produces a linear graph
from the loaded fit file
- =value= is the value displayed and can be =count= (number of
exercises), =sets= (number of sets), =reps= (total number of
repetitions), =volume= (weight x reps)
- =groupsby= is the resolution of the =x= axis and can be =day=,
=week=, or =month=
- =months= is the interval of the =x= axis and can be =all= (no
limit) or an integer representing the number of months
- =muscle= filters the exercises and can be =all= or one of the strings
used to tag the exercises (i.e. Chest)
- =filename= filename of the produced pngThe server uses pandas, numpy, matplotlib, and orgparser
* GUI
The GUI consists of an org-file where you can add graph and statistics
and emacs functions defined in [[file:emacs/gym.el]].** Configuration
There are three variables to customize:- =org-fit-data-file= full-path of your org-fit file
- =org-fit-export-path= full-path of the directory used to produce the graphs
- =org-fit-cli-exec= full-path of =cli.py=** Using the GUI
Open an org file like [[file:analysis.org]]. This is your main GUI. Graph
are produced by manipulating org-babel snippets.- To start the org-fit execute =org-fit-start=.
- To add a graph for historical data execute =org-fit-add-graph-history=
- To add a table for historical data execute =org-fit-add-table-summary=
- To add a pie chart graph execute =org-fit-add-graph-breakout=
- To add a table for breakout data execute =org-fit-add-table-breakout=
- You can update a graph by moving the cursor in the corresponding
org-babel fragment and use the following keybinding
- =C-q 1= display volume (i.e. kg * reps)
- =C-q 2= display reps
- =C-q 3= display max weight
- =C-q 4= display sets
- =C-q 5= display max reps
- =C-q 6= display 1RM Epley formula
- =C-w 1= group per month
- =C-w 2= group per week
- =C-w 3= group per day
- =C-e 1= limit results to last month
- =C-e 2= limit results to two months
- =C-e 3= limit results to three months
- =C-e 6= limit results to six month
- =C-e 0= no time limit
- =C-e e= filter per exercise
- =C-e 0= filter per muscle* Work in progress
- breakout graph per exercise
- selection of time range for breakout graph
- Import/merging
- Compute additional data per workout