IOU CLI
As in I o(we) (yo)u 5€.
Shared expenses management tool that does not spy on you - the CLI interface.
Features
- transactions
- git-like creation and editing of transactions
- split types
equal,unequal,share,percentage,adjustment - transaction description
- setting the date on transactions
- multi-deposits
- listing and inspecting transactions
- deletion
- groups
- creation
- adding users
- adding system users
- payday transaction for settling up
- balance inspection
- instance/session switching
Upcoming
- transactions
- search by text, date and amount
- groups
- deletion
- import
- splitwise CSV format
- system users
- invites
- notifications
- notification client creation, deletion, inspection
- notification retrieval and read-receipt
Contributing
git clone ssh://git.notourserver.de:2222/iou/cli.git
cd cli
python -m venv --upgrade-deps .venv
source .venv/bin/activate{.fish} # omit depending on shell used
pip install -r requirements-uv.txt # install alternative package manager
uv sync --extra dev
iou --help
pre-commit install # sets up static type checking, linting, etc.
Run linting and tests:
pytest --cov-report term --cov-report html --cov-report=xml:pytest-cobertura.xml --cov=iou test
pre-commit run --all
You may want to build a python package and upload it using twine:
python -m build
twine upload --verbose --skip-existing dist/*
Examples
Login using an OIDC IdP used by the IOU server.
$ iou login http://localhost:8000
Not logged in!
Please visit https://auth.221b.uk/realms/221b/device, login and enter the following code.
User code: HLWB-SPOW
Request expires in 600s
Device code authorized.
Loading user profile...
Login successful!
$ iou session
Logged in as 37e282fa-5761-443c-bbde-f8f13bbb8084 at 'http://localhost:8000'
Session expires on '2025-06-15 10:54:06.859556' (in 13 days)
Retrieve the list of groups to get a group UUID.
$ iou groups list
Groups
------
90269a57-7c92-446e-b00a-ed6425a37430: test1
user2 (user2@example.de)
user1 (user1@example.de)
Alternatively create a new group.
$ iou groups create somegroup
Then begin to craft a new transaction, in a git-like style.
$ iou begin 90269a57-7c92-446e-b00a-ed6425a37430
Transaction started. Type 'iou t(ransaction) deposit' to add a deposit.
$ iou add sherlock
$ iou add moriarty
$ iou status
Per group balance
test-group (sherlock, moriarty): you are good
Total balance: you are good
---
Uncommitted transaction between sherlock, moriarty
Group: 90269a57-7c92-446e-b00a-ed6425a37430
Split type: None
Description:
Date: 2026-03-07 14:31:12
Users:
sherlock (e675c6ff-1a94-4751-bc6b-d64a165c8750)
moriarty (05025003-aa13-4d54-8904-fe7337ca25e2)
Deposits:
No deposits yet.
Adjustments:
No adjustments yet.
Split: you are good
$ iou split equal
$ iou deposit e675 20
$ iou describe "I owe you, sherlock"
$ iou status
Uncommitted transaction between sherlock, moriarty
Group: 90269a57-7c92-446e-b00a-ed6425a37430
Split type: equal
Description: I owe you, sherlock
Date: 2026-03-07 14:31:12
Users:
sherlock (e675c6ff-1a94-4751-bc6b-d64a165c8750)
moriarty (05025003-aa13-4d54-8904-fe7337ca25e2)
Deposits:
No deposits yet.
Adjustments:
No adjustments yet.
Split: you are owed 10€
$ iou commit # transaction is now closed and pushed to the server
$ iou status
Per group balance
test-group (sherlock, moriarty): you are owed 10€
Total balance: you are owed 10€
No transaction in progress.
Open an existing transaction for edit (find a transaction to edit via iou transactions list).
$ iou edit 9026 f825d150-51cb-4283-887e-86ad69f85965 # partial UUID is also allowed
Transaction opened for edit.
Metadata
Release files for iou-cli 0.3.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iou_cli-0.3.8-py3-none-any.whl | Python 3 | none | any | Details |
Release files / iou_cli-0.3.8-py3-none-any.whl
| Download URL | iou_cli-0.3.8-py3-none-any.whl |
|---|---|
| Size | 15.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f0d5fe3aff18085ec89593d144e807a8dfd20106cbdf4728e5620cfa0368357b
|
|
BLAKE2b-256 checksum How to use checksums |
99d46d2001935a23881370233366bfeb83a6240195f778555925e1b26cb49427
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|