diff --git a/README.md b/README.md index 780dda7..b024852 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ **Modern accounting for the power-user** | *Crypto, banking, tax prep, meta analysis & more!* +> Looking for a Quickstart? Skip to [Installation](#installation). + 1. **[What does it do?](#what-does-it-do)** - [Overview](#overview) - [Highlights](#highlights) @@ -50,9 +52,9 @@ ### Overview -`docker-finance` empowers you with a privacy-focused, highly uniform system of financial management - but with a modern twist. +`docker-finance` gives you the power of a privacy-focused, highly uniform system of financial management - but with a modern twist. -Cryptocurrencies and blockchain metadata are unified with your legacy finances to create a world of best-practice accounting in a highly flexible, time-tested environment. +Cryptocurrencies & blockchain metadata are unified with legacy finance to create a world of best-practice accounting in a highly flexible, time-tested environment. ### Highlights @@ -241,32 +243,46 @@ Supported blockchains (independent of wallet type): ### Installation -`docker-finance` is not your typical Docker image in which you simply pull and containerize but rather, its an *image-based* accounting system that functions almost entirely within your container. +`docker-finance` is not your typical Docker image in which you simply pull and containerize, but rather it's an *image-based* accounting system that operates transparently between your client (host) and container; keeping your finances containerized, with all the benefits of containerization. `docker-finance` *should* work out-of-the-box on any modern Linux system. For example, if your client (host) is Ubuntu, the default installation of `coreutils`, `shells` and `utils` that came with your system will satisfy requirements. However, you'll still need to manually install Docker (see below). -1. **Install dependencies** (most recent stable versions): - - [Docker](https://docs.docker.com/engine/install/) with [post-install configuration](https://docs.docker.com/engine/install/linux-postinstall/) - - GNU Bash 5.2+ - - If you don't have `bash` installed by default (or if `bash` is not your default shell), setup `bash` per your system's documentation - - [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git/), for step 3 (**strongly advised**): - - `git` should be available via your package manager (e.g., `apt`, `pacman`, etc.). +1. **Install dependencies**: + 1. [Docker Engine](https://docs.docker.com/engine/install/#supported-platforms) with [post-install configuration](https://docs.docker.com/engine/install/linux-postinstall/) + - Latest version (or at least `27.1.1`) + 2. [GNU Bash](https://www.gnu.org/software/bash/) + - Latest version (or at least `5.0.17`) + - Installed by *default* on most Linux distributions -2. **Open a `bash` shell**, if you haven't already done so. +2. **Install recommended**: + 1. [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git/) + - Latest version (or at least `2.25.1`) + - Only needed for step 3 but should be kept in order to: + - Remain up-to-date with future `docker-finance` versions + - Safely track your workflow related data (journals, metadata, etc.) + 2. Consider using a terminal multiplexer like [tmux](https://github.com/tmux/tmux/wiki) or [screen](https://www.gnu.org/software/screen/) for optimal workflow efficiency -3. **Copy/paste the following into your shell** (one-time repository clone and client preparation): +3. **Copy/paste the following into your `bash` shell** (one-time repository clone and client preparation): ```bash bashrc=~/.bashrc aliases=~/.bash_aliases - if [[ -f "$bashrc" && ! -f "$aliases" ]]; then - if ! grep -E "(^\. ${aliases}|^source ${aliases})" "$bashrc" 1>/dev/null; then - aliases="$bashrc" - fi - fi - if git clone https://gitea.com/EvergreenCrypto/docker-finance; then - if ! grep -E "^alias docker-finance=" "$aliases" 1>/dev/null; then - echo "alias docker-finance='$(pwd)/docker-finance/client/docker.bash archlinux/$(whoami):latest'" >>"$aliases" - source "$aliases" + if ! test -f "$bashrc" || ! hash bash &>/dev/null; then + echo "FATAL: unsupported bash installation" + else + if [[ ! -z "$SHELL" && "$SHELL" =~ bash ]]; then + if [ ! -f "$aliases" ]; then + if ! grep -E "(\. ~/.bash_aliases|^source ~/.bash_aliases|^source ${aliases})" "$bashrc" &>/dev/null; then + aliases="$bashrc" + fi + fi + if git clone https://gitea.com/EvergreenCrypto/docker-finance; then + if ! grep -E "^alias docker-finance=" "$aliases" &>/dev/null; then + echo "alias docker-finance='$(pwd)/docker-finance/client/docker.bash archlinux/$(whoami):latest'" >>"$aliases" + source "$aliases" + fi + fi + else + echo "FATAL: unsupported bash environment" fi fi ``` @@ -291,97 +307,102 @@ Supported blockchains (independent of wallet type): ```bash docker-finance build type=default && docker-finance up ``` - > Note: see `docker-finance build help` for build options. + > See `docker-finance build help` for build options (such as smaller, faster builds) 7. **You're inside!** See [How do I use it?](#how-do-i-use-it) for next steps. ### Environment Generation -`docker-finance`'s environment consists of two scopes: `client` and `container`. The client (host) view is confined to the host while the container view confined to the container (though the client *can*, at times, view from *within* the container's perspective). Think of the client as a class that inherits the container as a protected class with all the relevant permissions and scope. +`docker-finance`'s environment consists of two scopes: `client` and `container`. The client (host) view is confined to the host while the container view confined to the container (though the client *can*, at times, view from *within* the container's perspective). -In terms of configuration, the client (host) has two primary files, with one of them being mutually shared with the container. The 1st file is the [Client (Host) Configuration File](#client-host-configuration) and the 2nd file is a joint [Client/Container Superscript](#clientcontainer-superscript). Think of this **superscript** as the glue that binds the client/container scopes. +In terms of configuration, the client (host) has the following files: + 1. The [Client (Host) Configuration File](#client-host-configuration) (client only) + 2. The [Client (Host) Custom Dockerfile](#client-host-custom-dockerfile) (client only) + 3. The [Client/Container Superscript](#clientcontainer-superscript) (client/container) You'll create these files (and more) when running `docker-finance gen`, as seen below. -#### Client generation +> Tip: client scope can be considered an OOP class which inherits the container as a protected class, with the [Client/Container Superscript](#clientcontainer-superscript) binding them. -> Client-side environment found, backup then generate new one? +--- -Generates the client (host) configuration file. See the [Client (Host) Configuration File](#configuration-files) section for details. +#### Client Generation + +When running `gen`, you'll see the following: + +> *Client-side environment found, backup then generate new one?* + +Generates the client (host) configuration file (see the [Client (Host) Configuration File](#client-host-configuration) for details). - You can use the generated defaults but make sure your directory layout matches accordingly - To easily edit this configuration file after `gen` is complete, run `docker-finance edit type=env` -#### Container generation +> *Generating new custom (optional) Dockerfile* -Container generation comes after (and *must* come after) client environment generation. +Generates custom Dockerfile. Do as you wish; install your own container packages, etc. (see the [Client (Host) Custom Dockerfile](#client-host-custom-dockerfile) for details). -The container environment contains the bulk of configurations for everything you'll need while inside `docker-finance`. + - To easily edit this configuration file after `gen` is complete, run `docker-finance edit type=build` --- -> Generate (or update) container profile configs and/or accounts? -The container environment is a minimum requirement but here you'll have the option to continue generating or to backup a previous install. +#### Container Generation ---- -> Will this profile be used for development and/or demonstration? +After the previous client environment is generated, the following will prepare the container environment (everything you'll need while inside `docker-finance`). + +> *Generate (or update) container profile configs and/or accounts?* + +Although the container environment is a minimum requirement, here you'll have the option to continue generating or to backup a previous install. + +> *Will this profile be used for development and/or demonstration?* If you're a developer or wish to see the mockup test profile, select 'y' here. -> Enter profile name (e.g., family in 'family/alice') -> Enter subprofile name (e.g., alice in 'family/alice') +> *Enter profile name (e.g., family in 'family/alice')* +> *Enter subprofile name (e.g., alice in 'family/alice')* -Container generation will always be for a specific `profile` with `subprofile`, and here is where you input that information. - -For example, you could have a `family` profile with subprofiles of various family members or a `business` profile with subprofiles of all the various businesses you own. +Container generation will always be for a specific `profile` with `subprofile`, and here is where you input that information. For example, you could have a `family` profile with subprofiles of various family members or a `business` profile with subprofiles of all the various businesses you own. It should be noted that: - all subsequent questions and container generation will relate to this `profile/subprofile` pairing - all output will be sent to the `${DOCKER_FINANCE_CONTAINER_FLOW}/profiles/profile/subprofile` path ---- -> Generate (or update) joint client/container shell script (superscript)? [Y/n] +> *Generate (or update) joint client/container shell script (superscript)? [Y/n]* -Select 'y' if this a first-run. If this is not a first-run but you need to regenerate the file, the select 'y'. +Select 'y' if this a first-run. If this is not a first-run but you need to regenerate the file, then select 'y' (see [Superscript](#clientcontainer-superscript) for details). -See [Superscript](#clientcontainer-superscript) for details. - ---- -> Generate (or update) container hledger-flow configs and/or accounts? +> *Generate (or update) container hledger-flow configs and/or accounts?* Not limited to `hledger-flow` data, this option leads to generating *all* `docker-finance` journal data (and configurations). ---- -> Generate (or update) subprofile's shell script? +> *Generate (or update) subprofile's shell script?* The container's subprofile's shell script is where all subprofile commands and aliases exist. -This file is generated on a per-subprofile basis and all custom code *on a per-subprofile basis* should go here. +This file is generated on a per-subprofile basis and all custom code *on a per-subprofile basis* should go here (see [Subprofile](#subprofile) for details). ---- -> Generate (or update) subprofile's fetch configuration? +> *Generate (or update) subprofile's fetch configuration?* -The container's fetch configuration is what all remote fetching relies on: prices, exchanges, blockchain explorers; all are configured here. See [Container Configurations](#container-configurations) for details. +The container's fetch configuration is what all remote fetching relies on: prices, exchanges, blockchain explorers; all are configured here (see [Fetch](#fetch-1) for details). ---- -> Generate (or update) subprofile's financial metadata? +> *Generate (or update) subprofile's financial metadata?* The container's *per-subprofile* metadata file. -This file contains all your custom metadata and can edited with the `edit` and analyzed with the `meta` or `root` command. See [Container Configurations](#container-configurations) for details. +This file contains all your custom metadata and can edited with the `edit` and analyzed with the `meta` or `root` command (see [Meta](#meta) for details). ---- -> Generate (or update) subprofile's hledger-flow accounts? +> *Generate (or update) subprofile's hledger-flow accounts?* The container's `hledger-flow` accounts to be installed. These are the accounts described in [What is supported?](#what-is-supported). +> *Generate individual subprofile accounts instead of generating them all at once?* + +If you intend to only use a few accounts, you can do so here. Otherwise, generate all accounts (recommended). + **WARNING**: if you plan to use blockchain-based wallets (coinbase-wallet, pera-wallet, ledger, metamask, etc.), you **MUST** generate their respective chains, as seen during generation (`algorand`, `ethereum-based`, `tezos`, etc). ### Configuration Files -> Note: Docker volumes aren't used because of chicken-or-the-egg problem, regarding client configuration (among other reasons). `docker-finance` needs the client environment *before* building the Docker image and spawning the subsequent container (which would rely on volumes). - -#### Client (host) configuration +#### Client (Host) Configuration The client (host) configuration file: - is located in the `${DOCKER_FINANCE_CLIENT_CONF}/client/env/` directory, with subdirectory format of `kernel-machine/platform/tag` @@ -391,22 +412,23 @@ The client (host) configuration file: - consists solely of variables in the format `DOCKER_FINANCE_VARIABLE=value` and is used by both Docker and `docker-finance` - default template variables can be found in [gen.bash](client/docker-finance.d/client/env/gen.bash), as described below ---- +After `gen` is complete, you can edit this file with the client (host) command: `docker-finance edit type=env` (see [Client (Host) Command Format](#client-host-command-format)). + + > DOCKER_FINANCE_CLIENT_CONF Client (host) configuration path. Parent directory for client configuration files. - - Example: `DOCKER_FINANCE_CLIENT_CONF=/home/${USER}/.config/docker-finance.d` ---- + > DOCKER_FINANCE_CLIENT_FLOW Client (host) hledger-flow path. Parent directory for all profiles. - Example: `DOCKER_FINANCE_CLIENT_FLOW=/net/nfs4/hledger-flow` ---- + > DOCKER_FINANCE_CLIENT_REPO Client (host) path for the `docker-finance` code repository (from the host's perspective). @@ -415,7 +437,7 @@ This parent directory is where the `client` and `container` directories are loca - Example: `DOCKER_FINANCE_CLIENT_REPO=/net/nfs4/git/docker-finance` ---- + > DOCKER_FINANCE_CLIENT_SHARED Client (host) path for the client/container shared directory. @@ -424,7 +446,6 @@ The bind-mount is used exclusively for non-essential file sharing (custom script - Example: `DOCKER_FINANCE_CLIENT_SHARED=/mnt/share.d` ---- > DOCKER_FINANCE_CONTAINER_CMD @@ -434,21 +455,21 @@ Default: `finance.bash` (internally aliased to `finance`) - Example: `DOCKER_FINANCE_CONTAINER_CMD=finance.bash` ---- + > DOCKER_FINANCE_CONTAINER_CONF The container's configuration path (bind-mounted to client's (host's) configuration path). - Example: `DOCKER_FINANCE_CONTAINER_CONF=/home/${USER}/.config/docker-finance.d` ---- + > DOCKER_FINANCE_CONTAINER_EDITOR The container's default text editor. - Example: `DOCKER_FINANCE_CONTAINER_EDITOR=vim` ---- + > DOCKER_FINANCE_CONTAINER_FLOW The container's hledger-flow path from the container's perspective. @@ -457,7 +478,7 @@ This path is bind-mounted to the client's (host's) hledger-flow path. - Example: `DOCKER_FINANCE_CONTAINER_FLOW=/home/${USER}/hledger-flow` ---- + > DOCKER_FINANCE_CONTAINER_REPO The container's `docker-finance` code repository path (as viewed from the container). @@ -466,62 +487,62 @@ This path is bind-mounted to the client's (host's) `docker-finance/container` pa - Example: `DOCKER_FINANCE_CONTAINER_REPO=/home/${USER}/docker-finance` ---- + > DOCKER_FINANCE_CONTAINER_SHARED The container's `share.d` path, bind-mounted to client's (host's) `share.d` path. - Example: `DOCKER_FINANCE_CONTAINER_FLOW=/home/${USER}/share.d` ---- + > DOCKER_FINANCE_CPUS Docker daemon/container setting: number of CPUs to use. - Example: `DOCKER_FINANCE_CPUS=2` ---- + > DOCKER_FINANCE_DEBUG Enable/disable debugging code paths (e.g., debug logging) - Example: `DOCKER_FINANCE_DEBUG=true` ---- + > DOCKER_FINANCE_PORT_HLEDGER `hledger-web` client-side (host) port - Example: `DOCKER_FINANCE_PORT_HLEDGER=5000` ---- + > DOCKER_FINANCE_PORT_ROOT `root` client-side (host) port for web interface - Example: `DOCKER_FINANCE_PORT_ROOT=8080` ---- + > DOCKER_FINANCE_MEMORY `docker-finance` container memory limit (see Docker documentation). - Example: `5G` ---- + > DOCKER_FINANCE_GID Group ID for bind mount. **MUST** have write permissions to rw bind-mounts. - Example: `DOCKER_FINANCE_GID=998` ---- + > DOCKER_FINANCE_UID User ID for bind mount. **MUST** have write permissions to rw bind-mounts. - Example: `DOCKER_FINANCE_UID=1001` ---- + > DOCKER_FINANCE_USER `docker-finance` container user. @@ -534,6 +555,19 @@ User **MUST** have write permissions to rw bind-mounts. --- +#### Client (Host) Custom Dockerfile + +The client (host) custom Dockerfile: + - is appended to the final generated Dockerfile + - allows you to append any Dockerfile command to a generated build + - is located in the `${DOCKER_FINANCE_CLIENT_CONF}/client/Dockerfiles/` directory + - format consists of `username@hostname` where `username` is your host username and `hostname` is your machine's hostname + - default generated templates can be found [here](client/docker-finance.d/client/Dockerfiles) + +After `gen` is complete, you can edit this file with the client (host) command: `docker-finance edit type=build` (see [Client (Host) Command Format](#client-host-command-format)). + +--- + #### Client/Container Superscript The client/container shell script (Superscript) is a bind-mounted (by directory) script that: @@ -546,7 +580,9 @@ See the in-file comments for further documentation: - [superscript.bash.in](client/docker-finance.d/container/shell/superscript.bash.in) -> Note: as described in [Client (host) command format](#client-host-command-format), to edit this file, issue the client (host) command: `docker-finance edit type=shell` +After `gen` is complete, you can edit this file with the client (host) command: `docker-finance edit type=shell` (see [Client (Host) Command Format](#client-host-command-format)). + +--- #### Container Configurations @@ -562,6 +598,8 @@ See the in-file comments for further documentation: - [subprofile.bash.in](client/docker-finance.d/container/shell/subprofile.bash.in) +After `gen` is complete, from within the container, you can edit this file with: `finance profile/subprofile edit type=shell` (see [Container Command Format](#container-command-format)). + ##### *Fetch* The source of all remote API fetching configurations (exchanges, blockchains, market prices). This file is used by both the `fetch` and `edit type=fetch` commands. @@ -570,6 +608,8 @@ See the in-file comments for further documentation: - [fetch.yaml.in](client/docker-finance.d/container/fetch/fetch.yaml.in) +After `gen` is complete, from within the container, you can edit this file with: `finance profile/subprofile edit type=fetch` (see [Container Command Format](#container-command-format)). + ##### *Meta* The source of all custom metadata information (typically used to store cryptocurrency metadata information). This file is used by the `meta`, `edit type=meta` and `root` commands, as seen in [Meta (w/ ROOT C++ analysis)](#meta-w-root-c-analysis). @@ -578,6 +618,8 @@ See the in-file comments for further documentation: - [meta.csv.in](client/docker-finance.d/container/meta/meta.csv.in) +After `gen` is complete, from within the container, you can edit this file with: `finance profile/subprofile edit type=meta` (see [Container Command Format](#container-command-format)). + ## How do I use it? ### Mostly-Unified CLI @@ -650,33 +692,35 @@ Where: - `` is the command to pass to `finance.bash` - `[args]` are the (optional) arguments to pass to `` -> Note: by default, the finance command can be called by either `finance.bash` or `finance`. +By default, `finance.bash` is aliased to `finance` (so, either can be used). -For a complete list of commands and usage help: +For a complete list of commands (no `` needed): ```bash finance help ``` -You can also view the help usage of, for example, the `fetch` command (notice the need for ``): +You can also view the help usage of, for example, the `fetch` command (notice the need for ``). + +Assuming `` is `testprofile/testuser`: ```bash finance testprofile/testuser fetch help ``` -> Note: the `finance` alias is named to avoid confusion with the client (host) command `docker-finance` - but you can still use the alias `docker-finance` *within* the container in place of all `finance` commands. - Or, use a subprofile alias, as described in [Subprofile](#subprofile): ```bash testuser_fetch help ``` +> Note: the `finance` alias is named to avoid confusion with the client (host) command `docker-finance`, but you can still use the alias `docker-finance` *within* the container in place of all `finance` commands. + ### Flow Layout A primary read through of [hledger](https://hledger.org) and [hledger-flow](https://github.com/apauley/hledger-flow/blob/master/README.org) documentation should bring you up to speed on the essentials. -As for `docker-finance` specifics, create a test profile during [Environment Generation](#environment-generation) to see what your flow's layout should look like. +As for `docker-finance` specifics, you can create a *test profile* during [Environment Generation](#environment-generation) to see what your flow's layout should look like. > Note: be sure to select 'y' when asked if this will be a development profile, and then go on to create account(s). Once inside the container, assuming you created a profile named `testprofile` and subprofile named `testuser`, issue the following commands: @@ -684,7 +728,9 @@ Once inside the container, assuming you created a profile named `testprofile` an ```bash finance testprofile/testuser fetch all=price year=all && finance testprofile/testuser import year=2018 ``` -> Note: you **MUST** import from `2018` as there are mockup accounts that begin from that year +> Note: for this *test profile* with developer mockups, you **MUST** import from `2018` as there are accounts that begin from that year + +After experimenting with a *test profile*, you can re-run `gen` again to create your own normal profile. --- @@ -714,8 +760,8 @@ Peeking inside `${DOCKER_FINANCE_CONTAINER_FLOW}/profiles/profile/subprofile`, y Regarding any profile you create: - - For manual CSV downloads, place you CSV file into your `${DOCKER_FINANCE_CONTAINER_FLOW}/profiles/profile/subprofile/import/subprofile/account/subaccount/1-in/year` directory - replacing `year` with the year of data that the file/data represents (see `import help` for details). - - When you want to edit custom settings for an account or a subaccount, use the `edit` command (see `edit help` for details). + - For manual CSV downloads, place you CSV file into your `${DOCKER_FINANCE_CONTAINER_FLOW}/profiles/profile/subprofile/import/subprofile/account/subaccount/1-in/year` directory (replacing `year` with the year of data that the file/data represents). See `import help` for details. + - When you want to edit custom settings for an account or a subaccount, use the `edit` command. See `edit help` for details. - Your `hledger-flow` will contain a symlink called `src` which links to all the internal mechanics that process your data. **Do not delete this link**. ### Caveats & Oddities @@ -764,32 +810,32 @@ Your input is valuable and appreciated. Come, make this project your own! > This pool is reserved for the `docker-finance` ecosystem (developers & operating costs). -##### Cryptocurrency +##### *Cryptocurrency* [Donate with Coinbase Commerce](https://commerce.coinbase.com/checkout/8831f2a9-1797-4aff-8cc3-bdbf97136a97) [](https://commerce.coinbase.com/checkout/8831f2a9-1797-4aff-8cc3-bdbf97136a97 "Donate with Coinbase Commerce") -##### Legacy +##### *Legacy* [Donate with PayPal](https://www.paypal.com/donate/?hosted_button_id=2RESHZY8U37EJ) [](https://www.paypal.com/donate/?hosted_button_id=2RESHZY8U37EJ "Donate with PayPal") -##### Alternative +##### *Alternative* For alternative donation methods, including your crypto/token of choice, please open a request in the [issue tracker](https://gitea.com/EvergreenCrypto/docker-finance/issues) or reach out to [Evergreen Crypto LLC](#evergreen-crypto-llc). --- -##### Dependencies +##### *Dependencies* To donate to the wonderful projects that `docker-finance` gratefully depends upon, please donate to them directly: + - [Docker](https://www.docker.com/blog/get-involved-with-docker/) - [hledger](https://hledger.org/sponsor.html) - [hledger-flow](https://github.com/apauley/hledger-flow) - [ROOT.cern](https://root.cern/contribute/) - - [Docker](https://www.docker.com/blog/get-involved-with-docker/) For other dependencies, please see their individual contributing guidelines. @@ -802,21 +848,22 @@ Additionally, when developing with the [`docker-finance` image](#image-docker-fi #### Pull Request -The following assumes that the command `docker-finance_dev-tools` has been properly aliased, per `docker-finance help`. +The following assumes that the command `dev-tools` has been properly aliased, per `docker-finance help`. Before sending a pull request: -1. If you created a new file, please run `docker-finance_dev-tools license file=/path/to/new/file.ext` and update the copyright date and author. -2. For any work that utilizes Bash/C++/PHP, please run the linter for your respective language (e.g., `docker-finance_dev-tools linter type=bash`). - - See `docker-finance_dev-tools linter help` for details. +1. If you created a new file, please run `dev-tools license file=/path/to/new/file.ext` and update the copyright date and author. +2. For any work that utilizes Bash/C++/PHP, please run the linter for your respective language (e.g., `dev-tools linter type=bash`). + - See `dev-tools linter help` for details. 3. As for style guidelines, these are recommended: - [Bash](https://google.github.io/styleguide/shellguide.html) - [C++](https://google.github.io/styleguide/cppguide.html) - [PHP](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/master/doc/ruleSets/PhpCsFixer.rst) -4. If you can, please document the code in Doxygen style where applicable and run `docker-finance_dev-tools doxygen gen` to see your code documentation. +4. If you can, please document the code in Doxygen style where applicable and run `dev-tools doxygen gen` to see your code documentation. #### Notes +- Regarding client configuration, Docker volumes aren't used because of chicken-or-the-egg problem (among other reasons). `docker-finance` needs the client environment *before* building the Docker image and spawning the subsequent container (which would rely on volumes). - As described in [Mostly-Unified CLI](#mostly-unified-cli), to use a developer version of the `finance` image (not a `dev-tools` image), simply build and tag a new `finance` image with `dev` (or whatever you see fit), and reset the `docker-finance` alias at your discretion. - Run `DOCKER_FINANCE_DEBUG=true docker-finance [args]` to debug *before* the [Client (Host) Configuration File](#client-host-configuration) file is read. - The `.C` files you see in the repository are ROOT.cern macro files, not C-language files.