A modular terminal dashboard built with Bubble Tea. Lattice ships with a set of built-in modules and supports external plugins written in any language.
╭──────────────────────╮╭──────────────────────╮
│ LATTICE ││ CLOCK │
│ Good evening, user ││ 20:31:47 │
│ Your terminal dash ││ Sunday, Mar 16 │
╰──────────────────────╯╰──────────────────────╯
╭──────────────────────╮╭──────────────────────╮
│ SYSTEM ││ GITHUB │
│ CPU 12% ██░░░░░░░░ ││ COMMITS 4 │
│ MEM 58% █████░░░░░ ││ PRS MERGED 1 │
╰──────────────────────╯╰──────────────────────╯
╭──────────────────────╮╭──────────────────────╮
│ WEATHER ││ UPTIME │
│ ☀ Clear ││ 3d 7h 22m │
│ 🌡 +18°C (feels +16) ││ since Mar 13, 08:14 │
╰──────────────────────╯╰──────────────────────╯
go install github.com/floatpane/lattice@latestOr build from source:
git clone https://github.com/floatpane/lattice.git
cd lattice
go build -o lattice .lattice # launch the dashboard
lattice list # show available modules
lattice import <pkg> # install an external plugin
lattice remove <name> # remove an installed plugin
lattice help # show helpPress q or Ctrl+C to quit the dashboard.
Lattice reads its config from ~/.config/lattice/config.yaml. If the file doesn't exist, it uses a default set of modules.
Copy the example config to get started:
mkdir -p ~/.config/lattice
cp config.example.yaml ~/.config/lattice/config.yaml# Number of columns in the grid layout
columns: 2
# Modules to display, in order
modules:
- type: greeting
config:
name: "Ada"
- type: clock
- type: system
- type: github
config:
username: "octocat"
token: "ghp_..."
- type: weather
config:
city: "London"
- type: uptimeModules are arranged in columns using round-robin distribution. The order in the config determines the order on screen.
Secrets and config values can also be set via environment variables (or a .env file in the working directory). Env vars take effect when the config key is not set:
| Module | Config key | Env var |
|---|---|---|
| greeting | name |
LATTICE_NAME |
| github | username |
GITHUB_USERNAME |
| github | token |
GITHUB_TOKEN |
| weather | city |
LATTICE_CITY |
| Module | Description |
|---|---|
greeting |
Time-aware greeting with your name |
clock |
Live clock with date |
system |
CPU, memory, and GPU usage bars |
github |
Today's commits, merged PRs, closed issues |
weather |
Current weather via wttr.in (no API key needed) |
uptime |
System uptime since last boot |
Lattice supports external plugins — standalone binaries that communicate over JSON stdin/stdout. No recompilation needed.
# Install a Go-based plugin
lattice import github.com/someone/lattice-spotify@latest
# Then add it to your config
# modules:
# - type: spotifyPlugins are installed to ~/.config/lattice/plugins/. Lattice also searches your $PATH for binaries named lattice-<name>.
lattice remove spotifySee DEVELOPING.md for the full plugin development guide.
A plugin is any executable named lattice-<name> that reads newline-delimited JSON from stdin and writes JSON responses to stdout.
Go (using the SDK):
package main
import "github.com/floatpane/lattice/pkg/plugin"
func main() {
plugin.Run(func(req plugin.Request) plugin.Response {
switch req.Type {
case "init":
return plugin.Response{
Name: "MY MODULE",
Interval: 30,
}
case "update", "view":
return plugin.Response{
Content: "Hello from my plugin!",
}
}
return plugin.Response{}
})
}Python:
#!/usr/bin/env python3
import json, sys
for line in sys.stdin:
req = json.loads(line)
if req["type"] == "init":
print(json.dumps({"name": "PYMOD", "interval": 10}), flush=True)
elif req["type"] in ("update", "view"):
print(json.dumps({"content": "Hello from Python!"}), flush=True)Bash:
#!/usr/bin/env bash
while IFS= read -r line; do
type=$(echo "$line" | jq -r .type)
case "$type" in
init) echo '{"name":"SHMOD","interval":60}' ;;
*) echo '{"content":"Hello from bash!"}' ;;
esac
donelattice/
main.go Entry point, CLI, app model
internal/
layout/layout.go Grid layout engine
modules/ Built-in module implementations
clock.go, system.go, github.go,
weather.go, uptime.go, greeting.go
plugin/runner.go External plugin process manager
pkg/ Public API (importable by plugins)
module/module.go Module interface
config/config.go Config types + loader
registry/registry.go Module registry (Register/Get/List)
styles/styles.go Shared colors + helpers
plugin/sdk.go Plugin SDK (types + Run helper)
config.example.yaml Example configuration
The software is protected by the MIT License. See LICENSE for details.