Skip to content

WakaTime

Step-by-step guide to configuring WakaTime for terminal, shell, and editor workflows, including API setup, Bash integration, and privacy-focused usage


Configure ~/.waktime.cfg

cat << "EOF" > ~/.wakatime.cfg
[settings]
debug = false
api_key=
api_url = https://api.wakatime.com/api/v1
hide_file_names = false
hide_project_names = false
hide_branch_names =
hide_project_folder = false
exclude =
    ^COMMIT_EDITMSG$
    ^TAG_EDITMSG$
    ^/var/(?!www/).*
    ^/etc/
include =
    .*
include_only_with_project_file = false
exclude_unknown_project = false
status_bar_enabled = true
status_bar_coding_activity = true
status_bar_hide_categories = false
offline = true
no_ssl_verify = false
ssl_certs_file =
timeout = 30
hostname = elitedesk
log_file =
EOF

Create bash-wakatime.sh

#!/bin/bash

pre_prompt_command() {
 version="1.0.0"
 entity=$(echo $(fc -ln -0) | cut -d ' ' -f1)
 [ -z "$entity" ] && return

 language="Bash"
 project="Terminal"
 category="coding"

 case $entity in
 ncmpcpp)
     project="Music Player Daemon"
     ;;
 vim | nano)
     category="coding"
     filename=$(echo $(fc -ln -0) | cut -d ' ' -f2)
     file_extension="${filename##*.}"  
        filename="private.$file_extension" 
     case "$file_extension" in
     "c") language="C" ;;
     "cpp") language="C++" ;;
     "py") language="Python" ;;
     "js") language="JavaScript" ;;
     "html") language="HTML" ;;
     "css") language="CSS" ;;
     "pl") language="Perl" ;;
     "md") language="Markdown" ;;
     "awk") language="Awk" ;;
     "php") language="PHP" ;;
     "conf") language="Config" ;;
     "sh") language="Bash" ;;
     *) language="Bash" ;;
     esac
     ;;
 cmus) 
        project="cmus"
        category="coding"
        ;;
 telnet)
     project="Telnet"
     category="coding"
     ;;
 weechat)
     project="Weechat"
     category="meeting"
     ;;
 ssh)
     project="SSH"
     category="coding"
     ;;
 adb)
     project="Android Debug Bridge"
     category="coding"
     ;;
 vim)
     project="Terminal"
     category="coding"
     ;;
 nano)
     project="Nano"
     category="coding"
     ;;
 *)
     $(git rev-parse --is-inside-work-tree 2>/dev/null) && project="$(basename $(git rev-parse --show-toplevel))" || project="Terminal"
     ;;
 esac

 (~/.wakatime/wakatime-cli --write \
     --plugin "bash-wakatime/$version" \
     --entity-type app \
     --project "$project" \
     --entity "$entity" \
     --category "$category" \
     --language "$language" \
     --alternate-project "Terminal" \
     --alternate-language "Bash" \
     --alternate-branch "main" \
     --category "Coding" \
     --exclude-unknown-project \
     --hide-project-folder \
     --internal-config ~/.wakatime/wakatime-internal.cfg \
     --config "~/.wakatime.cfg" \
     2>&1 >/dev/null &)

#    (~/.wakatime/wakatime-cli --write \
#        --plugin "bash-wakatime/$version" \
#        --entity-type app \
#        --project "$project" \
#        --entity "$entity" \
#        --category "$category" \
#        --language "$language" \
#        --alternate-project "Terminal" \
#        --alternate-language "Bash" \
#        --alternate-branch "main" \
#        --category "Coding" \
#        --exclude-unknown-project \
#        --hide-project-folder \
#        --exclude-unknown-project \
#        --config "~/.wakapi.cfg" \
#        2>&1 >/dev/null &)
}

PROMPT_COMMAND="pre_prompt_command; $PROMPT_COMMAND"