Tarnished CLI
Command-line interface for Tarnished, version 0.3.12. Use a matching Tarnished backend.
Documentation: https://markoonakic.github.io/tarnished/
For the user-facing CLI guide, see:
Install
Install version 0.3.12 from PyPI once that release is available:
uv tool install tarnished-cli==0.3.12
To install this checkout, including before a release is published, run from the repository root:
uv tool install ./cli
Homebrew convenience path (the tap can lag the PyPI release):
brew tap markoonakic/tap
brew install tarnished-cli
To install a downloaded wheel:
uv tool install ./dist/tarnished_cli-<version>-py3-none-any.whl
Authentication
Tarnished CLI is API-key-first.
- Create or rotate the API key in the Tarnished web app.
- Prefer the CLI preset so the key includes the scopes the CLI expects.
- Validate and store the key locally:
tarnished auth init --api-key '...'
- Run the auth doctor to confirm the stored key, live auth check, and required CLI scopes all pass:
tarnished auth doctor
tarnished auth whoami
- Clear the locally stored key when needed:
tarnished auth api-key clear
The web app remains the source of truth for API keys. The CLI does not create, rotate, revoke, or otherwise manage remote API keys.
The CLI uses the system keyring when available. Otherwise, it stores the key in
a private file in the CLI config directory. TARNISHED_API_KEY overrides stored
credentials. Clearing a stored key does not unset this environment variable.
Usage
Global options go before the command:
tarnished --base-url https://tarnished.example.com auth status
tarnished --profile work --json applications list
tarnished applications --help
Create config.json in ~/.config/tarnished (or
$XDG_CONFIG_HOME/tarnished) to set profiles:
{
"default_profile": "default",
"profiles": {
"default": { "base_url": "http://127.0.0.1:5577", "output": "json" },
"work": { "base_url": "https://tarnished.example.com", "output": "json" }
}
}
--config-dir and TARNISHED_CONFIG_DIR override this directory. Server URL
precedence is --base-url, then TARNISHED_BASE_URL, then the selected profile.
Use a trusted server: URL overrides send the selected profile's key to that server.
The CLI follows same-origin redirects but rejects cross-origin or
credential-bearing URLs. Use the final server URL where possible.
JSON is the default output. Set the profile's output to text or use
TARNISHED_OUTPUT=text for text output; --json overrides both. API and local
configuration errors exit with code 1. JSON errors go to stdout; text errors go
to stderr. Invalid command arguments use Typer's standard error output.
Imports, reports, and transcriptions support --wait, --poll-interval, and
--timeout-seconds. A local wait timeout does not cancel server work. Report
waits stop if another job replaces the submitted job. Review the saved state
before retrying an AI or speech request, which can incur provider charges.
Development
cd cli
uv sync
uv run tarnished --help
uv run pytest -q
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv build
Release
The repository release workflow builds CLI distributions, uploads them to the
GitHub release, and publishes the CLI to PyPI by default. Homebrew tap updates
run in the separate homebrew-tap.yml workflow after Homebrew's 24-hour PyPI
resource-resolution cooldown window has elapsed.
One-Time PyPI Trusted Publishing Setup
- Create the
tarnished-cliproject on PyPI. - In the PyPI project settings, add a Trusted Publisher for this GitHub repository.
- Use these values:
- Owner:
markoonakic - Repository:
tarnished - Workflow name:
release.yml - Environment name:
pypi
- Owner:
One-Time Homebrew Tap Automation Setup
- Create a write-enabled deploy key for
markoonakic/homebrew-tap. - Add the private key to this repository as the
HOMEBREW_TAP_DEPLOY_KEYsecret. - The dedicated
homebrew-tap.ymlworkflow will:- wait until the target PyPI release is older than Homebrew's 24-hour Python resource cooldown window
- update
Formula/tarnished-cli.rbfrom PyPI metadata - refresh Python resource blocks with
brew update-python-resources - build the formula from source and run
brew test tarnished-cli - push the tap update to
markoonakic/homebrew-tap
Why separate from the main release workflow?
- Homebrew's Python dependency resolver intentionally excludes PyPI uploads from the last 24 hours when refreshing resource blocks.
- Keeping tap sync separate avoids false-negative release failures while still following Homebrew's documented Python-formula workflow.
Release Outputs
release.yml publishes:
cli/dist/*.whlcli/dist/*.tar.gz
to the GitHub release and publishes the package to PyPI.
homebrew-tap.yml then updates the Homebrew tap separately once the published
sdist is old enough for brew update-python-resources to resolve safely.
License
MIT. The wheel and source distribution include the LICENSE file.
Metadata
Release files for tarnished-cli 0.3.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tarnished_cli-0.3.12.tar.gz | 79.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tarnished_cli-0.3.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 120.1 kB
Release files / tarnished_cli-0.3.12.tar.gz
| Download URL | tarnished_cli-0.3.12.tar.gz |
|---|---|
| Size | 79.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
be0184a62c2edfaa006b5bb68f304a24f7abd29804622148f9db2332c6676dc8
|
|
BLAKE2b-256 checksum How to use checksums |
a9e8ad72bb64e6806f20c5e498aba8c5a683ec5904bc1d7782e44001dc15047b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / tarnished_cli-0.3.12-py3-none-any.whl
| Download URL | tarnished_cli-0.3.12-py3-none-any.whl |
|---|---|
| Size | 40.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e4de55ac2ef05aaf47bfb61f051b34f841fa0efa7bb00b88e96d702e84314cd8
|
|
BLAKE2b-256 checksum How to use checksums |
0c02ae1733683c7de2022e6ef0dc82733a2f8e5364c1039d2600e998619c747d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency log