Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 118471314b | |||
| 604cbda388 |
@@ -0,0 +1,65 @@
|
||||
# dashboard
|
||||
|
||||
A terminal dashboard (TUI) built with [go-tui](https://github.com/grindlemire/go-tui). Shows simulated CPU/memory/disk gauges, network sparklines, and a scrolling event feed. Single binary, no external services — everything is randomly generated for demo purposes.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Go 1.24+ (module targets 1.26.5)
|
||||
|
||||
## Getting started
|
||||
|
||||
```sh
|
||||
# Regenerate dashboard_gsx.go from dashboard.gsx (required if the .go file is missing/stale)
|
||||
go run github.com/grindlemire/go-tui/cmd/tui generate ./...
|
||||
|
||||
# Run the app
|
||||
go run .
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
```sh
|
||||
# Regenerate dashboard_gsx.go from dashboard.gsx
|
||||
go run github.com/grindlemire/go-tui/cmd/tui generate ./...
|
||||
|
||||
# Build
|
||||
go build ./...
|
||||
|
||||
# Vet
|
||||
go vet ./...
|
||||
|
||||
# Run
|
||||
go run .
|
||||
```
|
||||
|
||||
There are no test files in this repo yet.
|
||||
|
||||
## Controls
|
||||
|
||||
- `q` / `Esc` — quit
|
||||
- `j` / `k` or arrow keys — scroll the event feed
|
||||
- Mouse wheel — scroll the event feed
|
||||
|
||||
## Architecture
|
||||
|
||||
`dashboard.gsx` is the source of truth for the UI, written in `.gsx` — a JSX-like DSL (Tailwind-esque `class` strings, `{expr}` interpolation, `for`/`if` control flow) provided by go-tui. It also contains the non-templ Go code: the `dashboardApp` struct, helper funcs, and `produceEvents`.
|
||||
|
||||
Running `tui generate` compiles `dashboard.gsx` into `dashboard_gsx.go`. That generated file is git-ignored and carries a `// Code generated by tui generate. DO NOT EDIT.` header — never hand-edit it. To change the UI, edit `dashboard.gsx` and regenerate.
|
||||
|
||||
`main.go` wires up `tui.NewApp(tui.WithRootComponent(Dashboard(eventCh)), tui.WithMouse())` and runs it. A background goroutine (`produceEvents`) pushes random events onto `eventCh`.
|
||||
|
||||
`dashboardApp` implements several optional go-tui interfaces (checked at compile time in the generated file):
|
||||
|
||||
- `KeyMap()` — key bindings
|
||||
- `HandleMouse()` — mouse wheel scroll support
|
||||
- `Watchers()` — background subscriptions (a 500ms metrics-drift timer, an event-channel watch)
|
||||
- `Render()` — the generated view tree
|
||||
- `BindApp()` — generated; wires every `*tui.State[T]` field so state changes trigger re-renders
|
||||
|
||||
All mutable UI state (`cpu`, `mem`, `sparkIn`, `events`, `scrollY`, ...) is `*tui.State[T]`, read via `.Get()` and mutated via `.Set()`.
|
||||
|
||||
See [CLAUDE.md](CLAUDE.md) for more detail on the code-generation step and conventions.
|
||||
|
||||
## CI
|
||||
|
||||
`.gitea/workflows/build.yml` runs on push/PR to `main`: checkout → setup-go → `tui generate` → `go build` → `go vet`. The generated file is never committed — CI regenerates it from scratch every run.
|
||||
Reference in New Issue
Block a user