{"id":47589937,"url":"https://github.com/floatpane/lattice","last_synced_at":"2026-04-01T17:13:36.107Z","repository":{"id":330330566,"uuid":"1122435155","full_name":"floatpane/lattice","owner":"floatpane","description":"A modular terminal dashboard built with Go and Bubble Tea","archived":false,"fork":false,"pushed_at":"2026-03-16T21:12:18.000Z","size":58,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-16T23:28:08.451Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/floatpane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-24T18:07:36.000Z","updated_at":"2026-03-16T16:57:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/floatpane/lattice","commit_stats":null,"previous_names":["andrinoff/web-trmnl","floatpane/lattice"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/floatpane/lattice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/floatpane%2Flattice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/floatpane%2Flattice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/floatpane%2Flattice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/floatpane%2Flattice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/floatpane","download_url":"https://codeload.github.com/floatpane/lattice/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/floatpane%2Flattice/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-01T17:13:35.453Z","updated_at":"2026-04-01T17:13:36.093Z","avatar_url":"https://github.com/floatpane.png","language":"Go","readme":"# Lattice\n\nA modular terminal dashboard built with [Bubble Tea](https://github.com/charmbracelet/bubbletea). Lattice ships with a set of built-in modules and supports external plugins written in any language.\n\n```\n╭──────────────────────╮╭──────────────────────╮\n│ LATTICE              ││ CLOCK                │\n│ Good evening, user   ││      20:31:47        │\n│ Your terminal dash   ││  Sunday, Mar 16      │\n╰──────────────────────╯╰──────────────────────╯\n╭──────────────────────╮╭──────────────────────╮\n│ SYSTEM               ││ GITHUB               │\n│ CPU  12% ██░░░░░░░░  ││ COMMITS          4   │\n│ MEM  58% █████░░░░░  ││ PRS MERGED       1   │\n╰──────────────────────╯╰──────────────────────╯\n╭──────────────────────╮╭──────────────────────╮\n│ WEATHER              ││ UPTIME               │\n│ ☀ Clear             ││ 3d 7h 22m            │\n│ 🌡 +18°C (feels +16) ││ since Mar 13, 08:14  │\n╰──────────────────────╯╰──────────────────────╯\n```\n\n## Install\n\n```bash\ngo install github.com/floatpane/lattice@latest\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/floatpane/lattice.git\ncd lattice\ngo build -o lattice .\n```\n\n## Usage\n\n```bash\nlattice              # launch the dashboard\nlattice list         # show available modules\nlattice import \u003cpkg\u003e # install an external plugin\nlattice remove \u003cname\u003e # remove an installed plugin\nlattice help         # show help\n```\n\nPress `q` or `Ctrl+C` to quit the dashboard.\n\n## Configuration\n\nLattice reads its config from `~/.config/lattice/config.yaml`. If the file doesn't exist, it uses a default set of modules.\n\nCopy the example config to get started:\n\n```bash\nmkdir -p ~/.config/lattice\ncp config.example.yaml ~/.config/lattice/config.yaml\n```\n\n### Config format\n\n```yaml\n# Number of columns in the grid layout\ncolumns: 2\n\n# Modules to display, in order\nmodules:\n  - type: greeting\n    config:\n      name: \"Ada\"\n\n  - type: clock\n  - type: system\n\n  - type: github\n    config:\n      username: \"octocat\"\n      token: \"ghp_...\"\n\n  - type: weather\n    config:\n      city: \"London\"\n\n  - type: uptime\n```\n\nModules are arranged in columns using round-robin distribution. The order in the config determines the order on screen.\n\n### Environment variables\n\nSecrets 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:\n\n| Module   | Config key | Env var            |\n|----------|------------|--------------------|\n| greeting | `name`     | `LATTICE_NAME`     |\n| github   | `username` | `GITHUB_USERNAME`  |\n| github   | `token`    | `GITHUB_TOKEN`     |\n| weather  | `city`     | `LATTICE_CITY`     |\n\n## Built-in modules\n\n| Module     | Description                                |\n|------------|--------------------------------------------|\n| `greeting` | Time-aware greeting with your name         |\n| `clock`    | Live clock with date                       |\n| `system`   | CPU, memory, and GPU usage bars            |\n| `github`   | Today's commits, merged PRs, closed issues |\n| `weather`  | Current weather via [wttr.in](https://wttr.in) (no API key needed) |\n| `uptime`   | System uptime since last boot              |\n\n## Plugins\n\nLattice supports external plugins — standalone binaries that communicate over JSON stdin/stdout. No recompilation needed.\n\n### Installing a plugin\n\n```bash\n# Install a Go-based plugin\nlattice import github.com/someone/lattice-spotify@latest\n\n# Then add it to your config\n# modules:\n#   - type: spotify\n```\n\nPlugins are installed to `~/.config/lattice/plugins/`. Lattice also searches your `$PATH` for binaries named `lattice-\u003cname\u003e`.\n\n### Removing a plugin\n\n```bash\nlattice remove spotify\n```\n\n## Creating plugins\n\nSee [DEVELOPING.md](DEVELOPING.md) for the full plugin development guide.\n\n### Quick version\n\nA plugin is any executable named `lattice-\u003cname\u003e` that reads newline-delimited JSON from stdin and writes JSON responses to stdout.\n\n**Go (using the SDK):**\n\n```go\npackage main\n\nimport \"github.com/floatpane/lattice/pkg/plugin\"\n\nfunc main() {\n    plugin.Run(func(req plugin.Request) plugin.Response {\n        switch req.Type {\n        case \"init\":\n            return plugin.Response{\n                Name:     \"MY MODULE\",\n                Interval: 30,\n            }\n        case \"update\", \"view\":\n            return plugin.Response{\n                Content: \"Hello from my plugin!\",\n            }\n        }\n        return plugin.Response{}\n    })\n}\n```\n\n**Python:**\n\n```python\n#!/usr/bin/env python3\nimport json, sys\n\nfor line in sys.stdin:\n    req = json.loads(line)\n    if req[\"type\"] == \"init\":\n        print(json.dumps({\"name\": \"PYMOD\", \"interval\": 10}), flush=True)\n    elif req[\"type\"] in (\"update\", \"view\"):\n        print(json.dumps({\"content\": \"Hello from Python!\"}), flush=True)\n```\n\n**Bash:**\n\n```bash\n#!/usr/bin/env bash\nwhile IFS= read -r line; do\n  type=$(echo \"$line\" | jq -r .type)\n  case \"$type\" in\n    init)   echo '{\"name\":\"SHMOD\",\"interval\":60}' ;;\n    *)      echo '{\"content\":\"Hello from bash!\"}' ;;\n  esac\ndone\n```\n\n## Project structure\n\n```\nlattice/\n  main.go                      Entry point, CLI, app model\n  internal/\n    layout/layout.go           Grid layout engine\n    modules/                   Built-in module implementations\n      clock.go, system.go, github.go,\n      weather.go, uptime.go, greeting.go\n    plugin/runner.go           External plugin process manager\n  pkg/                         Public API (importable by plugins)\n    module/module.go           Module interface\n    config/config.go           Config types + loader\n    registry/registry.go       Module registry (Register/Get/List)\n    styles/styles.go           Shared colors + helpers\n    plugin/sdk.go              Plugin SDK (types + Run helper)\n  config.example.yaml          Example configuration\n```\n\n## License\n\nThe software is protected by the MIT License. See [LICENSE](LICENSE) for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffloatpane%2Flattice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffloatpane%2Flattice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffloatpane%2Flattice/lists"}