Skip to content

Commit 0d211b6

Browse files
committed
docs: rewrite README for a real release - user-facing, not implementation-facing
Rewritten from a development-log style (explaining Textual internals, threading decisions, confirmation trails for every design choice) to a straightforward pitch for someone deciding whether to install this: what it does, why it's useful, how to use it. No more "Textual's own built-in X" framing anywhere - what matters to a user is that F1 opens a help panel and Ctrl+P opens a searchable command palette, not what they're built with. Added a new "Why this is worth having" section with concrete debugging scenarios (seeing which skill actually answered a question and which gave up, catching vocabulary gaps live, understanding fallback behavior, checking pipeline order, restarting a stuck service) - the kind of real value this tool provides day to day, not just a feature list. Softened the top banner from "actively under development, expect frequent changes" to "actively maintained, stable core experience, solid replacement for the old CLI clients today" - this is genuinely usable now, not a preview. Kept as-is per explicit request: the "Why not just fix ovos-cli-client / neon-cli-client" section (still accurate and relevant), the ASCII layout diagram (renders everywhere, no image asset to maintain - happy to add a real screenshot alongside it if one gets provided, discussed but not something I can generate myself), the Docker/Podman section, and the Category/Tags footer. 259 -> 128 lines. Verified the new content is correctly embedded as the PyPI long_description via a real sdist->wheel build. No code changes.
1 parent e735518 commit 0d211b6

1 file changed

Lines changed: 46 additions & 177 deletions

File tree

README.md

Lines changed: 46 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
# ovos-tui-client
22

3-
**🚧 Actively under development - expect frequent changes.** This is a
4-
young project with ongoing design iteration (see git history/tags for
5-
the pace of change); pin a specific version if you need stability, or
6-
just `pip install --upgrade` regularly to stay current.
3+
A split-pane terminal UI for talking to and debugging [OpenVoiceOS](https://www.openvoiceos.org/) without a microphone or speaker - type what you'd say, read what OVOS says back, and watch exactly what's happening on the message bus while it happens.
74

8-
A split-pane terminal UI for testing OVOS without a mic/speaker - a
9-
lightweight replacement for the unmaintained `ovos-cli-client` and the
10-
broken `neon-cli-client` (whose `pyyaml~=5.4` dependency fails to build
11-
on modern Python/setuptools).
5+
Actively maintained. The core experience is stable today and it's a solid, working replacement for the old CLI clients - see the [comparison](#why-not-just-fix-ovos-cli-client--neon-cli-client) below. It'll keep picking up refinements and fixes, but you don't need to wait for a "1.0" to get real use out of it.
126

137
[![Tests](https://github.com/andlo/ovos-tui-client/actions/workflows/test.yml/badge.svg)](https://github.com/andlo/ovos-tui-client/actions/workflows/test.yml)
148
[![PyPI version](https://img.shields.io/pypi/v/ovos-tui-client.svg)](https://pypi.org/project/ovos-tui-client/)
159
[![ovos-cli-client](https://img.shields.io/pypi/v/ovos-cli-client.svg?label=ovos-cli-client)](https://pypi.org/project/ovos-cli-client/)
1610

17-
## Layout
11+
## What it looks like
1812

1913
```
2014
┌──────────────────────────────────────────┐
@@ -33,137 +27,27 @@ on modern Python/setuptools).
3327
└──────────────────────────────────────────┘
3428
```
3529

36-
- **Logs**: tails every recognized OVOS service log file it finds
37-
(`bus.log`, `skills.log`, `audio.log`/`media.log`, `voice.log`,
38-
`gui.log`, `enclosure.log`, `phal.log`), each with its own color.
39-
OVOS's own `TIMESTAMP - COMPONENT - ` prefix is stripped, and every
40-
`[source]` tag is padded to the same width so message text lines up
41-
in one column. Lines containing `ERROR` are bolded. Scrolled-up panes
42-
(logs, conversation, activity) are never yanked back to the bottom by
43-
incoming content - auto-scroll only re-engages once you're back at
44-
the bottom yourself.
45-
- **Sources** and **Log Levels** (DEBUG/INFO/WARNING/ERROR/CRITICAL)
46-
are compact checkboxes directly in the main view, checked by
47-
default, no modal needed - each category on its own single line.
48-
- **Skills:** - click it, or press Enter when it's focused - opens the
49-
Command Palette, where "Log: Skill" filters the log display
50-
by skill_id (dynamically discovered the first time a skill_id is
51-
seen in the log text - best-effort, not every skill-related line
52-
mentions its own skill_id explicitly; unchecked by default, unlike
53-
Sources/Levels, since this list is open-ended rather than short and
54-
fixed). No modal for this anymore - see the Command Palette section
55-
below.
30+
Four panes at once: raw logs, a normal back-and-forth conversation, a live simplified feed of what's happening behind the scenes, and a text input that stands in for your voice. Everything updates in real time as OVOS processes what you type.
5631

57-
**Filter semantics:** an unchecked box does NOT mean "hidden" - it
58-
means "not specifically filtered to". With nothing checked in a
59-
category, nothing in that category is restricted and everything
60-
shows. Checking one or more boxes restricts that category to only
61-
the checked ones - independently per category, applying
62-
retroactively to already-received lines too, same as the free-text
63-
filter. Choices persist across sessions (`~/.config/ovos-tui-client/
64-
state.json`), saved on quit.
65-
- **F1**: toggles Textual's own built-in help panel - a genuine side
66-
panel docked to the right, not a popup - combining this project's
67-
own explanatory text (filter semantics, scroll behavior, the
68-
no-popup-windows design) with a live, always-accurate list of every
69-
current keybinding. No custom-built help screen to maintain
70-
separately and let go stale. **F5-F8**: jump focus straight to
71-
Logs / Conversation / Activity / the utterance input. There's no
72-
F2/Services, F3/Skills, or F4/Skill-filter shortcut anymore -
73-
service management, installed-skill listing/activation, AND the
74-
log-display skill filter all moved entirely into the Command
75-
Palette (below), with results written to the **conversation pane**
76-
(dim/grey text) instead of a popup - this tool avoids modal windows
77-
wherever an action doesn't inherently need its own screen.
78-
- **Ctrl+P**: Textual's command palette - meant as a way to talk to/
79-
control OVOS directly ("bagom"/behind the scenes), not just a
80-
launcher for this tool's own popup screens. Every F1/F5-F8 action is
81-
there too, fuzzy-searchable, but it also goes further. The palette
82-
itself has no native grouping/submenus (confirmed - it's a flat
83-
fuzzy-matched list in every command-palette implementation, not just
84-
Textual's), so related commands share a literal prefix instead, so
85-
typing that prefix clusters them together - and every action below
86-
runs immediately, filtered in place as you type, with its result
87-
written to the conversation pane - **no popup windows**:
88-
- **`Log: `** - toggle any source/level/skill directly, e.g. "Log:
89-
Source: skills", "Log: Level: ERROR", "Log:
90-
Skill: ovos-skill-horoscope..." - same effect as clicking the
91-
checkbox, without leaving the palette. Once at least one skill_id
92-
has been seen, "Log: Select all skills" / "Log: Deselect all
93-
skills" are also available for bulk toggling.
94-
- **`Service: `** - "Service: Restart ovos-core.service", "Service:
95-
Stop ...", "Service: Start ..." - one hit per discovered
96-
`ovos-*.service` unit, but **only for actions that make sense for
97-
its current state**: a running service offers Stop/Restart but
98-
not Start; a stopped one offers only Start (determined from
99-
`systemctl`'s own ACTIVE column). Fuzzy-matched as you type (e.g.
100-
"restart co" narrows straight to `ovos-core.service`). Selecting
101-
one runs it immediately; the result ("ovos-core.service:
102-
restarted", or the failure reason) appears in the conversation
103-
pane.
104-
- **`Skill: `** - one entry per known skill, current state shown in
105-
the title - "Skill: skill_id (Active)" or "Skill: skill_id
106-
(Inactive)" - selecting it toggles (Deactivate if currently
107-
Active, Activate if currently Inactive), same "state in title,
108-
selecting toggles" convention as `Log:` above. An unknown state
109-
shows both Activate and Deactivate explicitly instead, since
110-
there's no current state to toggle from. The list is populated
111-
once at startup via the bus (`skillmanager.list` - confirmed
112-
directly against a live OVOS instance that its response really
113-
does carry per-skill active state, not just names), not refetched
114-
per keystroke. Fire-and-forget (see `bus.py`'s honesty note on
115-
`activate_skill()`/`deactivate_skill()` - based on the documented
116-
mycroft-core convention) - the conversation-pane line confirms the
117-
request was *sent*, not that OVOS applied it; the local cache
118-
updates optimistically so the next search reflects the change
119-
immediately. No separate "list installed skills" command anymore -
120-
typing "skill" already shows every one of them.
121-
- **`Pipeline: `** - one entry per stage in `mycroft.conf`'s
122-
`intents.pipeline` array, numbered in order - "Pipeline: 1.
123-
stop_high", "Pipeline: 2. ovos-common-reading-pipeline-plugin",
124-
etc, via `ovos-config` (respects config layering). Read-only -
125-
pipeline order is static config, not something with a live bus
126-
toggle; selecting an entry just confirms which stage you found.
127-
- Textual's own default **"Screenshot"** and **"Keys"** commands are
128-
filtered out - Screenshot isn't useful for this tool; Keys is
129-
Textual's own default trigger for exactly the same show-help-panel
130-
action "Help: Toggle panel" already calls, so keeping both would
131-
just be two entries doing the same thing.
132-
**Tab/Shift+Tab**: cycle focus across everything (checkboxes, panes,
133-
input) - a Textual built-in, no custom code needed. **Escape**:
134-
closes whatever modal is open. Every palette entry is a single line
135-
- no separate description text underneath; where a command has
136-
state worth showing (checked/unchecked, active/inactive), it's
137-
embedded right in the title instead.
138-
- Typing a plain character while focus is on Logs/Conversation/
139-
Activity (none of which are normally typable) redirects that
140-
keystroke to the utterance input instead of doing nothing - almost
141-
always what was actually meant.
142-
- **Conversation**: what you typed (green), what OVOS said back
143-
(blue), and dim/grey status lines for everything above (startup
144-
connection info, service actions, skill list/activate/deactivate
145-
results) - distinct styling so status lines don't compete for
146-
attention with the actual conversation. Startup itself narrates as
147-
a compact boot sequence - version number, which log sources were
148-
found, a "Services:" block listing each `ovos-*.service` unit and
149-
whether it's Active/Inactive, and a skill count split into
150-
active/inactive - ending in "OK ready." only once both of the
151-
async/background startup steps (service-state check, skill lookup)
152-
have genuinely finished, not just been kicked off, so it doesn't
153-
appear before its own result does. The UI itself is
154-
interactive from the moment those steps are kicked off, not after -
155-
the service-state check in particular runs on a background thread
156-
precisely so a slow `systemctl` call can never freeze the whole app.
157-
- **Activity**: a curated, simplified feed of what's happening on the
158-
bus right now - which skill is handling the request, wake word/
159-
speech start-stop, global stop, which fallback skill handled a
160-
genuinely unrecognized utterance (and whether it actually resolved
161-
anything - "could not resolve" for the common "sorry, I don't
162-
understand" case), and for `ovos.common_reading.*` traffic
163-
specifically, which providers answered, at what confidence, and
164-
whether content fetch succeeded.
165-
- **Input**: type what you'd say to OVOS, press Enter. Up/Down arrows
166-
browse previously submitted utterances, shell-history style.
32+
## What it does
33+
34+
- **Logs** - tails every OVOS service log it can find (bus, skills, audio, voice, GUI, PHAL, etc), color-coded by source, timestamps stripped for readability, errors bolded. Filter by source, log level, free text, or a specific skill - any combination, live, without restarting anything (with nothing checked in a category everything shows; checking one or more narrows to just those). Scroll up to read something and new lines won't yank you back down.
35+
- **Conversation** - what you typed and what OVOS said back, plus quiet status lines for everything else this tool does (service restarts, skill toggles, startup info) kept visually distinct so they don't clutter the actual conversation.
36+
- **Activity** - a simplified, human-readable feed of what's happening on the bus right now: which skill is handling the request, wake word and speech start/stop, which fallback skill caught something nothing else understood (and whether it actually resolved anything), and for content-reading requests specifically, which providers answered and at what confidence.
37+
- **A searchable command palette** (`Ctrl+P`) for everything else - restart a stuck service, activate or deactivate a skill, check the intent pipeline order, or toggle any log filter - all searchable by typing, with results appearing right in the conversation pane instead of popup windows. A help panel (`F1`) covers the rest of the keybindings.
38+
- Type what you'd say and press Enter, same as talking to a real OVOS device. Up/Down arrows browse what you've typed before, like shell history.
39+
40+
## Why this is worth having
41+
42+
Testing OVOS by voice means dealing with wake-word misfires, STT mistakes, and no visibility into *why* something did or didn't happen. Typing directly and watching the activity feed skips all of that - and makes some genuinely hard-to-see things visible:
43+
44+
- **See which skill actually answered - and which ones tried and gave up.** Ask a factual question and watch each candidate skill respond in real time, including the ones that came back empty - useful for figuring out why you got a weird or unhelpful answer instead of a good one.
45+
- **Catch vocabulary gaps as you find them.** Type a phrasing you'd expect to work; if nothing responds, or the wrong skill claims it, that's immediately visible instead of a silent failure you'd only notice by accident.
46+
- **Understand fallback behavior.** When nothing matches normally, OVOS asks a chain of fallback skills whether they can help - the activity feed shows exactly which one stepped in, and whether it actually resolved anything or just apologized.
47+
- **Check the intent pipeline order without digging through config files.** Search "pipeline" in the command palette to see every matching stage in the exact order OVOS evaluates them.
48+
- **Restart a stuck service in two keystrokes**, without switching to another terminal.
49+
50+
None of this requires working audio hardware, a wake word, or STT accuracy getting in the way - just type.
16751

16852
## Install
16953

@@ -187,45 +71,31 @@ ovos-tui --host 192.168.1.50 --port 8181 --lang da-dk --log-dir ~/.local/state/m
18771
known candidate paths (which vary by OVOS install method). If nothing
18872
is found, the logs pane says so - pass this to point at the right
18973
directory explicitly.
190-
- `--mycroft-conf`: path to a specific `mycroft.conf` for the `Pipeline: `
191-
palette entries to read. Only needed on Docker/Podman installs
192-
(`ovos-installer`'s "containers" method, or `ovos-docker` directly) -
193-
confirmed via `ovos-docker`'s own compose files that the real, live
194-
config commonly lives at a host path like `~/ovos/config/mycroft.conf`
195-
(configurable per-install), not the standard
196-
`~/.config/mycroft/mycroft.conf` `ovos-config` looks for by default.
197-
Without this, `Pipeline: ` may read the wrong file or find nothing on
198-
a Docker install - it won't crash, but it won't be accurate either.
199-
This direct-read path tolerates the same JSON5-style `//` comments a
200-
real `mycroft.conf` has, but skips `ovos-config`'s own config-layering
201-
(system/user/web-cache merge) - a reasonable trade-off for a quick
202-
lookup.
74+
- `--mycroft-conf`: path to a specific `mycroft.conf` for the pipeline
75+
view in the command palette to read. Only needed on Docker/Podman
76+
installs (see below) - without it, the pipeline view may read the
77+
wrong file or find nothing on those installs. It won't crash, but it
78+
won't be accurate either.
20379

20480
### Docker/Podman installs
20581

206-
`ovos-tui-client` itself runs on the host, not inside the same
207-
containers, so a few things behave differently on a Docker/Podman
208-
install (confirmed against `ovos-docker`'s own documentation and a
209-
locally-run container, not just inferred):
210-
211-
- **Logs**: usually fine without any extra flags - `ovos-docker`
212-
installs commonly volume-mount the same conventional
213-
`~/.local/state/mycroft` path this tool already checks first, and
214-
the official `ovos-logs` debugging tool relies on that same
215-
assumption. If the install was configured with `"logs": {"path":
216-
"stdout"}` (a documented `ovos-docker` recommendation for
217-
container-log-based debugging) instead, there are no log FILES at
218-
all - this tool will correctly report "no logs found", and
219-
`docker compose logs` / `docker logs <container>` are the right
220-
tools for that case instead.
221-
- **Services**: `systemctl --user` genuinely has nothing to find,
222-
since OVOS runs as containers, not systemd units, in this mode. The
223-
boot sequence detects this (checking `docker ps` / `podman ps` for
224-
OVOS-named containers) and says so explicitly rather than showing a
225-
bare, unexplained "none found" - but starting/stopping/restarting a
226-
container from here isn't supported yet (see the open issue for
227-
this).
228-
- **Pipeline**: see `--mycroft-conf` above.
82+
This tool runs on the host, not inside the same containers OVOS runs
83+
in, so a couple of things need extra attention on a Docker/Podman
84+
install:
85+
86+
- **Logs** usually work without any extra flags - the common volume
87+
mount convention lines up with what this tool already looks for
88+
first. If the install is configured to send logs to the container's
89+
own stdout instead of a file (a documented option for
90+
container-log-based debugging), there are no log files to find at
91+
all - this tool will say so clearly, and `docker logs`/`docker
92+
compose logs` are the right tool for that case instead.
93+
- **Services** run as containers, not background services this tool
94+
can query the usual way - it detects this and says so explicitly,
95+
listing the running containers, rather than just showing an
96+
unexplained empty result. Restarting a container from here isn't
97+
supported yet.
98+
- **Pipeline** - see `--mycroft-conf` above.
22999

230100
## Why not just fix ovos-cli-client / neon-cli-client?
231101

@@ -242,8 +112,7 @@ version with no prebuilt wheel for modern Python and a build script
242112
incompatible with current `setuptools` (workaround: pin
243113
`setuptools<58` first).
244114

245-
Building this tool instead avoids both dependency chains (just
246-
`textual` + `ovos-bus-client`, both actively maintained), and adds
115+
Building this tool instead avoids both dependency chains, and adds
247116
genuinely useful features - toggleable/filterable logs, service
248117
restart, a simplified activity feed - neither of the above has.
249118

0 commit comments

Comments
 (0)