One command to set GitHub repo topics, description and homepage with stack presets
Project description
repometa
One command to stamp a GitHub repo with topics, a description and a homepage. No more clicking topics in one by one, no more gluing a giant gh repo edit --add-topic ... --add-topic ... by hand. Presets cover the stacks you reach for every week.
repometa apply --repo tantaneity/repometa --preset fastapi
repometa apply --repo owner/name --topics python,docker --desc "tiny cli"
repometa preset list
Why
I spin up a repo roughly once a week and my hands keep doing the same dance: same topic set per stack, same description shape, sometimes a homepage link. So this just does it in one shot, and the topics stay in sync across similar projects.
Install
uv pulls straight from the repo into an isolated tool venv and drops the command on your PATH:
uv tool install git+https://github.com/tantaneity/repometa
A push to the repo is the "release". Nothing to build, no token to juggle.
Auth
The CLI needs a GitHub token with repo scope (a fine-grained token with Administration write works too). It looks in two places, in order:
GITHUB_TOKEN, from the environment or a local.envgit credential fillforgithub.com, if you are already signed in to git
So if git already knows your GitHub login, you usually need to set nothing. Otherwise drop a token in .env (see .env.example) or export it.
gh is never required, which matters on Windows where it may not sit on PATH.
Usage
apply is the workhorse:
--repo -r Target as owner/name (required)
--preset -p Named topic set to apply
--topics -t Extra topics, comma-separated
--desc -d Repository description
--homepage Homepage URL
Preset and extra topics merge, then dedupe:
repometa apply -r owner/name -p fastapi -t auth,redis
That sends fastapi, python, sqlalchemy, alembic, docker, async, auth, redis. Topics get lowercased and validated before anything hits the API (GitHub only allows lowercase letters, digits and hyphens, up to 50 chars, up to 20 per repo). Leave out --preset and --topics and existing topics stay untouched, only the metadata you pass gets written.
Presets
Built in:
fastapi→ fastapi, python, sqlalchemy, alembic, docker, asyncnestjs→ nestjs, typescript, nodejs, postgresql, dockerunity→ unity, csharp, gamedevreact→ react, typescript, frontend, vite
List everything (built-ins plus yours):
repometa preset list
Your own presets
Drop a presets.toml at ~/.config/repometa/presets.toml. Same name as a built-in overrides it.
[presets]
go = ["go", "golang", "backend"]
django = ["django", "python", "postgresql", "celery"]
How it talks to GitHub
Topics ride their own endpoint, PUT /repos/{owner}/{repo}/topics. Description and homepage go through PATCH /repos/{owner}/{repo}. They are separate calls because topics never travel through the PATCH body.
Develop
uv sync
uv run pytest
Publish to PyPI (optional)
Tag a version and an Action publishes it through Trusted Publishing (OIDC, no long-lived token):
git tag v0.1.0
git push --tags
Set up the pending publisher on PyPI first and add a pypi environment in the repo settings. The workflow lives in .github/workflows/publish.yml.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file repometa-0.1.0.tar.gz.
File metadata
- Download URL: repometa-0.1.0.tar.gz
- Upload date:
- Size: 23.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
019d9082362941e290445e15a0d7070f5cd59c7bf7900b8b068e899246a95aae
|
|
| MD5 |
164ecb7b49481ea3709ef6d534aa1d50
|
|
| BLAKE2b-256 |
e650b2f0475ebe750cf3bf7d97d30655d15faf9295702cb7914e22c3bf7ad300
|
File details
Details for the file repometa-0.1.0-py3-none-any.whl.
File metadata
- Download URL: repometa-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be6d3abe2f7ab6ecb4d9c9901678f2502aa32392a498561bc6e99a29abf29930
|
|
| MD5 |
47d9863e00f25914b2bedc7426076f09
|
|
| BLAKE2b-256 |
be5938df925b3a7adf641833c9e30064270e35e2689de094f044a489cac2b3ab
|