odoo-activity
A terminal UI for Odoo instances, on this machine or on a remote host over
ssh. One screen: host cpu/mem/uptime, every Odoo instance (systemd --user
or supervisor) with its databases nested underneath, and a detail pane for
process/log/db inspection.
Installation
uv tool install odoo-activity
Usage
odoo-activity # or: oa — this machine
oa openerp@somehost # a remote host over ssh
oa openerp@somehost -p 10113 # ...on a non-default ssh port
Discovers Odoo instances under systemd --user, supervisor, and odoo.sh
(all three are merged), and needs the odoo-db CLI on PATH for the
database category tabs. The Config tab additionally needs odoo-config
and odoo-addons-path on PATH. See Managers for what each
one supports.
| Key | Action |
|---|---|
↑/↓ |
move through instances and their nested dbs |
s / r |
start/stop toggle / restart (confirm popup) |
[ / ] |
switch tab in the detail pane |
f |
maximize/minimize the focused pane |
p / l / c / t |
Top / Logs / Config / Toolbox |
u / l / j / c |
Users / Locks / Jobs / Crons |
K |
kill -9 the selected process (Top tab, confirm popup) |
L |
kill -3 the selected process, then jump to Stacks (Top tab) |
D |
dump stacks of all workers, then jump to Stacks |
S |
copy the instance's odoo shell launch command to the clipboard |
e |
cycle compact/explain/expand/clean (Config tab) |
| enter | run the selected tool (Toolbox tab, confirm popup) / open a row's raw json (db tabs) |
/ |
search (Logs and Config tabs) |
R |
refresh the active tab now |
q |
quit |
Two tabs on each side have no letter shortcut — cycle to them with
[/] or click: Processes and Stacks (instance mode), Queries
and Modules (database mode).
Toolbox (t) offers four tools:
- Spin a worker up (
SIGTTIN) or down (SIGTTOU). - Open shell — which copies the launch command instead of signaling, so it needs no confirm.
- Count sessions under the instance's data dir (walks the filesystem, may be slow).
Remote hosts
The target is any ssh destination — [user@]host or a ~/.ssh/config
alias. Only the tools already required locally are needed, but on the
remote host. Connections are multiplexed, so the first call opens the
session and the rest reuse it.
Everything still refreshes on its own against a remote host, just on a
slower tick — host stats and Top every 5s, the instance list every
15s. R refreshes the active tab immediately, plus the instance list and
the highlighted instance's databases.
MCP server
oa-mcp [host] exposes the same read-only data as an MCP server, for an
agent to work an investigation alongside a human on oa [host] — both
looking at the same target. Every tool call is pinned to host (local if
omitted); a host/ssh_port argument on a tool call must match the pin
or is rejected.
oa-mcp-multi instead leaves the target per-call, capped by
--host-filter (an odoo dbfilter-style regex; unset means unrestricted)
and --host-file (which ~/.ssh/config-style file reads aliases from).
Both default to the stdio transport (spawned by the MCP client); add
--transport streamable-http --bind-host ... --bind-port ... to run as a
network server instead.
Managers
An instance's manager — systemd, supervisor, or odoosh — is
discovered per instance, not configured, and decides which controller
process/log/start-stop-restart lookups route through:
systemd— asystemd --userunit, controlled viasystemctl --user.supervisor— asupervisorctl statusprogram, controlled viasupervisorctl.odoosh— the odoo.sh build a host is running, when odoo-activity itself runs directly on that host (installed viarequirements.txtat build time, same asodoo-config/odoo-db). One host is one build, so there's nothing to enumerate — the whole box is "the instance". Start/stop isn't supported (odoo.sh handles sleep/wake on its own); restart goes throughodoosh-restart, needed onPATH— which ships pre-installed on odoo.sh hosts.
Config tab modes
e cycles the Config tab through odoo-config's compact/explain/
expand/clean views of the highlighted instance's config file — see
odoo-config's CLI docs for what each one shows.
ODOO_ACTIVITY_DB_ROLE overrides the postgres role used to resolve an
instance's databases (default: the instance's db_user, falling back to
its name).
Architecture
odoo_activity/
├── host.py # local vs ssh command dispatch
├── probes.py # all system data: no Textual import, shared by the TUI and MCP server
├── mcp_server.py # oa-mcp / oa-mcp-multi: probes.py as a read-only MCP tool API
├── panes/detail.py # ActivityPane: the one stateful rendering widget
├── panes/processes.py # Processes tab: workers grouped by role
├── panes/stacks.py # Stacks tab: parsed dumpstacks, busy-first
└── tui.py # app shell: layout, list, timers, actions
host.py— aHostis this machine or an ssh destination. Every probe takes one and runs the same way against either, so nothing above this layer knows whether it is local or remote.probes.py— pure functions, no UI. Everysystemctl/supervisorctl/ps/psqlcall and/procread lives here, returning plain dicts/lists so it's testable without spinning up a screen. An instance's databases, logfile and top all resolve from one config: its<workdir>/config/{odoo.conf,server.conf}.mcp_server.py— thin@mcp.tool()wrappers overprobes.py, no logic of its own; the same data the TUI shows, for an agent instead of a human (see MCP server).panes/detail.py—ActivityPane, the one stateful render widget: a tab strip over a Log/DataTable/Tree, mode-switched by whatever's highlighted (see Modes below) — not a separate popup screen. Delegates the Processes and Stacks tab bodies topanes/processes.py/panes/stacks.py.tui.py— the shell only:compose()layout, the nested instances+dbsListView, focus/highlight wiring, refresh timers, start/stop/restart. Delegates rendering toActivityPane, data toprobes.py, confirm popups topanes/confirm.py'sConfirmScreen(shared withActivityPane, which also confirms mutating actions like Toolbox).
Modes
ActivityPane mode-switches on whatever's highlighted in the instances list:
- Instance mode — an instance row is highlighted. Tabs: Top, Processes, Stacks, Logs, Config, Toolbox.
- Database mode — one of its nested database rows is highlighted. Tabs: Queries, Users, Locks, Jobs, Crons, Modules.
Both modes share the same tab strip and Log/DataTable widgets (just a
_mode flag), and several letter-key shortcuts are reused across them for
whichever tab they map to in each (e.g. l is Logs in instance mode, Locks
in database mode).
Data sources
- Instances —
systemctl --user list-unitsandsupervisorctl status, merged by name. - Databases — each instance's
<workdir>/config/{odoo.conf,server.conf}gives a db role (orODOO_ACTIVITY_DB_ROLE);psqllists the databases owned by that role. - Top — the manager gives the instance's master pid (
systemctl ... -p MainPID/supervisorctl pid);ps -eo pid,ppid,user,%mem,argsis then walked down the ppid tree from there to find every worker. - Logs — the same config gives
logfile, tailed by reading backward in fixed-size chunks from the end so a multi-GB file costs a few reads, not a full scan. - Config — read-only:
odoo-config {compact,explain,expand,clean}is run against the instance's config file and its plain-text stdout is shown as-is; the version passed to it comes fromodoo-addons-path <workdir> --verbose --format json'sversionkey.
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 odoo_activity-0.12.2.tar.gz.
File metadata
- Download URL: odoo_activity-0.12.2.tar.gz
- Upload date:
- Size: 73.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff88e980db31a0411d92f220159b053a7ef5f48655a4896631fffb362f7c9ff6
|
|
| MD5 |
0723080b03cac44a10211d66702a25c9
|
|
| BLAKE2b-256 |
567b9c6cd48a7bcf1843f126534c402a16a2034b54865f199b2d1d71116a4a5c
|
Provenance
The following attestation bundles were made for odoo_activity-0.12.2.tar.gz:
Publisher:
release.yaml on trobz/odoo-activity
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
odoo_activity-0.12.2.tar.gz -
Subject digest:
ff88e980db31a0411d92f220159b053a7ef5f48655a4896631fffb362f7c9ff6 - Sigstore transparency entry: 2446641299
- Sigstore integration time:
-
Permalink:
trobz/odoo-activity@b603dd3c54e101bb713dbd751dde82ed39825d73 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/trobz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@b603dd3c54e101bb713dbd751dde82ed39825d73 -
Trigger Event:
push
-
Statement type:
File details
Details for the file odoo_activity-0.12.2-py3-none-any.whl.
File metadata
- Download URL: odoo_activity-0.12.2-py3-none-any.whl
- Upload date:
- Size: 76.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6601ed92cdbaaed7610ec2f8fc8adea3cf106192978bbf41195174d03011df1
|
|
| MD5 |
20e1e481e49fb31319156f60ad10ca5d
|
|
| BLAKE2b-256 |
ca8a1d4dc274023bce0d286f5beb9f896cac2a560653cc2178185be09daec7e9
|
Provenance
The following attestation bundles were made for odoo_activity-0.12.2-py3-none-any.whl:
Publisher:
release.yaml on trobz/odoo-activity
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
odoo_activity-0.12.2-py3-none-any.whl -
Subject digest:
b6601ed92cdbaaed7610ec2f8fc8adea3cf106192978bbf41195174d03011df1 - Sigstore transparency entry: 2446641446
- Sigstore integration time:
-
Permalink:
trobz/odoo-activity@b603dd3c54e101bb713dbd751dde82ed39825d73 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/trobz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@b603dd3c54e101bb713dbd751dde82ed39825d73 -
Trigger Event:
push
-
Statement type: