{"id":37942552,"url":"https://github.com/jlanzarotta/khronos","last_synced_at":"2026-05-27T14:11:44.328Z","repository":{"id":256772121,"uuid":"856360637","full_name":"jlanzarotta/khronos","owner":"jlanzarotta","description":"A feature rich time tracker written in Go.","archived":false,"fork":false,"pushed_at":"2026-05-22T17:24:07.000Z","size":225,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-22T18:16:30.838Z","etag":null,"topics":["cli","cli-app","go","time-tracker","time-tracking","timetrack","timetracker","timetracking"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jlanzarotta.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-12T13:00:37.000Z","updated_at":"2026-05-22T17:23:07.000Z","dependencies_parsed_at":"2024-09-13T01:44:59.095Z","dependency_job_id":"12f6807f-fd87-48cf-9ad3-5858f6cd9500","html_url":"https://github.com/jlanzarotta/khronos","commit_stats":null,"previous_names":["jlanzarotta/khronos"],"tags_count":86,"template":false,"template_full_name":null,"purl":"pkg:github/jlanzarotta/khronos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlanzarotta%2Fkhronos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlanzarotta%2Fkhronos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlanzarotta%2Fkhronos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlanzarotta%2Fkhronos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jlanzarotta","download_url":"https://codeload.github.com/jlanzarotta/khronos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlanzarotta%2Fkhronos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33569219,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-27T02:00:06.184Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cli-app","go","time-tracker","time-tracking","timetrack","timetracker","timetracking"],"created_at":"2026-01-16T17:46:03.061Z","updated_at":"2026-05-27T14:11:44.322Z","avatar_url":"https://github.com/jlanzarotta.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"image:https://img.shields.io/github/v/release/jlanzarotta/khronos[GitHub Release]\nimage:https://img.shields.io/badge/License-BSD_3_Clause-blue.svg[link=\"https://opensource.org/license/BSD-3-clause\"]\nimage:https://github.com/jlanzarotta/khronos/actions/workflows/go.yml/badge.svg[link=\"https://github.com/jlanzarotta/khronos/actions/workflows/go.yml\"]\nimage:https://img.shields.io/github/downloads/jlanzarotta/khronos/total[GitHub Downloads (all assets, all releases)]\nimage:https://img.shields.io/github/go-mod/go-version/jlanzarotta/khronos[Go Version]\n\n= Khronos\n:toc: preamble\n:toclevels: 7\n:icons: font\n:sectnums:\n:numbered:\n:table-stripes: even\n\nKhronos is a simple command line tool used to track the time you spend on a\nspecific project and the one or more tasks associated with that project.  It was\ninspired by the concepts of utt (Ultimate Time Tracker) and timetrap.\n\n== Version 3.0 and Above\n\nWith the introduction of version 3, the entry date/time is now automatically\nrecorded in UTC timezone, NOT the local timezone. This way, when an entry's\ndate/time is displayed, it is automatically converted into the running machine's\ntimezone.\n\nIf you are using versions of Khronos before and wish to use version 3.0+, you\nshould use the `convert` command to convert all the entries in your database\nfrom local timezone to UTC. To do this, execute the following commands after\nupdating to version 3.0:\n\n[source, shell]\n----\n# Backup your database... Just in case.\n\u003e k backup\nBacking up C:\\Users\\yourname\\.khronos.db to C:\\Users\\yourname\\.khronos.db-backup_20250429090217...\nDone.\n\n# Convert to UTC...\n\u003e k convert\nAre you sure you want to convert ALL the entries in your database to UTC? (Y/N (yes/no)) \u003eyes\nAll entries converted.\n----\n\nYour database is now converted and you can continue using version 3.0+...\n\n== Installation\n\nThese are the various methods in order to install Khronos on your system.\n\n=== Scoop (Windows)\n\nYou can install `khronos` using https://scoop.sh/[scoop]. It is in the `khronos` bucket:\n\n[source, shell]\n----\n# Add my scoops.\n\u003e scoop bucket add jlanzarotta https://github.com/jlanzarotta/scoops\n\n# Install khronos.\n\u003e scoop install jlanzarotta/khronos\n----\n\nI personally like to alias the Khronos executable (khronos.exe) to a simple\ncommand, in my case, I used 'k'.  For Microsoft PowerShell, you can use\n\n[source, shell]\n----\n\u003e Set-Alias -Name k -Value khronos\n----\n\n=== Other Operating Systems\n\nTo install Khronos, simply unzip the archive for your specific operating system into the directory of your choice.\n\n== Configuration\n\nWhen Khronos starts up, it checks to make sure there is a default configuration file.  If it does not exist, it is automatically created for you.\n\nNOTE: Khronos supports the use of the _XDG Base Directory Specification_. For more information see https://specifications.freedesktop.org/basedir-spec/latest/\n\nKhronos uses the following precedence order when determining where the configuration file is located. Each item listed takes precedence over the item below it:\n\n[cols=\"1,1a\"]\n|===\n|Microsoft Windows(R)\n|. %XDG_CONFIG_HOME%/khronos/.khronos.yaml\n. %USERPROFILE%/.khronos.yaml\n|FreeBSD(R), Linux, macOS(R), etc.\n|. $XDG_CONFIG_HOME/khronos/.khronos.yaml\n. $HOME/.khronos.yaml\n|===\n\n=== Default Configuration\n\nThe default Microsoft Windows(R) Khronos configuration is as follows.  These configuration options can be modified by the user after installation.\n\n[source, yaml]\n----\ndatabase_file: %USERPROFILE%\\.khronos.db \u003c1\u003e\ndebug: false \u003c2\u003e\ndisplay_by_day_totals: true \u003c3\u003e\ndisplay_time_in_24h_format: false \u003c4\u003e\ndisplay_hms_abbreviated: false \u003c5\u003e\nreport: \u003c6\u003e\n    by_day: true\n    by_entry: true\n    by_project: true\n    by_task: true\nrequire_note: false \u003c7\u003e\nround_to_minutes: 15 \u003c8\u003e\nweek_start: Sunday \u003c9\u003e\nshow_by_day_totals: true \u003c10\u003e\nsplit_work_from_break_time: false \u003c11\u003e\nfavorites: \u003c12\u003e\n  - favorite: general+training\n  - favorite: general+product development\n  - favorite: general+personal time\n  - favorite: general+holiday\n  - favorite: general+vacation/PTO/Comp\n----\n\n\u003c1\u003e The database file used by Khronos.  Default is `.khronos.db`.\n\u003c2\u003e If debug type information should be printed to the screen or not.  Default is `false`.\n\u003c3\u003e If day totals should be displayed on the reports or not. Default is `true`.\n\u003c4\u003e If time should be displayed in 24 hour format or not. Default is `false`.\n\u003c5\u003e If hours, minutes, and seconds should be abbreviated to h, m, and s, to save display area.\n\u003c6\u003e Indicates which reports to run and which ones not to.\n\u003c7\u003e If a note is required when entering a new entry into Khronos.  Default is `false`. This overrides favorite specific configuration.\n\u003c8\u003e The number of minutes to round up or down to when running reports.  This makes it easy to report on consistent time \"buckets\".\n\u003c9\u003e The day used to indicate the start of the week.  Some companies' weeks start on Saturday, some on Sunday.  This allows you to change that start day to fit your needs.  The default is `Sunday`.\n\u003c10\u003e Should a daily total be shown for each day when rendering the \"by day\" report.  Default is `true`.\n\u003c11\u003e Indicates if work and break time should be split into separate values during reports or not.  The default is `false`.\n\u003c12\u003e The list of favorites.\n\n== Date/Time\n\nIt needs to be noted that date/time is stored in the database in ISO8601 UTC format https://en.wikipedia.org/wiki/ISO_8601. However, whenever a date/time is\nrendered on the screen, it is rendered in local time. For example, `2025-04-07T19:35:31+00:00`, which is UTC, is rendered as `2025-04-07T15:35:31-04:00` Eastern Standard Time with Daylight\nSavings Time being observed since I set my timezone to EST. Your local time will depend on your current timezone.\n\n== Natural Language Time\n\nKhronos supports natural language time constructs for a subset of\ncommands.  Commands such as hello, add, break, and stretch have additional parameters\nthat accept time as an argument.  Any time you pass a time, Khronos will try\nto parse it as a natural language time.\n\nThis feature can be very handy if you start a project/task and forget to add it simply by specifying the `--at` subcommand.\n\n[source, shell]\n----\n$ k hello --at \"18 minutes ago\"\n----\n\nThe previous example tells Khronos that you want it to add a \u003c\u003chello\u003e\u003e entry\nwith the time that was 18 minutes ago.\n\n[source, shell]\n----\n$ k hello --at \"today at 7:30AM\"\n----\n\nThe previous example tells Khronos that you want it to add a \u003c\u003chello\u003e\u003e entry\nwith the time that was at 7:30AM this morning.  This is more straight and to the point.\n\n[source, shell]\n----\n$ k break lunch --at \"12:30\"\n----\n\nThe previous example tells Khronos that you want it to add a \u003c\u003cbreak\u003e\u003e entry\nwith the time that was at specifically \"12:30PM\".\n\n[source, shell]\n----\n$ k add project+task --at \"13:45\"\n----\n\nThe previous example tells Khronos that you want it to add an entry\nwith the time that was at specifically \"13:45\".\n\nFor more information about Natural Language Time as well as samples, head over\nto https://pkg.go.dev/github.com/ijt/go-anytime\n\n== Positional Commands\n\nKhronos has many commands for the user to use:\n\n=== hello\n\nThe `hello` command tells Khronos you have arrived and to start tracking\ntime.  This should be the first command you execute at the start of your day.\n\n[source, shell]\n----\n$ k hello\n----\n\nWARNING: Keep in mind that if you forget to execute the `hello` command at the start of the day, Khronos will think you worked throughout the night and calculate your time spent on your task accordingly when you run a `report`.  This may or may not be the correct outcome.\n\n=== add\n\nThe `add` command tells Khronos that you would like to record a project with optional one or more tasks you have just finished working on.\n\nIf you would like to perform an _interactive_ add, simply perform the following command.\n\n[source, shell]\n----\n$ k add\n----\n\nDuring an _interactive_ add, your list of favorites are displayed and you can interactively select from your list.\n\n[source, shell]\n----\nFavorites found in configuration file[C:\\Users\\yourname\\.khronos.yaml]:\n\n # | PROJECT+TASK                | REQUIRE NOTE*\n---+-----------------------------+---------------\n 0 | general+training            | false\n 1 | general+product development | false\n 2 | general+personal time       | false\n 3 | general+holiday             | false\n 4 | general+vacation/PTO/Comp   | false\n\n* May be overridden by global configuration setting\n\nPlease enter the number of the favorite; otherwise, [Return] to quit. \u003e 0\n----\n\nIn this example, the user chose project/task 0.\n\nIf the configuration option `require_note:` is set to `true`, Khronos will prompt the user to enter a note.  Otherwise, a note is not required.\n\n[source, shell]\n----\nPlease enter the number of the favorite to add; otherwise, [Return] to quit. \u003e 0\nProject[general] Task[training] requires a note...\nEnter note or leave blank to quit. \u003e\n----\n\nIf the note is left blank/empty, nothing is added.\n\n[source, shell]\n----\nRequired note not entered. Nothing added.\n----\n\nIf no favorites are found in your configuration file, an error is displayed and the interactive add is cancelled.\n\n[source, shell]\n----\nFatal: No favorites found in configuration file[C:\\Users\\jlanzarotta\\.khronos.yaml].  Unable to perform an interactive add.\n----\n\nIf during an add, the project+task is specified, this tells Khronos that you just finished working on the project, `khronos` and the task, `programming`.\n\n[source, shell]\n----\n$ k add khronos+programming\n----\n\nIf during an add, you have multiple tasks you finished, you can specify them like below.  This tells Khronos that you just finished working on the project, `khronos` and the tasks, `programming` and `documentation`.\n\n[source, shell]\n----\n$ k add khronos+programming+documentation\n----\n\n==== note\n\nThe `--note` option tells Khronos that you would like to add a note associated with your new entry.\n\n[source, shell]\n----\n$ k add khronos+programming --note \"I love programming.\"\n----\n\n==== favorite\n\nThe `--favorite` option tells Khronos that you would like to use one of your preconfigured favorite project/task combinations.  These favorites are stored in the _.khronos.yaml_ file which is located in the installation directory.  By default, there are 5 preconfigured favorites; however, you can add as many as you would like.\n\nNOTE: Favorites are 1 based.\n\nFavorites are in the following format:\n\n[source,properties]\n----\nfavorites:\n  - favorite: general+training\n  - favorite: general+product development\n  - favorite: general+personal time\n  - favorite: general+holiday\n  - favorite: general+vacation/PTO/Comp\n----\n\nIf you want to finish working on a known favorite, you can use the `--favorite` flag to specify the favorite.\n\n[source, shell]\n----\n$ k add --favorite 1\nYou are about to add this entry\n\n    Project[general]\n       Task[training]\n       Date[2023-12-07T14:10:02-05:00]...\n\nContinue? Y/N (yes/no)? \u003e\n----\n\nThe previous command tells Khronos that you just finished working on the favorite referenced by the number '0'.  If we look in our _.khronos.yaml_ file for the '0' favorite, we find that it references the 'project1+task1' combination.  With that, 'project1+task1' would be automatically logged as being completed.\n\nTIP: Configuring and using favorites helps improve consistency as well as improves speed of entering frequently used project/task combinations.\n\nIf you choose `yes`...\n\n[source, shell]\n----\nEntry added.\n----\n\nIf you choose `no`...\n\n[source, shell]\n----\nNothing added.\n----\n\n==== description\n\nAn optional description can be added to a favorite.  This description will show up on various commands and reports.\n\nHere is an example:\n\n[source,properties]\n----\nfavorites:\n  - favorite: general+training\n  - favorite: general+product development\n  - favorite: general+personal time\n  - favorite: general+holiday\n  - favorite: general+vacation/PTO/Comp\n  - favorite: project1+screen coding task\n    description: A very important project\n.\n.\n.\n----\n\n==== require_note\n\nAn optional `require_note` can be added to a favorite. This flag tells Khronos that you want to require the prompting of a note for this specific favorite.\n\nIMPORTANT: If the global `require_note` option is set to `true`, no matter what value you set on a favorite's `require_note`, a note will be required.\n\n # | PROJECT+TASK                | REQUIRE NOTE*\n---+-----------------------------+---------------\n 0 | general+training            | true\n 1 | general+product development | false\n 2 | general+personal time       | false\n 3 | general+holiday             | false\n 4 | general+vacation/PTO/Comp   | false\n\n* May be overridden by global configuration setting\n\n=== amend\n\nThe `amend` command tells Khronos that you are wanting to modify a recent entry's information.  By default, amend amends the most recent entry's information.  However, if you would like to get a list of the entries for today, use the `--today` option.  More on the `--today` option below.\n\n==== today\n\nUsing this option, you are shown a list of all the entries for today.  You are then given the opportunity to choose the entry you would like to amend.\n\n[source, shell]\n----\n+---+----------+----------+---------------------------+\n|   | PROJECT  | TASK(S)  | DATE/TIME                 |\n+---+----------+----------+---------------------------+\n| 1 | ***hello |          | 2024-04-15T07:23:03-04:00 |\n| 2 | general  | training | 2024-04-15T07:49:12-04:00 |\n| 3 | general  | training | 2024-04-15T08:29:02-04:00 |\n| 4 | general  | training | 2024-04-15T08:53:01-04:00 |\n| 5 | general  | training | 2024-04-15T09:18:23-04:00 |\n+---+----------+----------+---------------------------+\nPlease enter index number of the entry you would like to amend; otherwise, ENTER to quit...\n----\n\nYou are prompted to modify each of the entry's properties and then asked to validate those modifications before they are committed to the database.\n\nIMPORTANT: The Date/Time must be in ISO8601 format. https://en.wikipedia.org/wiki/ISO_8601\n\n[source, shell]\n----\n$ k amend\nAmending...\n\nProject[proj-001]\n   Task[meeting]\n   Note[CRP with customer.]\n   Date[2024-04-10T10:32:24-04:00]\n\nEnter Project (empty for no change) [proj-001] : proj-002\nEnter Task (empty for no change) [meeting] :\nEnter Note (empty for no change) [CRP with customer.] :\nEnter Date Time (empty for no change) [2024-04-10T10:32:24-04:00] : 2024-04-10T10:302:00-00:00\n\n          | OLD                       | NEW\n----------+---------------------------+---------------------------\n Project  | proj-001                  | proj-002\n Task     | meeting                   | meeting\n Note     | CRP with customer.        | CRP with customer.\n Datetime | 2024-04-10T10:32:24-04:00 | 2024-04-10T10:30:00-00:00\n\nCommit these changes? (Y/N (yes/no))\n----\n\n==== date\n\nUsing this option, you are shown a list of all the entries for specified date. The date *MUST* be in `YYYY-MM-DD` format.  You are then given the opportunity to choose the entry you would like to amend, just like when specifying `today`.\n\n=== backup\n\nThe `backup` command tells Khronos that you would like for it to backup your database to a uniquely named _-backup_yyyymmddhhmmss_ backup file.\n\n[source, shell]\n----\n$ k backup\nBacking up C:\\Users\\yourname\\.khronos.db to C:\\Users\\yourname\\.khronos.db-backup_20250429095331...\nDone.\n----\n\n=== break\n\nThe `break` command tells Khronos that you are going on a break.  The time associated with breaks is not added to your daily work time.  It is considered under the break classification when doing a `report`.\n\n[source, shell]\n----\n$ k break\nYou are about to add this break\n\n    Break Time\n       Date[2025-12-12T14:57:31-05:00]...\n\nContinue? Y/N (yes/no) \u003e yes\n----\n\nThe previous command tells Khronos that you just finished your break.\n\n==== note\n\nThe `note` option tells Khronos that you would like to add a note associated with your new break.\n\n[source, shell]\n----\n$ k break --note lunch\nYou are about to add this break...\n\n    Break Time\n       Note[lunch]\n       Date[2025-12-12T14:57:31-05:00]\n\nContinue? Y/N (yes/no) \u003e y\n----\n\nThe previous command tells Khronos that you just finished your lunch break.\n\n=== edit\n\nThe `edit` command tells Khronos you would like to edit the Khronos configuration file with the default system editor.\n\n[source, shell]\n----\n$ k edit\n----\n\n=== nuke\n\nOver time as you enter new entries into the database, the database will naturally grow.  To clear out old entries, use the `nuke` command.\n\n==== all\n\nThe `all` option tells Khronos that you would like to nuke ALL entries from the database.  This includes the current year's entries.\n\nWARNING: Use this with extreme caution as ALL entries will be nuked.  You are given ample warning before your entries are actually nuked.  YOU HAVE BEEN WARNED.\n\n[source, shell]\n----\n$ k nuke --all\nAre you sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nWARNING: Are you REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nLAST WARNING: Are you REALLY REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nAll entries nuked.\n----\n\n==== prior-years\n\nThe `prior-years` option tells Khronos that you would like to nuke all entries prior to the current year.  So in other words, if you were tracking the past 5 years worth of entries in your database, and you issued the `prior-years` command, the past 4 years worth of entries would be nuked from the database, leaving just the current year.\n\nNOTE: You are given ample warning before your entries are actually nuked...\n\n[source, shell]\n----\n$ k nuke --prior-years\nAre you sure you want to nuke all entries prior to 2024 from the database? (Y/N (yes/no)) yes\nWARNING: Are you REALLY sure you want to nuke all entries prior to 2024 from the database? (Y/N (yes/no)) yes\nLAST WARNING: Are you REALLY REALLY sure you want to nuke all entries prior to 2024 from the database? (Y/N (yes/no)) yes\nAll entries prior to 2024 have been nuked.\n----\n\n==== dry-run\n\nThe `dry-run` option tells Khronos that you do not really want anything nuked.  But instead just report on how many entries would have been nuked.\n\n[source, shell]\n----\n$ k nuke --all --dry-run\nAre you sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nWARNING: Are you REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nLAST WARNING: Are you REALLY REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nAll 639 entries would have been nuked.\n----\n\n==== archive\n\nThe `archive` option tells Khronos that you would like to archive the entries that are nuked from your database. The nuked records are written to a _khronos_archive_yyyymmddhhmmss.csv_ file.\n\n[source, shell]\n----\n$ k nuke --all --archive\nAre you sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nWARNING: Are you REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nLAST WARNING: Are you REALLY REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nAll 639 entries would have been nuked.\n\n$ ls -l\n.a---  58 KB Tue 2025-02-18 08:25:48 PM . khronos_archive_20250218202548.csv\n----\n\n==== compress\n\nThe `compress` option tells Khronos that you would like to have the archive file automatically compressed. The compression format is _gzip_ and the compressed file will be named _khronos_archive_yyyymmddhhmmss.csv.gz_.\n\n[source, shell]\n----\n$ k nuke --all --archive --compress\nAre you sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nWARNING: Are you REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nLAST WARNING: Are you REALLY REALLY sure you want to nuke ALL the entries from your database? (Y/N (yes/no)) yes\nAll 639 entries would have been nuked.\n\n$ ls -l\n.a---  58 KB Tue 2025-02-18 08:25:48 PM . khronos_archive_20250218202548.csv.gz\n----\n\n=== show\n\nThe `show` command tells Khronos you would like to show various information.\n\n==== favorites\n\nThe `favorites` option tells Khronos that you would like to show all your currently configured favorites that are stored in the _.khronos.yaml_ file which is located in the installation directory.\n\n[source, shell]\n----\n$ k show --favorites\nFavorites found in configuration file[C:\\Users\\yourname\\.khronos.yaml]:\n\n # | PROJECT+TASK                | REQUIRE NOTE*\n---+-----------------------------+---------------\n 0 | general+training            | false\n 1 | general+product development | false\n 2 | general+personal time       | false\n 3 | general+holiday             | false\n 4 | general+vacation/PTO/Comp   | false\n\n* May be overridden by global configuration setting\n----\n\nIf one or more of your favorites have an associated Jira Ticket, your favorites will be shown like this:\n\n[source, shell]\n----\n$ k show --favorites\nFavorites found in configuration file[C:\\Users\\yourname\\.khronos.yaml]:\n\n # | PROJECT+TASK                | URL                         | REQUIRE NOTE*\n---+-----------------------------+-----------------------------+---------------\n 0 | general+training            | https://yoursite.com/TICKET | false\n 1 | general+product development | https://yoursite.com/TICKET | false\n 2 | general+personal time       |                             | false\n 3 | general+holiday             |                             | false\n 4 | general+vacation/PTO/Comp   |                             | false\n\n* May be overridden by global configuration setting\n----\n\nIf one or more of your favorites have an associated description, your favorites will be shown like this:\n\n[source, shell]\n----\n$ k show --favorites\nFavorites found in configuration file[C:\\Users\\yourname\\.khronos.yaml]:\n\n # | PROJECT+TASK                | DESCRIPTION | URL                         | REQUIRE NOTE*\n---+-----------------------------+-------------+-----------------------------+---------------\n 0 | general+training            | Training    | https://yoursite.com/TICKET | false\n 1 | general+product development |             | https://yoursite.com/TICKET | false\n 2 | general+personal time       |             |                             | false\n 3 | general+holiday             |             |                             | false\n 4 | general+vacation/PTO/Comp   |             |                             | false\n\n* May be overridden by global configuration setting\n----\n\n==== statistics\n\nThe `statistics` option tells Khronos that you would like to show some statistics related to the entries you have entered into the database.\n\n[source, shell]\n----\n$ k show --statistics\n\n STATISTIC     | VALUE\n---------------+----------------------------------------------------------\n First Entry   | Project[***hello] Task[] Date[2023-11-27T07:17:36-05:00] \u003c1\u003e\n Last Entry    | Project[***hello] Task[] Date[2024-04-25T07:15:58-04:00] \u003c2\u003e\n Total Records | 21 weeks 2 days 22 hours 58 minutes 22 seconds \u003c3\u003e\n----\n\n\u003c1\u003e The first entry in the database.\n\u003c2\u003e The last entry in the database.\n\u003c3\u003e The total duration that is currently in the database.\n\n==== unpushed\n\nThe `unpushed` option tells Khronos that you would like to show all entries that have not yet been pushed to the Jira server.\n\n[source, shell]\n----\n$ k show --unpushed\n\n DATE       | PROJECT | TASK   | NOTE\n------------+---------+--------+--------------------------------------------------\n 2025-11-17 | Khronos | coding | Working on bug fixes.\n 2025-11-18 | Khronos | coding | Working on bug fixes.\n 2025-11-19 | Khronos | coding | Working on bug fixes.\n 2025-12-01 | Khronos | coding | Working on bug fixes.\n 2025-12-02 | Khronos | coding | Working on bug fixes.\n----\n\n=== report\n\nThe `report` command tells Khronos you would like to run a report on your activities.  By default, you get the current day's activities.\n\nA couple of things you will notice when you run a report is, first, the header.\n\n[source, shell]\n----\n============ 2025-01-19 00:00:00(3) to 2025-01-25 23:59:59(4) ============\n----\n\nThe report header tells you the start and end date/time of the report as well as the week number in parentheses.\n\nSecondly, you will see the _Total Time_.  The _Total Time_ can be in two formats, which is controlled by the `split_work_from_break_time` configuration option.\n\nIf `split_work_from_break_time` is set to `false`, you will get a combined _Total Time_...\n\n[source, shell]\n----\nTotal Time: 3 hours 45 minutes 0 second\n----\n\nIf `split_work_from_break_time` is set to `true`, you will get a split _Total Time_...\n\n[source, shell]\n----\nTotal Working Time: 3 hours 30 minutes 0 second\nTotal Break Time: 15 minutes\n----\n\n==== Configuration\n\nAs mentioned previously in the \u003c\u003cDefault Configuration\u003e\u003e configuration section, there are options to configure different report sections.\n\nIf _by_day: true_, a report by day section is created.\n\n[source, shell]\n----\n==========  By Day  ==========\n----\n\nIf _by_entry: true_, a report by entry section is created.\n\n[source, shell]\n----\n==========  By Entry  ==========\n----\n\nIf _by_project: true_, a report by project section is created.\n\n[source, shell]\n----\n==========  By Project  ==========\n----\n\nIf _by_task: true_, a report by task section is created.\n\n[source, shell]\n----\n==========  By Task  ==========\n----\n\n==== Options\n\nThe `report` command has several handy options that allow you to customize what needs to be reported.\n\n===== --current-week\n\nBy specifying the option `--current-week`, this tells Khronos you would like a report for the current week's activities.\n\n[source, shell]\n----\n$ k report --current-week\n----\n\n===== --previous-week\n\nBy specifying the option `--previous-week`, this tells Khronos you would like a report for the previous week's activities.\n\n[source, shell]\n----\n$ k report --previous-week\n----\n\n===== --last-entry\n\nBy specifying the option `--last-entry`, this tells Khronos you would like a report for just the last entry's activity.\n\n[source, shell]\n----\n$ k report --last-entry\n----\n\n===== --from\n\nBy specifying the option `--from` _date_, this tells Khronos you would like the report to start from this specific date.\n\n[source, shell]\n----\n$ k report --from 2019-03-02\n----\n\n===== --to\n\nBy specifying the option `--to` _date_, this tells Khronos you would like the report to end at this specific date.\n\n[source, shell]\n----\n$ k report --to 2019-03-02\n----\n\n===== --today\n\nBy specifying the option `--today`, this tells Khronos you would like the report specifically for today.\n\n[source, shell]\n----\n$ k report --today\n----\n\n===== --yesterday\n\nBy specifying the option `--yesterday`, this tells Khronos you would like the report specifically for yesterday.\n\n[source, shell]\n----\n$ k report --yesterday\n----\n\n===== --date\n\nBy specifying the option `--date`, this tells Khronos you would like the report specifically for the given date. The date MUST be in the following format `YYYY-mm-dd`.\n\n[source, shell]\n----\n$ k report --date 2024-10-11\n----\n\n===== --project\n\nBy specifying the option `--project`, this tells Khronos you would like the report specifically for the given project.\n\n[source, shell]\n----\n$ k report --project foobar\n----\n\n===== --no-rounding\n\nBy specifying the option `--no-rounding`, this tells Khronos you would like all the durations to be their original, unrounded values.  This option is good if you have durations that are less than the value you have configured for rounding.\n\n[source, shell]\n----\n$ k report --from 2019-04-01 --to 2019-04-13 --no-rounding\n$ k report --previous-week --no-rounding\n----\n\n==== --export type\n\nBy specifying the option `--export`, this tells Khronos you would like to export the report to one of three types: CSV, HTML, and Markdown.  The default is CSV.\n\n[source, shell]\n----\n$ k report --current-week --export --type csv\n$ k report --previous-week --export --type html\n$ k report --export --type md\n----\n\nThese commands will create a unique report file with the extension associated with the type you specified.  CSV produces a file ending in .csv, HTML produces a file ending in .html, and MD produces a file ending in .md.\n\n==== push\n\nBy specifying the `--push` option, you tell Khronos that you want to push any unpushed entry's duration and note to the associated Jira Ticket's worklog.\n\nIn order to be able to push entries to Jira, you must first add several extra configuration elements to your _.khronos.yaml_ configuration file.\n\nFirst, you must add the Jira `push:` configuration. This configuration consists of a `type`, a `url`, a `username`, and an `api_key`.\n\n[source, yaml]\n----\npush:\n  type: jira \u003c1\u003e\n  url: https://some_name.atlassian.net \u003c2\u003e\n  username: username@company.com \u003c3\u003e\n  api_key: \u003cYOUR JIRA API-KEY GOES HERE\u003e \u003c4\u003e\n----\n\u003c1\u003e Must always be jira.\n\u003c2\u003e The URL to get to the Jira instance.\n\u003c3\u003e The username used to log into the Jira instance.\n\u003c4\u003e The Jira API-KEY the username uses to log into the Jira instance.\n\nNext, when you define your \u003c\u003c_favorites\u003e\u003e, you *MUST* specify the `ticket` attribute. The `ticket` attribute tells Khronos that this entry is associated with a specific Jira ticket.\n\n[source, yaml]\n----\nfavorites:\n  - favorite: general+office mgnt(acct/hr/purch)\n    require_note: true\n  - favorite: general+training\n    require_note: true\n    ticket: GENERAL-003 \u003c1\u003e\n----\n\u003c1\u003e Tells Khronos that this entry is related to this Jira ticket.\n\nBy specifying the `ticket` attribute, Khronos will automatically add a `ticket` property to the entry when it is added to the database.\n\nNow that you have the necessary configuration set up, when you use `--push`, Khronos will use a combination of the push URL along with the ticket to push the entry's duration and note to the Jira Ticket's worklog.\n\n=== stretch\n\nThe `stretch` command stretches the last entry to the current or specified date/time.\n\nIn the below example, the latest entry is displayed. Khronos will ask you if you want to perform the stretch or not.  If you enter (y or Yes), the latest entry is stretched.  If you enter (n/No), the latest entry is not stretched.\n\n[source, shell]\n----\n$ k stretch\nYou are about to stretch the last entry\n\n    Project[general]\n       Task[meeting]\n       Note[Sprint Planning]\n       Date[2026-02-26T10:57:44-05:00]\n\nto 2026-02-26T11:19:42-05:00 which is a difference of 21 minutes 58 seconds...\n\nContinue? Y/N (yes/no) \u003e yes\nLast entry was stretched.\n----\n\n=== web\n\nThe `web` command opens the Khronos website in your default web browser.\n\n[source, shell]\n----\n$ k web\nOpening the Khronos website in your default browser...\n----\n\n== Copyright and License\n\nBSD 3-Clause License\n\nCopyright (c) 2018-{localyear}, Jeff Lanzarotta\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjlanzarotta%2Fkhronos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjlanzarotta%2Fkhronos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjlanzarotta%2Fkhronos/lists"}