lonoboard 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lonoboard-0.1.0/LICENSE +29 -0
- lonoboard-0.1.0/PKG-INFO +193 -0
- lonoboard-0.1.0/README.md +168 -0
- lonoboard-0.1.0/pyproject.toml +43 -0
- lonoboard-0.1.0/setup.cfg +4 -0
- lonoboard-0.1.0/src/lonoboard/__init__.py +3 -0
- lonoboard-0.1.0/src/lonoboard/__main__.py +3 -0
- lonoboard-0.1.0/src/lonoboard/board/__init__.py +2 -0
- lonoboard-0.1.0/src/lonoboard/board/hub.py +290 -0
- lonoboard-0.1.0/src/lonoboard/board/logo.py +109 -0
- lonoboard-0.1.0/src/lonoboard/board/model.py +48 -0
- lonoboard-0.1.0/src/lonoboard/board/render.py +335 -0
- lonoboard-0.1.0/src/lonoboard/board/screens.py +1080 -0
- lonoboard-0.1.0/src/lonoboard/board/session.py +655 -0
- lonoboard-0.1.0/src/lonoboard/board/telnet.py +154 -0
- lonoboard-0.1.0/src/lonoboard/cli.py +218 -0
- lonoboard-0.1.0/src/lonoboard/collector.py +400 -0
- lonoboard-0.1.0/src/lonoboard/config.py +181 -0
- lonoboard-0.1.0/src/lonoboard/demo.py +288 -0
- lonoboard-0.1.0/src/lonoboard/hardware.py +164 -0
- lonoboard-0.1.0/src/lonoboard/network.py +79 -0
- lonoboard-0.1.0/src/lonoboard/runtime.py +179 -0
- lonoboard-0.1.0/src/lonoboard/sources.py +330 -0
- lonoboard-0.1.0/src/lonoboard/static/fonts/LICENSE-CC-BY-SA-4.0.txt +428 -0
- lonoboard-0.1.0/src/lonoboard/static/fonts/PxPlus_IBM_VGA_8x16.ttf +0 -0
- lonoboard-0.1.0/src/lonoboard/static/fonts/PxPlus_IBM_VGA_9x16.ttf +0 -0
- lonoboard-0.1.0/src/lonoboard/static/terminal.html +297 -0
- lonoboard-0.1.0/src/lonoboard/usage.py +139 -0
- lonoboard-0.1.0/src/lonoboard/util.py +137 -0
- lonoboard-0.1.0/src/lonoboard/web.py +218 -0
- lonoboard-0.1.0/src/lonoboard.egg-info/PKG-INFO +193 -0
- lonoboard-0.1.0/src/lonoboard.egg-info/SOURCES.txt +40 -0
- lonoboard-0.1.0/src/lonoboard.egg-info/dependency_links.txt +1 -0
- lonoboard-0.1.0/src/lonoboard.egg-info/entry_points.txt +2 -0
- lonoboard-0.1.0/src/lonoboard.egg-info/top_level.txt +1 -0
- lonoboard-0.1.0/tests/test_board.py +182 -0
- lonoboard-0.1.0/tests/test_parsers.py +128 -0
- lonoboard-0.1.0/tests/test_render.py +98 -0
- lonoboard-0.1.0/tests/test_security.py +137 -0
- lonoboard-0.1.0/tests/test_servers.py +180 -0
- lonoboard-0.1.0/tests/test_sources.py +81 -0
- lonoboard-0.1.0/tests/test_usage.py +58 -0
lonoboard-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Zachary Taylor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
The fonts in src/lonoboard/static/fonts/ (PxPlus_IBM_VGA_8x16.ttf and
|
|
26
|
+
PxPlus_IBM_VGA_9x16.ttf) are from The Ultimate Oldschool PC Font Pack by VileR
|
|
27
|
+
(https://int10h.org/oldschool-pc-fonts/) and are licensed separately under the
|
|
28
|
+
Creative Commons Attribution-ShareAlike 4.0 International License; see
|
|
29
|
+
src/lonoboard/static/fonts/LICENSE-CC-BY-SA-4.0.txt.
|
lonoboard-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: lonoboard
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A live dashboard for the machines running your AI models, drawn like a 1990s ANSI BBS
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/ztaylor/lonoboard
|
|
7
|
+
Project-URL: Issues, https://github.com/ztaylor/lonoboard/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/ztaylor/lonoboard/blob/main/CHANGELOG.md
|
|
9
|
+
Keywords: bbs,ansi,ansi-art,telnet,llama.cpp,ollama,vllm,llm,dashboard,homelab
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Environment :: Web Environment
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Topic :: Terminals :: Telnet
|
|
19
|
+
Classifier: Topic :: System :: Monitoring
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
License-File: src/lonoboard/static/fonts/LICENSE-CC-BY-SA-4.0.txt
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# lonoboard
|
|
27
|
+
|
|
28
|
+
[](https://github.com/ztaylor/lonoboard/actions/workflows/ci.yml)
|
|
29
|
+
|
|
30
|
+
**A live dashboard for the machines running your AI models, drawn like a 1990s ANSI BBS.**
|
|
31
|
+
|
|
32
|
+
Telnet in, or open a browser, and you get a live board for that machine. It shows the models
|
|
33
|
+
it serves, their memory and GPU use, requests and tokens per second, an event log, and a chat
|
|
34
|
+
window for talking to the models. Everything is drawn in CP437 and the CGA palette, the way
|
|
35
|
+
ACiD and iCE drew it.
|
|
36
|
+
|
|
37
|
+
telnet gpu-box 2323 # any terminal; SyncTERM or NetRunner for the full effect
|
|
38
|
+
http://gpu-box:7777/ # the same board in a browser
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
It works with llama.cpp, Ollama, vLLM and any OpenAI-compatible server. It finds them on its
|
|
43
|
+
own, and you can also list them in a config file. It runs on NVIDIA, AMD, Apple Silicon or a
|
|
44
|
+
plain CPU. It's a single Python program with no dependencies.
|
|
45
|
+
|
|
46
|
+
## Try it
|
|
47
|
+
|
|
48
|
+
pipx install lonoboard
|
|
49
|
+
lonoboard demo # a simulated machine, with a fake chat
|
|
50
|
+
lonoboard check # what lonoboard finds on this machine
|
|
51
|
+
lonoboard # the real board, on localhost
|
|
52
|
+
|
|
53
|
+
Or try it without installing: `uvx lonoboard demo`.
|
|
54
|
+
|
|
55
|
+
Python 3.11 or newer. Then open <http://localhost:7777/> or run `telnet localhost 2323`.
|
|
56
|
+
|
|
57
|
+
<table>
|
|
58
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/main.png" alt="The main screen"></td>
|
|
59
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/services.png" alt="Services, with live details"></td></tr>
|
|
60
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/chat.png" alt="Chatting with a model"></td>
|
|
61
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/usage.png" alt="Requests per hour and the top 10"></td></tr>
|
|
62
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/fleet.png" alt="Viewing another machine in the fleet"></td>
|
|
63
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/amber.png" alt="Amber monochrome"></td></tr>
|
|
64
|
+
</table>
|
|
65
|
+
|
|
66
|
+
## The board
|
|
67
|
+
|
|
68
|
+
The board is made of **screens**, each sized to your window:
|
|
69
|
+
|
|
70
|
+
| key | screen | what's on it |
|
|
71
|
+
|-----|----------|--------------|
|
|
72
|
+
| `M` | main | logo, system stats, GPU memory by service, recent requests, the menu, the event log |
|
|
73
|
+
| `S` | services | every model server on a lightbar; on wide windows, slot activity and live details |
|
|
74
|
+
| `H` | host | system stats, memory, GPU, slot activity |
|
|
75
|
+
| `U` | usage | requests per hour over 24 h, and the top 10 by tokens today |
|
|
76
|
+
| `R` | requests | recent requests: tokens, tok/s, prompt size and speed |
|
|
77
|
+
| `E` | events | services coming and going, generations starting and finishing |
|
|
78
|
+
| `N` | network | each service's URLs and API endpoints, other published ports |
|
|
79
|
+
| `F` | fleet | other machines running lonoboard; pick one to view its board |
|
|
80
|
+
|
|
81
|
+
- **Moving around:**
|
|
82
|
+
- A letter jumps to a screen. `←` `→` flip between screens and `esc` goes back to main.
|
|
83
|
+
- `↑` `↓` move the lightbar, `enter` opens the selected item, and `1`–`9` open a service.
|
|
84
|
+
- A screen too tall for the window splits into pages. `space` reads on, `b` goes back.
|
|
85
|
+
- The mouse works: click entries, rows and links, and use the wheel to turn pages.
|
|
86
|
+
- **Details** (`enter` on a service): status, model, context, last request, memory, the systemd
|
|
87
|
+
unit or container, endpoints, launch flags, and a live tail of its log.
|
|
88
|
+
- **Chat** (`c`): talk to any chat model on the machine, and `tab` switches model. Replies
|
|
89
|
+
stream, reasoning collapses into a summary, and `esc` stops a reply. Conversations aren't
|
|
90
|
+
stored.
|
|
91
|
+
- **Display** (`d`):
|
|
92
|
+
- IBM VGA 8x16 or 9x16 font.
|
|
93
|
+
- VGA colour, amber or green monochrome.
|
|
94
|
+
- iCE colours or blink for bright backgrounds.
|
|
95
|
+
- CRT effect.
|
|
96
|
+
- `?` opens help. `q` quits a telnet session after asking first.
|
|
97
|
+
|
|
98
|
+
### Terminals
|
|
99
|
+
|
|
100
|
+
lonoboard negotiates echo, window size and terminal type, and adapts to what it finds:
|
|
101
|
+
|
|
102
|
+
| terminal | what lonoboard sends |
|
|
103
|
+
|----------|----------------|
|
|
104
|
+
| modern (xterm, kitty, ghostty, WezTerm, PuTTY…) | UTF-8, hyperlinks, mouse reporting and the alternate screen |
|
|
105
|
+
| anything else | classic CP437 ANSI-BBS with iCE colours |
|
|
106
|
+
|
|
107
|
+
Colour depth is chosen separately:
|
|
108
|
+
|
|
109
|
+
| terminal | colours |
|
|
110
|
+
|----------|---------|
|
|
111
|
+
| known to support 24-bit | exact VGA colours |
|
|
112
|
+
| `*-256color` | the nearest xterm-256 colours |
|
|
113
|
+
| everything else | the terminal's own 16 colours |
|
|
114
|
+
|
|
115
|
+
<img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/terminal.png" width="560" alt="The board in a classic 80x25 terminal">
|
|
116
|
+
|
|
117
|
+
In a telnet session, press `d` and then `m` to cycle the colour mode, or `u` to switch between
|
|
118
|
+
UTF-8 and CP437.
|
|
119
|
+
|
|
120
|
+
## Model servers
|
|
121
|
+
|
|
122
|
+
| server | found by | what lonoboard shows |
|
|
123
|
+
|--------|----------|----------------|
|
|
124
|
+
| llama.cpp | process or port | model, quant, params, context, slots and busy slots, per-request tok/s from its log |
|
|
125
|
+
| Ollama | process or port 11434 | installed and loaded models, VRAM, requests from its log |
|
|
126
|
+
| vLLM | `/metrics` | model, context, running requests, token counters |
|
|
127
|
+
| OpenAI-compatible (LM Studio, …) | port or config | models, health, chat; optional API key |
|
|
128
|
+
|
|
129
|
+
lonoboard finds the systemd unit or Docker container behind each server. That gives it state,
|
|
130
|
+
uptime, restarts and logs. See [docs/sources.md](https://github.com/ztaylor/lonoboard/blob/main/docs/sources.md) for details.
|
|
131
|
+
|
|
132
|
+
**Hardware:**
|
|
133
|
+
- **NVIDIA** via `nvidia-smi`, including unified-memory systems like the DGX Spark.
|
|
134
|
+
- **AMD** via `rocm-smi`.
|
|
135
|
+
- **Apple Silicon** via `ioreg`.
|
|
136
|
+
- **CPU-only.**
|
|
137
|
+
|
|
138
|
+
## Running it for real
|
|
139
|
+
|
|
140
|
+
lonoboard install --now # a systemd user service running `lonoboard serve`
|
|
141
|
+
|
|
142
|
+
The board listens on **localhost only** until you say otherwise. To reach it from elsewhere:
|
|
143
|
+
|
|
144
|
+
- **Tailscale** (recommended). Keep it on localhost and publish it with `tailscale serve`. lonoboard
|
|
145
|
+
then finds the other machines on your tailnet for the fleet screen.
|
|
146
|
+
- **Your LAN.** Set `listen` and a `password`. lonoboard won't listen beyond localhost or your
|
|
147
|
+
tailnet without one. The password is asked for at a login prompt in the terminal, and the
|
|
148
|
+
API takes it as a bearer token.
|
|
149
|
+
|
|
150
|
+
[SECURITY.md](https://github.com/ztaylor/lonoboard/blob/main/SECURITY.md) covers what the board shows and how it's protected.
|
|
151
|
+
|
|
152
|
+
See [docs/deployment.md](https://github.com/ztaylor/lonoboard/blob/main/docs/deployment.md) for systemd, Tailscale, Docker and deploying to
|
|
153
|
+
several machines over SSH, and [docs/public-demo.md](https://github.com/ztaylor/lonoboard/blob/main/docs/public-demo.md) for hosting a public
|
|
154
|
+
demo board.
|
|
155
|
+
|
|
156
|
+
## Configuration
|
|
157
|
+
|
|
158
|
+
Nothing needs configuring, but everything can be. Settings go in `~/.config/lonoboard/config.toml`,
|
|
159
|
+
or in a file named by `--config` or `$LONOBOARD_CONFIG`:
|
|
160
|
+
|
|
161
|
+
```toml
|
|
162
|
+
[board]
|
|
163
|
+
tagline = "the attic box"
|
|
164
|
+
|
|
165
|
+
[[server]]
|
|
166
|
+
name = "lmstudio"
|
|
167
|
+
url = "http://127.0.0.1:1234"
|
|
168
|
+
kind = "openai"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
[examples/config.toml](https://github.com/ztaylor/lonoboard/blob/main/examples/config.toml) lists every setting, and
|
|
172
|
+
[docs/configuration.md](https://github.com/ztaylor/lonoboard/blob/main/docs/configuration.md) explains them.
|
|
173
|
+
|
|
174
|
+
## JSON API
|
|
175
|
+
|
|
176
|
+
Anything that doesn't ask for HTML gets JSON:
|
|
177
|
+
|
|
178
|
+
curl localhost:7777/ # host, services, other ports, fleet
|
|
179
|
+
curl localhost:7777/api/usage # requests per hour, top 10
|
|
180
|
+
|
|
181
|
+
See [docs/api.md](https://github.com/ztaylor/lonoboard/blob/main/docs/api.md) for every endpoint.
|
|
182
|
+
|
|
183
|
+
## Credits
|
|
184
|
+
|
|
185
|
+
- The fonts are `PxPlus_IBM_VGA_8x16` and `PxPlus_IBM_VGA_9x16`, from
|
|
186
|
+
[The Ultimate Oldschool PC Font Pack](https://int10h.org/oldschool-pc-fonts/) by VileR. They
|
|
187
|
+
are licensed CC BY-SA 4.0 and bundled, so the board works offline.
|
|
188
|
+
- The look is inspired by the ANSI art groups of the 1990s: ACiD, iCE, Blocktronics and the
|
|
189
|
+
rest of the 16colo.rs archive.
|
|
190
|
+
|
|
191
|
+
## License
|
|
192
|
+
|
|
193
|
+
MIT, see [LICENSE](https://github.com/ztaylor/lonoboard/blob/main/LICENSE). The bundled fonts keep their CC BY-SA 4.0 license.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# lonoboard
|
|
2
|
+
|
|
3
|
+
[](https://github.com/ztaylor/lonoboard/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
**A live dashboard for the machines running your AI models, drawn like a 1990s ANSI BBS.**
|
|
6
|
+
|
|
7
|
+
Telnet in, or open a browser, and you get a live board for that machine. It shows the models
|
|
8
|
+
it serves, their memory and GPU use, requests and tokens per second, an event log, and a chat
|
|
9
|
+
window for talking to the models. Everything is drawn in CP437 and the CGA palette, the way
|
|
10
|
+
ACiD and iCE drew it.
|
|
11
|
+
|
|
12
|
+
telnet gpu-box 2323 # any terminal; SyncTERM or NetRunner for the full effect
|
|
13
|
+
http://gpu-box:7777/ # the same board in a browser
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
It works with llama.cpp, Ollama, vLLM and any OpenAI-compatible server. It finds them on its
|
|
18
|
+
own, and you can also list them in a config file. It runs on NVIDIA, AMD, Apple Silicon or a
|
|
19
|
+
plain CPU. It's a single Python program with no dependencies.
|
|
20
|
+
|
|
21
|
+
## Try it
|
|
22
|
+
|
|
23
|
+
pipx install lonoboard
|
|
24
|
+
lonoboard demo # a simulated machine, with a fake chat
|
|
25
|
+
lonoboard check # what lonoboard finds on this machine
|
|
26
|
+
lonoboard # the real board, on localhost
|
|
27
|
+
|
|
28
|
+
Or try it without installing: `uvx lonoboard demo`.
|
|
29
|
+
|
|
30
|
+
Python 3.11 or newer. Then open <http://localhost:7777/> or run `telnet localhost 2323`.
|
|
31
|
+
|
|
32
|
+
<table>
|
|
33
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/main.png" alt="The main screen"></td>
|
|
34
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/services.png" alt="Services, with live details"></td></tr>
|
|
35
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/chat.png" alt="Chatting with a model"></td>
|
|
36
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/usage.png" alt="Requests per hour and the top 10"></td></tr>
|
|
37
|
+
<tr><td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/fleet.png" alt="Viewing another machine in the fleet"></td>
|
|
38
|
+
<td><img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/amber.png" alt="Amber monochrome"></td></tr>
|
|
39
|
+
</table>
|
|
40
|
+
|
|
41
|
+
## The board
|
|
42
|
+
|
|
43
|
+
The board is made of **screens**, each sized to your window:
|
|
44
|
+
|
|
45
|
+
| key | screen | what's on it |
|
|
46
|
+
|-----|----------|--------------|
|
|
47
|
+
| `M` | main | logo, system stats, GPU memory by service, recent requests, the menu, the event log |
|
|
48
|
+
| `S` | services | every model server on a lightbar; on wide windows, slot activity and live details |
|
|
49
|
+
| `H` | host | system stats, memory, GPU, slot activity |
|
|
50
|
+
| `U` | usage | requests per hour over 24 h, and the top 10 by tokens today |
|
|
51
|
+
| `R` | requests | recent requests: tokens, tok/s, prompt size and speed |
|
|
52
|
+
| `E` | events | services coming and going, generations starting and finishing |
|
|
53
|
+
| `N` | network | each service's URLs and API endpoints, other published ports |
|
|
54
|
+
| `F` | fleet | other machines running lonoboard; pick one to view its board |
|
|
55
|
+
|
|
56
|
+
- **Moving around:**
|
|
57
|
+
- A letter jumps to a screen. `←` `→` flip between screens and `esc` goes back to main.
|
|
58
|
+
- `↑` `↓` move the lightbar, `enter` opens the selected item, and `1`–`9` open a service.
|
|
59
|
+
- A screen too tall for the window splits into pages. `space` reads on, `b` goes back.
|
|
60
|
+
- The mouse works: click entries, rows and links, and use the wheel to turn pages.
|
|
61
|
+
- **Details** (`enter` on a service): status, model, context, last request, memory, the systemd
|
|
62
|
+
unit or container, endpoints, launch flags, and a live tail of its log.
|
|
63
|
+
- **Chat** (`c`): talk to any chat model on the machine, and `tab` switches model. Replies
|
|
64
|
+
stream, reasoning collapses into a summary, and `esc` stops a reply. Conversations aren't
|
|
65
|
+
stored.
|
|
66
|
+
- **Display** (`d`):
|
|
67
|
+
- IBM VGA 8x16 or 9x16 font.
|
|
68
|
+
- VGA colour, amber or green monochrome.
|
|
69
|
+
- iCE colours or blink for bright backgrounds.
|
|
70
|
+
- CRT effect.
|
|
71
|
+
- `?` opens help. `q` quits a telnet session after asking first.
|
|
72
|
+
|
|
73
|
+
### Terminals
|
|
74
|
+
|
|
75
|
+
lonoboard negotiates echo, window size and terminal type, and adapts to what it finds:
|
|
76
|
+
|
|
77
|
+
| terminal | what lonoboard sends |
|
|
78
|
+
|----------|----------------|
|
|
79
|
+
| modern (xterm, kitty, ghostty, WezTerm, PuTTY…) | UTF-8, hyperlinks, mouse reporting and the alternate screen |
|
|
80
|
+
| anything else | classic CP437 ANSI-BBS with iCE colours |
|
|
81
|
+
|
|
82
|
+
Colour depth is chosen separately:
|
|
83
|
+
|
|
84
|
+
| terminal | colours |
|
|
85
|
+
|----------|---------|
|
|
86
|
+
| known to support 24-bit | exact VGA colours |
|
|
87
|
+
| `*-256color` | the nearest xterm-256 colours |
|
|
88
|
+
| everything else | the terminal's own 16 colours |
|
|
89
|
+
|
|
90
|
+
<img src="https://raw.githubusercontent.com/ztaylor/lonoboard/main/docs/media/terminal.png" width="560" alt="The board in a classic 80x25 terminal">
|
|
91
|
+
|
|
92
|
+
In a telnet session, press `d` and then `m` to cycle the colour mode, or `u` to switch between
|
|
93
|
+
UTF-8 and CP437.
|
|
94
|
+
|
|
95
|
+
## Model servers
|
|
96
|
+
|
|
97
|
+
| server | found by | what lonoboard shows |
|
|
98
|
+
|--------|----------|----------------|
|
|
99
|
+
| llama.cpp | process or port | model, quant, params, context, slots and busy slots, per-request tok/s from its log |
|
|
100
|
+
| Ollama | process or port 11434 | installed and loaded models, VRAM, requests from its log |
|
|
101
|
+
| vLLM | `/metrics` | model, context, running requests, token counters |
|
|
102
|
+
| OpenAI-compatible (LM Studio, …) | port or config | models, health, chat; optional API key |
|
|
103
|
+
|
|
104
|
+
lonoboard finds the systemd unit or Docker container behind each server. That gives it state,
|
|
105
|
+
uptime, restarts and logs. See [docs/sources.md](https://github.com/ztaylor/lonoboard/blob/main/docs/sources.md) for details.
|
|
106
|
+
|
|
107
|
+
**Hardware:**
|
|
108
|
+
- **NVIDIA** via `nvidia-smi`, including unified-memory systems like the DGX Spark.
|
|
109
|
+
- **AMD** via `rocm-smi`.
|
|
110
|
+
- **Apple Silicon** via `ioreg`.
|
|
111
|
+
- **CPU-only.**
|
|
112
|
+
|
|
113
|
+
## Running it for real
|
|
114
|
+
|
|
115
|
+
lonoboard install --now # a systemd user service running `lonoboard serve`
|
|
116
|
+
|
|
117
|
+
The board listens on **localhost only** until you say otherwise. To reach it from elsewhere:
|
|
118
|
+
|
|
119
|
+
- **Tailscale** (recommended). Keep it on localhost and publish it with `tailscale serve`. lonoboard
|
|
120
|
+
then finds the other machines on your tailnet for the fleet screen.
|
|
121
|
+
- **Your LAN.** Set `listen` and a `password`. lonoboard won't listen beyond localhost or your
|
|
122
|
+
tailnet without one. The password is asked for at a login prompt in the terminal, and the
|
|
123
|
+
API takes it as a bearer token.
|
|
124
|
+
|
|
125
|
+
[SECURITY.md](https://github.com/ztaylor/lonoboard/blob/main/SECURITY.md) covers what the board shows and how it's protected.
|
|
126
|
+
|
|
127
|
+
See [docs/deployment.md](https://github.com/ztaylor/lonoboard/blob/main/docs/deployment.md) for systemd, Tailscale, Docker and deploying to
|
|
128
|
+
several machines over SSH, and [docs/public-demo.md](https://github.com/ztaylor/lonoboard/blob/main/docs/public-demo.md) for hosting a public
|
|
129
|
+
demo board.
|
|
130
|
+
|
|
131
|
+
## Configuration
|
|
132
|
+
|
|
133
|
+
Nothing needs configuring, but everything can be. Settings go in `~/.config/lonoboard/config.toml`,
|
|
134
|
+
or in a file named by `--config` or `$LONOBOARD_CONFIG`:
|
|
135
|
+
|
|
136
|
+
```toml
|
|
137
|
+
[board]
|
|
138
|
+
tagline = "the attic box"
|
|
139
|
+
|
|
140
|
+
[[server]]
|
|
141
|
+
name = "lmstudio"
|
|
142
|
+
url = "http://127.0.0.1:1234"
|
|
143
|
+
kind = "openai"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
[examples/config.toml](https://github.com/ztaylor/lonoboard/blob/main/examples/config.toml) lists every setting, and
|
|
147
|
+
[docs/configuration.md](https://github.com/ztaylor/lonoboard/blob/main/docs/configuration.md) explains them.
|
|
148
|
+
|
|
149
|
+
## JSON API
|
|
150
|
+
|
|
151
|
+
Anything that doesn't ask for HTML gets JSON:
|
|
152
|
+
|
|
153
|
+
curl localhost:7777/ # host, services, other ports, fleet
|
|
154
|
+
curl localhost:7777/api/usage # requests per hour, top 10
|
|
155
|
+
|
|
156
|
+
See [docs/api.md](https://github.com/ztaylor/lonoboard/blob/main/docs/api.md) for every endpoint.
|
|
157
|
+
|
|
158
|
+
## Credits
|
|
159
|
+
|
|
160
|
+
- The fonts are `PxPlus_IBM_VGA_8x16` and `PxPlus_IBM_VGA_9x16`, from
|
|
161
|
+
[The Ultimate Oldschool PC Font Pack](https://int10h.org/oldschool-pc-fonts/) by VileR. They
|
|
162
|
+
are licensed CC BY-SA 4.0 and bundled, so the board works offline.
|
|
163
|
+
- The look is inspired by the ANSI art groups of the 1990s: ACiD, iCE, Blocktronics and the
|
|
164
|
+
rest of the 16colo.rs archive.
|
|
165
|
+
|
|
166
|
+
## License
|
|
167
|
+
|
|
168
|
+
MIT, see [LICENSE](https://github.com/ztaylor/lonoboard/blob/main/LICENSE). The bundled fonts keep their CC BY-SA 4.0 license.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "lonoboard"
|
|
7
|
+
description = "A live dashboard for the machines running your AI models, drawn like a 1990s ANSI BBS"
|
|
8
|
+
readme = "README.md"
|
|
9
|
+
license = "MIT"
|
|
10
|
+
license-files = ["LICENSE", "src/lonoboard/static/fonts/LICENSE-CC-BY-SA-4.0.txt"]
|
|
11
|
+
requires-python = ">=3.11"
|
|
12
|
+
dependencies = []
|
|
13
|
+
dynamic = ["version"]
|
|
14
|
+
keywords = ["bbs", "ansi", "ansi-art", "telnet", "llama.cpp", "ollama", "vllm", "llm", "dashboard", "homelab"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Environment :: Console",
|
|
18
|
+
"Environment :: Web Environment",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"Intended Audience :: System Administrators",
|
|
21
|
+
"Operating System :: POSIX :: Linux",
|
|
22
|
+
"Operating System :: MacOS",
|
|
23
|
+
"Programming Language :: Python :: 3",
|
|
24
|
+
"Topic :: Terminals :: Telnet",
|
|
25
|
+
"Topic :: System :: Monitoring",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/ztaylor/lonoboard"
|
|
30
|
+
Issues = "https://github.com/ztaylor/lonoboard/issues"
|
|
31
|
+
Changelog = "https://github.com/ztaylor/lonoboard/blob/main/CHANGELOG.md"
|
|
32
|
+
|
|
33
|
+
[project.scripts]
|
|
34
|
+
lonoboard = "lonoboard.cli:main"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.dynamic]
|
|
37
|
+
version = { attr = "lonoboard.__version__" }
|
|
38
|
+
|
|
39
|
+
[tool.setuptools.packages.find]
|
|
40
|
+
where = ["src"]
|
|
41
|
+
|
|
42
|
+
[tool.setuptools.package-data]
|
|
43
|
+
lonoboard = ["static/*.html", "static/fonts/*"]
|