An UNOFFICIAL terminal UI (TUI) for browsing The Hoptimist online craft beer store. Built with Bubble Tea and the WooCommerce Store API.
- Browse the latest items added to the store with pagination (
nnext /pprevious) - Explore products by category
- View product details with markdown-rendered descriptions and prices
- Full keyboard navigation (arrows, enter, back with
h/←, quit withq) - Loading spinner and error display for a smooth TUI experience
The demo shows the main flow: landing screen → latest products → selecting a product for details → browsing categories → exploring products within a category.
- Go 1.25 or later (see go.mod for the exact minimum version)
- A terminal with 256-color support (the TUI uses Lipgloss styling)
go install github.com/matt-riley/hopcli@latestgit clone https://github.com/matt-riley/hopcli.git
cd hopcli
go build -o hopt .
./hoptgo build -ldflags "-X github.com/matt-riley/hopcli/internal/commands.Version=$(git describe --tags --always --dirty)" -o hopt .brew install matt-riley/tap/hoptBy default, hopcli connects to the production API at https://thehoptimist.co.uk. To point it at a different WooCommerce store:
// In your own main.go or before calling hopt.Run():
commands.TheHoptimistBaseURL = "https://your-store.example.com"The API client (commands.ApiClient) can also be replaced with a custom implementation that satisfies the api.Client interface — useful for testing or working with a different backend.
| Key | Action |
|---|---|
↑ / ↓ |
Navigate lists |
Enter |
Select item (open category, view product details) |
h / ← |
Go back to the previous view |
n |
Next page (in paginated views) |
p |
Previous page (in paginated views) |
q |
Quit |
- Home — Choose between Latest and Categories
- Latest Beers — Paginated list of recently added products
- Categories — Browse all product categories
- Category Products — Paginated list of products within a selected category
- Product Detail — Markdown-rendered description, price, and link to the store page
The upstream WooCommerce Store API does not expose brewery or brand data for products. When displaying product details, the product title is returned as-is — there is no separate brewery field to display. This is a limitation of the data model provided by The Hoptimist's API, not a bug in hopcli.
If brewery data becomes available through the API in the future, it can be surfaced by adding a Brewery field to api.Product and threading it through the product.ProductModel.
MIT — see LICENSE for full text.

