Hranoprovod is command line diet tracking tool. It supports nested recipes and is agnostic to the metrics you choose to track, which makes it perfect for tracking calories, nutrition data, exercises and any other measurement that is accumulated on daily basis.
asdf is an extendable version manager for linux and macOS.
hranoprovod can be installed using a plugin as follows:
asdf plugin add hranoprovod https://github.com/aquilax/asdf-hranoprovod.git
asdf install hranoprovod latest
First make sure you have go (golang) installed.
https://go.dev/
Clone the repository and build/install the tool:
git clone https://github.com/aquilax/hranoprovod-cli.git
cd hranoprovod-cli/cmd/hranoprovod-cli/
go install
You can run hranoprovod-cli from Docker too
docker build --pull --rm -f "Dockerfile" -t aquilax/hranoprovod-cli:latest .
docker run --rm -it -v /path/to/data/files/:/data aquilax/hranoprovod-cli:latest -d /data/food.yaml -l /data/log.yaml bal
Running the hranoprovod-cli
command will show you the command line options
$ ./hranoprovod-cli --help
NAME:
hranoprovod-cli - Diet tracker for the command line
USAGE:
hranoprovod-cli [global options] command [command options] [arguments...]
VERSION:
dev, commit none, built at unknown
DESCRIPTION:
A command line tool to keep log of diet and exercise in text files
AUTHOR:
aquilax <aquilax@gmail.com>
COMMANDS:
register, reg Shows the log register report
balance, bal Shows food balance as tree
lint Lints file for parsing errors
report Generates various reports
csv Generates csv exports
stats Provide stats information
summary Show summary for date
print Print log
gen Generate documentation
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--begin DATE, -b DATE Beginning of period DATE
--end DATE, -e DATE End of period DATE
--today DATE Overwrite today's date DATE
--database FILE, -d FILE optional database file name FILE (default: "food.yaml") [$HR_DATABASE]
--logfile FILE, -l FILE log file name FILE (default: "log.yaml") [$HR_LOGFILE]
--config FILE, -c FILE Configuration file FILE (default: "/home/aquilax/.hranoprovod/config") [$HR_CONFIG]
--date-format DATE_FORMAT Date format for parsing and printing dates DATE_FORMAT (default: "2006/01/02") [$HR_DATE_FORMAT]
--maxdepth DEPTH Resolve depth DEPTH (default: 10) [$HR_MAXDEPTH]
--no-color Disable color output (default: false)
--no-database Disables loading the database (even if database filename is set) (default: false)
--help, -h show help (default: false)
--version, -v print the version (default: false)
Hranoprovod uses two files with very similar format to operate.
Contains all the "recipes" in the following format:
$ cat examples/food.yaml
# daily nutrition budget
day/nonworking:
calories: -1200
fat: -124
carbohydrate: -50
protein: -104
bread/rye/100g:
# barcode: 0000000000000
calories: 259
fat: 3.3
carbohydrate: 48
protein: 9
egg/boiled/100g:
# boiling time: 12 min
calories: 155
fat: 11
carbohydrate: 1.1
protein: 13
vegetables/lettuce/romaine/100g:
calories: 15
fat: 0.5
carbohydrate: 1.7
protein: 0.9
sauce/mayonnaise/100g:
calories: 680
fat: 7.5
carbohydrate: 0.6
protein: 1
sandwich/egg/lettuce/100g:
bread/rye/100g: 0.40
egg/boiled/100g: 0.20
vegetables/lettuce/romaine/100g: 0.20
sauce/mayonnaise/100g: 0.20
candy/snickers/bar:
calories: 280
fat: 13.6
carbohydrate: 35.1
protein: 4.29
Hranoprovod is measure agnostic and it's up to the user to use or state the measurements.
The log file contains dated usage of the recipes, defined in the database file.
$ cat examples/log.yaml
2021/01/24:
day/nonworking: 1
coffee/cup: 1
sandwich/egg/lettuce/100g: 1.20
candy/snickers/bar: 1
2021/01/25:
day/nonworking: 1
coffee/cup: 1
sandwich/egg/lettuce/100g: 1.50
coffee/cup: 1
Note: it's not mandatory to have the elements in the database file. Elements which are not found will be represented as they are. They can always be added later to the database.
Given this example, the result will look like:
$ ./hranoprovod-cli -d examples/food.yaml -l examples/log.yaml --no-color reg
2021/01/24
day/nonworking : 1.00
calories -1200.00
carbohydrate -50.00
fat -124.00
protein -104.00
coffee/cup : 1.00
coffee/cup 1.00
sandwich/egg/lettuce/100g : 1.20
calories 328.32
carbohydrate 23.86
fat 6.14
protein 7.90
candy/snickers/bar : 1.00
calories 280.00
carbohydrate 35.10
fat 13.60
protein 4.29
-- TOTAL ----------------------------------------------------
calories 608.32 -1200.00 = -591.68
carbohydrate 58.96 -50.00 = 8.96
coffee/cup 1.00 0.00 = 1.00
fat 19.74 -124.00 = -104.26
protein 12.19 -104.00 = -91.81
2021/01/25
day/nonworking : 1.00
calories -1200.00
carbohydrate -50.00
fat -124.00
protein -104.00
coffee/cup : 2.00
coffee/cup 2.00
sandwich/egg/lettuce/100g : 1.50
calories 410.40
carbohydrate 29.82
fat 7.68
protein 9.87
-- TOTAL ----------------------------------------------------
calories 410.40 -1200.00 = -789.60
carbohydrate 29.82 -50.00 = -20.18
coffee/cup 2.00 0.00 = 2.00
fat 7.68 -124.00 = -116.32
protein 9.87 -104.00 = -94.13
You can also generate balance tree for single nutrition value:
$ ./hranoprovod-cli -d examples/food.yaml -l examples/log.yaml --no-color bal -s calories
280.00 | candy
280.00 | snickers
280.00 | bar
-2400.00 | day
-2400.00 | nonworking
738.72 | sandwich
738.72 | egg
738.72 | lettuce
738.72 | 100g
-----------|
-1381.28 | calories
Same result in slightly more compact format:
$ ./hranoprovod-cli -d examples/food.yaml -l examples/log.yaml --no-color bal -s calories -c
280.00 | candy/snickers/bar
-2400.00 | day/nonworking
738.72 | sandwich/egg/lettuce/100g
-----------|
-1381.28 | calories