{"id":48294709,"url":"https://github.com/semrel-extra/tagtower","last_synced_at":"2026-04-04T23:30:18.263Z","repository":{"id":196188555,"uuid":"694156836","full_name":"semrel-extra/tagtower","owner":"semrel-extra","description":"Tag-driven git index","archived":false,"fork":false,"pushed_at":"2026-04-03T00:36:58.000Z","size":3820,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-03T10:45:43.086Z","etag":null,"topics":["git","tag"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/semrel-extra.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2023-09-20T12:47:17.000Z","updated_at":"2026-04-03T00:37:02.000Z","dependencies_parsed_at":"2024-01-31T09:57:45.631Z","dependency_job_id":"f4b15fc7-21ee-4114-b2d9-3e8285c83279","html_url":"https://github.com/semrel-extra/tagtower","commit_stats":null,"previous_names":["semrel-extra/tagtower"],"tags_count":7772,"template":false,"template_full_name":"antongolub/blank-ts","purl":"pkg:github/semrel-extra/tagtower","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semrel-extra%2Ftagtower","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semrel-extra%2Ftagtower/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semrel-extra%2Ftagtower/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semrel-extra%2Ftagtower/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semrel-extra","download_url":"https://codeload.github.com/semrel-extra/tagtower/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semrel-extra%2Ftagtower/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31419091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"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":["git","tag"],"created_at":"2026-04-04T23:30:13.697Z","updated_at":"2026-04-04T23:30:18.238Z","avatar_url":"https://github.com/semrel-extra.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tagtower\n[![Maintainability](https://api.codeclimate.com/v1/badges/88b8163c3bc008afafc1/maintainability)](https://codeclimate.com/github/semrel-extra/tagtower/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/88b8163c3bc008afafc1/test_coverage)](https://codeclimate.com/github/semrel-extra/tagtower/test_coverage)\n[![npm (tag)](https://img.shields.io/npm/v/tagtower)](https://www.npmjs.com/package/tagtower)\n\n\u003e Tag-driven git index\n\n## Motivation\nIt does not seem possible [to get commits info w/o repo cloning](https://stackoverflow.com/questions/20055398/is-it-possible-to-get-commit-logs-messages-of-a-remote-git-repo-without-git-clon). This limitation brings a significant performance impact on [conventional-commits](https://www.conventionalcommits.org/en/v1.0.0/) driven release flows (especially if [git notes](https://git-scm.com/docs/git-notes) API is not supported by VCS). But what if we'd have a side index with web-hooks triggers instead. Let's find out.\n\n_— Looks like a kv-storage based on git tags. This is madness._  \n_— True._\n\nAs a part of «how self-sufficient git is» research.\n\n## Install\n```sh\nyarn add tagtower\n```\n\n## Usage\n```ts\nimport {createTower} from 'tagtower'\n\nconst tower = createTower({\n  url:            'https://\u003ctoken\u003egithub.com/git/repo.git',\n  branch:         'tagtower',     // Branch for storing tags. Defaults to 'tagtower'\n  temp:           './temp',       // Dir to hold temporary git channels. Defaults to fs.mkdtemp(path.join(os.tmpdir(), 'tempy-tagtower-'))\n  committerName:  'Foo Bar',      // Username and email to sign annotaged git tags\n  committerEmail: 'foo@bar.baz',  // Defaults to Semrel Extra Bot \u003csemrel-extra-bot@hotmail.com\u003e\n  format:         v =\u003e v + '',    // Opt value formatter. Defaults to JSON.stringify\n  parse:          v =\u003e v,         // Opt parser. Defaults to JSON.parse\n  filter:         v =\u003e v % 2      // Opt low level filter (applied before parse). Defaults to () =\u003e true\n})\n\nconst id: string = 'some@tag'\nconst data: Record\u003cstring, any\u003e = {\n  hash:    '3f9f0a88b411a8932bce289a3dd498d70a4dc96c',\n  author:  'Anton Golub \u003cantongolub@antongolub.com\u003e',\n  message: 'feat: initial feat'\n}\n\nawait tower.create(id, data)      // stores entry to the specified remote\nawait tower.read(id)              // returns found TEntry | null\nawait tower.read()                // if tag is empty, returns TEntry[]\nawait tower.update(id, data)      // just a shortcut for delete \u0026 create\nawait tower.delete(id)            // void\n```\n\n## License\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemrel-extra%2Ftagtower","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemrel-extra%2Ftagtower","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemrel-extra%2Ftagtower/lists"}