WARNING: This project is in an experimentation phase and is extremely unstable. As stable as a three-legged stool on a trampoline.
A terminal UI for Temporal -- like k9s for Kubernetes.
Connects directly to the Temporal frontend gRPC service (no UI Server dependency).
- Workflow Management - Browse, filter, search, cancel, terminate, signal workflows
- Schedule Management - View, pause/unpause, trigger, delete scheduled workflows
- Task Queue Info - View pollers and worker info in workflow detail
- Deep Links - Navigate via
temporal:// URIs with namespace + filters
- List Filters - Visibility queries for workflows and schedules
- Vim-style Navigation - j/k, gg/G, Ctrl+D/U, and more
- Real-time Updates - Automatic polling with smart refresh
- Namespace Switching - Easily switch between Temporal namespaces
- Cloud + Local - Supports Temporal Cloud (API key + TLS), mTLS, and local dev server
- Rust toolchain (cargo)
- Temporal server running (local or Cloud)
git submodule update --init
cargo build --release
# Local Temporal dev server (default: localhost:7233)
t9s
# Custom address and namespace
t9s --address localhost:7233 --namespace production
# Temporal Cloud
TEMPORAL_API_KEY=<key> t9s --address <ns>.tmprl.cloud:7233 --namespace <ns>
# mTLS
t9s --address temporal.example.com:7233 --tls-cert client.pem --tls-key client-key.pem
| Variable |
Description |
Default |
TEMPORAL_ADDRESS |
Temporal server host:port |
localhost:7233 |
TEMPORAL_NAMESPACE |
Default namespace |
default |
TEMPORAL_API_KEY |
API key for Temporal Cloud |
|
TEMPORAL_TLS_CERT |
Path to TLS client certificate |
|
TEMPORAL_TLS_KEY |
Path to TLS client key |
|
T9S_LOG_FILE |
Path to log file |
|
| Key |
Action |
j / Down |
Move down |
k / Up |
Move up |
gg |
Go to top |
G |
Go to bottom |
Ctrl+D |
Page down |
Ctrl+U |
Page up |
Enter |
Select / Open |
Esc |
Back / Cancel |
| Key |
Action |
1 |
Workflows |
2 |
Schedules |
: |
Command mode |
/ |
Search |
? |
Help |
q |
Quit |
| Command |
Action |
:wf |
Switch to workflows |
:sch |
Switch to schedules |
:ns <name> |
Switch namespace |
:signal <name> [json] |
Signal selected workflow |
:open <uri> |
Open a deep link URI |
:q |
Quit |
| Key |
Action |
c |
Cancel workflow |
t |
Terminate workflow |
h / l |
Switch detail tabs |
a |
Pending activities |
Ctrl+R |
Refresh |
| Key |
Action |
p |
Pause/unpause schedule |
T |
Trigger schedule |
d |
Delete schedule |
w |
Schedule workflows |
| Key |
Action |
h / l |
Switch tabs |
Tab / Shift+Tab |
Switch tabs |
Elm architecture (App/Action/Update/Effect) with Ratatui + Crossterm + Tonic gRPC.
UI is Kind-driven (collection/detail/operations) with deep-link navigation.
See:
ARCHITECTURE.md
docs/kind-generator.md
src/
├── main.rs # Entry point, render loop, effect dispatch
├── app.rs # App state, View/InputMode/Overlay enums, update()
├── action.rs # Action enum
├── event.rs # Terminal event handling, key-to-action mapping
├── worker.rs # Async gRPC dispatch via channels
├── config.rs # CLI args, env vars, TOML config
├── tui.rs # Terminal setup/teardown
├── client/ # Temporal gRPC client
│ ├── traits.rs # TemporalClient trait
│ └── grpc.rs # tonic-based implementation
├── domain/ # Domain types (Workflow, Schedule, Namespace, etc.)
├── kinds/ # Kind registry and capability specs
├── nav/ # Deep-link location parsing/formatting
├── widgets/ # Ratatui widgets (status bar, tables, overlays)
│ ├── collection.rs # Generic collection view
├── input/ # Command definitions and parsing
└── proto/ # Generated protobuf code