{"id":42202052,"url":"https://github.com/seeruk/tid","last_synced_at":"2026-01-27T00:27:16.889Z","repository":{"id":57522643,"uuid":"82682758","full_name":"seeruk/tid","owner":"seeruk","description":"A simple, CLI-based time tracking utility for personal time tracking.","archived":false,"fork":false,"pushed_at":"2017-06-08T20:14:17.000Z","size":1426,"stargazers_count":7,"open_issues_count":5,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-21T03:09:35.212Z","etag":null,"topics":["cli","golang","time-tracker"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seeruk.png","metadata":{"files":{"readme":"README.md","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}},"created_at":"2017-02-21T13:27:06.000Z","updated_at":"2023-07-15T13:08:47.000Z","dependencies_parsed_at":"2022-08-26T23:50:21.172Z","dependency_job_id":null,"html_url":"https://github.com/seeruk/tid","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/seeruk/tid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seeruk%2Ftid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seeruk%2Ftid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seeruk%2Ftid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seeruk%2Ftid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seeruk","download_url":"https://codeload.github.com/seeruk/tid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seeruk%2Ftid/sbom","scorecard":{"id":809695,"data":{"date":"2025-08-11","repo":{"name":"github.com/seeruk/tid","commit":"5381472b43d79367433514357aa3856da95ccc6e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Code-Review","score":1,"reason":"Found 4/30 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.2.4 not signed: https://api.github.com/repos/seeruk/tid/releases/6640779","Warn: release artifact v0.2.3 not signed: https://api.github.com/repos/seeruk/tid/releases/6595538","Warn: release artifact v0.2.2 not signed: https://api.github.com/repos/seeruk/tid/releases/6595514","Warn: release artifact v0.2.4 does not have provenance: https://api.github.com/repos/seeruk/tid/releases/6640779","Warn: release artifact v0.2.3 does not have provenance: https://api.github.com/repos/seeruk/tid/releases/6595538","Warn: release artifact v0.2.2 does not have provenance: https://api.github.com/repos/seeruk/tid/releases/6595514"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T12:47:03.557Z","repository_id":57522643,"created_at":"2025-08-23T12:47:03.557Z","updated_at":"2025-08-23T12:47:03.557Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28793060,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T21:49:50.245Z","status":"ssl_error","status_checked_at":"2026-01-26T21:48:29.455Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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","golang","time-tracker"],"created_at":"2026-01-27T00:27:16.765Z","updated_at":"2026-01-27T00:27:16.867Z","avatar_url":"https://github.com/seeruk.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./logo.png\" height=\"256\" /\u003e\u003cbr\u003e\n    \u003ca href=\"https://travis-ci.org/SeerUK/tid\"\u003e\n        \u003cimg src=\"https://travis-ci.org/SeerUK/tid.svg?branch=master\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://goreportcard.com/report/github.com/SeerUK/tid\"\u003e\n        \u003cimg src=\"https://goreportcard.com/badge/github.com/SeerUK/tid\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/SeerUK/tid/releases\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/release/SeerUK/tid.svg\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nA simple, CLI-based, personal time tracking utility. `tid` uses [Bolt][1] as a storage backend, and\ndoes not require an active daemon to run.\n\n## Installation\n\nThe easiest method is with the installation script:\n\n```\n$ curl -s https://raw.githubusercontent.com/SeerUK/tid/master/install.sh | sh\n```\n\nYou can download a pre-built binary for Windows, Linux, or macOS on the [Releases page][2]. If you \ndownload a release for Linux or macOS you will have to make it executable. \n\nAlternatively build from source using Go:\n\n```\n$ go get -u -v github.com/SeerUK/tid/...\n```\n\n## Usage\n\nFull usage information can be seen by using the built-in contextual help. This can accessed by\nrunning:\n\n```\n$ tid --help\n$ # Or for command help:\n$ tid start --help\n```\n\nTid has sub-commands in some places, for example:\n\n```\n$ tid entry create 1h10m \"Resolving live issue\"\n```\n\nAnd also has short aliases for some commands:\n\n```\n$ tid e c 1h10m \"Resolving live isssue\"\n```\n\nHere's some simple general usage:\n\n```\n$ tid start \"Working on AI\"\nStarted timer for 'Working on AI' (fdb6f0d)\n\n$ tid status\n+------------+---------+------------+------------+---------------+----------+---------+\n|    DATE    |  HASH   |  CREATED   |  UPDATED   |      NOTE     | DURATION | RUNNING |\n+------------+---------+------------+------------+---------------+----------+---------+\n| 2017-03-01 | fdb6f0d | 10:41:34AM | 10:41:34AM | Working on AI | 5s       | true    |\n+------------+---------+------------+------------+---------------+----------+---------+\n\n$ tid stop\nStopped timer for 'Working on AI' (fdb6f0d)\n\n# Gone for lunch...\n\n$ tid resume\nResumed timer for 'Working on AI' (fdb6f0d)\n\n# Forgot to add this!\n\n$ tid entry create 15m \"Afternoon nap\"\nCreated entry 'Afternoon nap' (3d77f69)\n\n$ tid report\nReport for 2017-03-01.\n\nTotal Duration: 2h34m37s\nEntry Count: 2\n\n+------------+---------+------------+-----------+-----------------+----------+---------+\n|    DATE    |  HASH   |  CREATED   |  UPDATED  |      NOTE       | DURATION | RUNNING |\n+------------+---------+------------+-----------+-----------------+----------+---------+\n| 2017-03-01 | fdb6f0d | 10:41:34AM | 1:01:03PM | Working on AI   | 2h19m37s | true    |\n+            +---------+------------+-----------+-----------------+----------+---------+\n|            | 3d77f69 | 1:26:30PM  | 1:26:30PM | Afternoon nap   | 15m0s    | false   |\n+------------+---------+------------+-----------+-----------------+----------+---------+\n```\n\n### Starting an Entry Timer `start`\n\n```\n$ tid start \"A note\"\n```\n\nThe note is required, but can by any string value. It's used so when you view the status or the\nreport you know what you've been tracking. Try make it something identifiable. Maybe this will just\nbe an issue ID from your issue tracker?\n\n### Stopping an Entry Timer `stop`\n\n```\n$ tid stop\n```\n\nStop always stops the currently active timer, if you don't have an active timer, it won't do\nanything.\n\n### Resuming an Entry Timer `resume|res`\n\n```\n$ tid resume\n$ tid resume fdb6f0d\n```\n\nThe resume command allows you to resume the most recently stopped entry, or a specific entry by\npassing in that entry's hash. If you don't have a most recently stopped entry then you would have to\npass in an entry hash to use resume (e.g. if you remove the entry being tracked).\n\n### Status of an Entry `status|st`\n\n```\n$ tid status\n$ tid status fdb6f0d\n$ tid status --format=\"{{.Duration}} on '{{.Note}}'\"\n```\n\nYou can view the status of the currently tracked entry (the most recently started or resumed entry)\nor you can view the status of a specific entry. The output is similar to the report output.\n\nThe `--format` option uses Go's `text/template` package, and is passed an [Entry][entry].\n\n### Report your Timesheet `report|rep`\n\n```\n$ tid report\n$ tid report --start=2017-02-01 --end=2017-02-28\n$ tid report --start=(tiddate --months=-6)\n$ tid report --no-summary\n$ tid report --format=\"{{.Hash}} {{.Note}}\" --no-summary\n```\n\nThe report command is quite powerful and gives you a lot of different ways to view timesheet data.\nBy default the output will display a summary, and a table of the entries. You can control the output\nby passing other options like `--format` which is useful for scripting.\n\nThe `--format` option uses Go's `text/template` package, and is passed an [Entry][entry].\n\n### Management Commands\n\n#### Entries `entry|e`\n\nSometimes you just forget to track something, and maybe it was a couple of days ago! Or maybe you\nrealised you've tracked some additional time by mistake. The entry management commands let you\ncreate new entries on the fly, or manage existing ones. There's also a listing that's similar to the\nreport view, but without the summary.\n\n##### Create `create|c`\n\n```\n$ tid entry create \u003cDURATION\u003e \u003cNOTE\u003e\n$ tid entry create 10m \"Hello, World\"\n$ tid e c 10m \"Hello, World\"\n```\n\n##### Delete `delete|d`\n\n```\n$ tid entry delete \u003cHASH\u003e\n$ tid entry delete c24543c\n$ tid e d c24543c\n```\n\n##### List `list|ls`\n\n```\n$ tid entry list [OPTIONS]\n$ tid entry list --start=(tiddate --days=-7) --end=(tiddate) --format=\"{{.Hash}}\"\n$ tid entry list --date=(tiddate --days=-7)\n$ tid e ls --date=(tiddate --days=-7)\n```\n\nThe `--format` option uses Go's `text/template` package, and is passed an [Entry][entry].\n\n##### Update `update|u`\n\n```\n$ tid entry update \u003cHASH\u003e [OPTIONS]\n$ tid entry update c24543c --duration=10m --note=\"More CMS work...\"\n$ tid entry update c24543c --offset=-2m12s\n$ tid e u c24543c --offset=-2m12s\n```\n\nThe `--duration` and `--offset` options are mutually exclusive. Offset accepts negative values for\nupdating the duration by the amount given.\n\n#### Timesheets\n\n##### Delete `delete|d`\n\n```\n$ tid timesheet delete \u003cDATE\u003e\n$ tid timesheet delete 2017-04-10\n$ tid t d 2017-04-10\n```\n\n##### List `list|ls`\n\n```\n$ tid timesheet list [OPTIONS]\n$ tid timesheet list --start=(tiddate --days=-7) --end=(tiddate) --format=\"{{.Hash}}\"\n$ tid timesheet list --date=(tiddate --days=-7)\n$ tid t ls --date=(tiddate --days=-7)\n```\n\nThe `--format` option uses Go's `text/template` package, and is passed an [Timesheet][timesheet].\n\n#### Workspaces\n\nWorkspaces are separate time-tracking environments designed to segregate unrelated work. You can\nchoose what that means, but one example could be tracking time for personal projects separately to\nwork projects.\n\n##### Create `create|c`\n\n```\n$ tid workspace create \u003cNAME\u003e\n$ tid workspace create freelance\n$ tid w c freelance\n```\n\n##### Delete `delete|d`\n\n```\n$ tid workspace delete \u003cNAME\u003e\n$ tid workspace delete freelance\n$ tid w d freelance\n```\n\nDeleting a workspace will remove all timesheets and entries within it. There's no recovery from this\nunless you've backed up your database.\n\n##### List `list|ls`\n\n```\n$ tid workspace list\n$ tid w ls\n```\n\nThe active workspace will be denoted with an asterisk (e.g. `default *`).\n\n##### Switch `switch|s`\n\n```\n$ tid workspace switch \u003cNAME\u003e\n$ tid workspace switch freelance\n$ tid w s freelance\n```\n\nSwitching workspace will first stop any running timers, meaning you don't have to worry about time\nwracking up because you've forgotten to stop then switch!\n\n## Extras\n\n### Completions\n\nCompletions are provided for Bash and Fish and are located with obvious names in the `extras/completions/`\ndirectory.\n\n### BitBar\n\nA [BitBar](https://github.com/matryer/bitbar) plugin is available (with installation instructions) in the\n`extras/bitbar` directory.\n\n## License\n\nMIT\n\n[1]: https://github.com/boltdb/bolt\n[2]: https://github.com/SeerUK/tid/releases\n\n[entry]: pkg/types/entry.go#L19\n[timesheet]: pkg/types/timesheet.go#L13\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseeruk%2Ftid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseeruk%2Ftid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseeruk%2Ftid/lists"}