Terminal-native billable ledger for solo developers
Project description
TTD
Terminal-native billable ledger for solo developers who invoice by the hour.
Install
PyPI distribution: ttd-ledger. CLI command: ttd.
uv tool install ttd-ledger
ttd --help
One-off: uvx ttd-ledger.
Quick start (development)
just setup
prek run --all-files
uv run ttd
Development
| Command | Purpose |
|---|---|
just setup |
Install dependencies (uv sync) and git hooks (uv run prek install) |
uv sync |
Install dependencies only |
prek install |
Install git hooks only |
prek run --all-files |
Run all checks (same as CI) |
uv run ttd |
CLI (Rich tables; health check by default) |
just db-seed |
Seed local DB with demo clients, projects, and entries |
just release-smoke |
Build wheel/sdist and verify ttd from the artifact |
just release |
Full checks + smoke, then trigger GitHub Release workflow |
uv run ttd-api |
Litestar API (scaffold) |
uv run ttd-tui |
Textual TUI (scaffold) |
Release (maintainers)
One-time setup
-
PyPI project — Register ttd-ledger (name must match
project.nameinpyproject.toml). -
Trusted publishing — On that project: Publishing → Add a new pending publisher → GitHub:
Field Value Owner syn54xRepository ttdWorkflow name release.ymlEnvironment pypi -
GitHub environment — Repo Settings → Environments → create
pypi(no secrets required for OIDC). -
GitHub Pages — Settings → Pages → Source: GitHub Actions.
Pre-release check
just release-smoke
Builds the wheel/sdist and runs ttd --help from the artifact (same layout CI publishes).
Publish
-
Complete one-time setup above.
-
Merge to
mainwith conventional commits since the last tag. -
From a clean, pushed
main:just releaseRuns CI checks,
release-smoke, then triggers the Release workflow (cz bump, PyPI publish, GitHub Release, docs deploy).Watch progress:
gh run watch --workflow release.yml -
Smoke test after publish:
uvx ttd-ledger --help uv tool install ttd-ledger ttd
Roadmap
Milestone sequencing and v1 scope: docs/roadmap.md. Product direction: STRATEGY.md.
Architecture
ttd.core— async domain services and SQLite (ferro-orm)ttd.cli— cyclopts CLI adapterttd.api— Litestar API adapter (scaffold)ttd.tui— Textual TUI adapter (scaffold)
Domain logic lives only in ttd.core. Surfaces are thin adapters.
Project details
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 ttd_ledger-0.1.0.tar.gz.
File metadata
- Download URL: ttd_ledger-0.1.0.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a3c10af2622aeac31a1655823a6d810ee4c15c7f31602f03c67cc890f81becd
|
|
| MD5 |
801b450874bd20395ea6ed6d5282b1f7
|
|
| BLAKE2b-256 |
81658100515919114cc795e33aa6cd470e3f2153b49e89342c9375c0ff91bc65
|
Provenance
The following attestation bundles were made for ttd_ledger-0.1.0.tar.gz:
Publisher:
release.yml on syn54x/ttd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ttd_ledger-0.1.0.tar.gz -
Subject digest:
2a3c10af2622aeac31a1655823a6d810ee4c15c7f31602f03c67cc890f81becd - Sigstore transparency entry: 1630993577
- Sigstore integration time:
-
Permalink:
syn54x/ttd@dd7c8dc07da4142869e7ecd2e263e06afc6749fd -
Branch / Tag:
refs/heads/main - Owner: https://github.com/syn54x
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dd7c8dc07da4142869e7ecd2e263e06afc6749fd -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file ttd_ledger-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ttd_ledger-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae756f0555112e0d42348c77990882f3e7c2a35f5b5c60768b0af885143982b6
|
|
| MD5 |
db31f70f70b233a15b95e7f581a6034a
|
|
| BLAKE2b-256 |
48e0f3963d489dbccaff8ae5ba3848c7366a31b3f27b81900d1ce39e00cffdf3
|
Provenance
The following attestation bundles were made for ttd_ledger-0.1.0-py3-none-any.whl:
Publisher:
release.yml on syn54x/ttd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ttd_ledger-0.1.0-py3-none-any.whl -
Subject digest:
ae756f0555112e0d42348c77990882f3e7c2a35f5b5c60768b0af885143982b6 - Sigstore transparency entry: 1630993615
- Sigstore integration time:
-
Permalink:
syn54x/ttd@dd7c8dc07da4142869e7ecd2e263e06afc6749fd -
Branch / Tag:
refs/heads/main - Owner: https://github.com/syn54x
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dd7c8dc07da4142869e7ecd2e263e06afc6749fd -
Trigger Event:
workflow_dispatch
-
Statement type: