ja-he / dayplan

A utility to plan and track your time.
MIT License
5 stars 1 forks source link
calendar go golang productivity tui

Go Go Report Card Total Lines

GitHub tag (latest by date)

Dayplan

A utility to plan and track your time.

Warning/Disclaimer

but also

Installation

Arch Linux

AUR version AUR last modified

For Arch Linux and its derivatives there is an AUR package available.

Manually

All that's really needed is a go install github.com/ja-he/dayplan@latest.
However there is a small build script .scripts/build.sh available that takes care of inserting version and commit information. Therefore the recommended steps are:

git clone https://github.com/ja-he/dayplan
cd dayplan
./.scripts/build.sh install

As it still uses go install under the hood, the binary should be in your $GOPATH (or if empty in $HOME/go/bin).

Usage

Regular TUI Usage (tui)

Dayplan mainly works as a terminal UI (TUI) program invoked simply by calling the program with the tui subcommand:

$ dayplan tui

In this mode it allows you sketch out the events of a day, similar to how a graphical calendar application might work.

These events can then be shuffled around, resized, renamed, etc. as the day goes on and it turns out that one task actually took a lot longer or that phone call fell through. Thus you end up with a list of the (important) events of the day.

Dayplan can be controlled via both mouse and keyboard. Key mappings are "vim-ish" and not currently configurable.

Keyboard-driven

key input does...
? open help (context-based)
h / l switch the current day
i / ESC switch between day, week, and month view
+ / - zoom in or out
j / k select next or previous event
d delete the current event
CTRL-wh / CTRL-wl switch to left / right ui pane
S toggle a summary view (for day/week/...)
W load the weather (see the config section)
w write the current day to file
q quit
m enter event move mode, in which...
j / k ...move event up or down
m / ESC ...exit mode
r enter event resize mode, in which...
j / k ...lengthen or shorten event
r / ESC ...exit mode
(see help... ...for more)

Mouse-driven

To roughly emulate the expected behavior of a familiar calendar application, the mouse can also be used for editing (in truth, this was the initial method implemented, as it's pretty straightforward to define what the basic operations should be and how they should behave):

Getting Summaries (summarize)

To then get summary information about the information generated in this way, dayplan has the subcommand summarize. It requires you to specify a --from and a --til date and summarizes the duration of events in this range by their categories. You could for example use dayplan as above to track your working hours and then see how much you've worked in November 2021 using the following command:

$ dayplan summarize --from 2021-11-01 --til 2021-11-30 \
                    --category-filter work \
                    --human-readable

Getting a Timesheet (timesheet)

This is similar but distinct from summaries. You might have to fill out a timesheet at some point, of a format like the following, but probably in a spreadsheet:

Date Start Break Duration End
2022-12-01 08:45 45min 16:30
2022-12-02 08:52 1h 16:20
... ... ... ...

You can generate the data for this with dayplan using the (timesheet) subcommand:

$ dayplan timesheet --from "2022-12-01" \
                    --til "2022-12-31" \
                    --category "my-project" \
                    --include-empty

This would give you roughly the output

2022-12-01,08:45,45min,16:30
2022-12-02,08:52,1h,16:20
...

which should already be sufficient for opening as / copy-pasting into a spreadsheet.

Be sure to check out dayplan timesheet --help as well.

Adding events via CLI (add)

Besides being able to add events in the TUI mode, events can also be added via the add subcommand. This is especially useful for adding repeat events, in which case a start date, an end date, and the period of repetition need to be specified.

For more see dayplan add -h.

Configuration and Defaults

By default dayplan uses the directory ${HOME}/.config/dayplan for configuration and data storage. This directory can be set with the DAYPLAN_HOME environment variable. In the subdirectory days then days are stored as files named by YYYY-MM-DD format. Optionally, category styles can be defined in the file config.yaml; also see the Configuration section.

To get weather and sunrise/-set information you'll need to define latitude and longitude as environment variables (e.g. in the .bashrc):

export LATITUDE=12.3456
export LONGITUDE=11.1111

For getting the weather information from OWM you'll also need to have OWM_API_KEY defined in the same way, e.g.

export OWM_API_KEY=<key>

File Content Formatting

Days

A day, usually at ${DAYPLAN_HOME}/days/<YYYY-MM-DD>, is a list of events formatted as

<start>|<end>|<category>|<title>

so for example a day with three events might be

08:00|08:30|eat|Breakfast
08:30|10:00|fitness|Work Out
10:00|18:00|misc|Do Absolutely Nothing

Configuration

Dayplan can be optionally configured in ${DAYPLAN_HOME}/config.yaml. Configuration currently entails theming and categories.

Here a very short[^longer-example] example of the file format:

stylesheet:
  normal:            { fg: '#000000', bg: '#ffffff' }
  timeline-day:      { fg: '#c0c0c0', bg: '#ffffff' }
  timeline-night:    { fg: '#f0f0f0', bg: '#000000' }
  timeline-now:      { fg: '#ffffff', bg: '#ff0000' }
  summary-default:   { fg: '#000000', bg: '#ffffff' }
  summary-title-box: { fg: '#000000', bg: '#f0f0f0', style: { italic: true } }

categories:
  - name: uni
    color: '#ffdccc'
  - name: work
    color: '#ffcccc'
    goal: # this helps track overtime
      workweek:
        monday:    5h
        tuesday:   5h
        wednesday: 5h
        thursday:  5h
        friday:    0h
        saturday:  0h
        sunday:    0h

  - name: cooking
    color: '#ccffe6'
  # ...

[^longer-example]: As these identifiers are very much subject to change pre-v1.0.0, I'm refraining from providing a default 'config.yaml' file in the repo. Please just look through the sources in 'src/config/config.go' to see the yaml-identifiers that are available for stylings.

Note: Terminal Color Support

Currently, a true color terminal is required; use of other color codes is not supported.
However, this is not inherent to dayplan; see #24.