-
-
-```
-
-- [ ] **Step 2: Commit KeyInput component**
-
-```bash
-git add gui/frontend/src/components/KeyInput.svelte
-git commit -m "feat(gui): add KeyInput component with auto-complete"
-```
-
----
-
-## Task 6: OperationPanel with Keyboard Shortcuts & Input State
-
-**Files:**
-- Modify: `gui/frontend/src/components/OperationPanel.svelte`
-
-- [ ] **Step 1: Rewrite OperationPanel with KeyInput, key history tracking, and tab state preservation**
-
-Replace `gui/frontend/src/components/OperationPanel.svelte` entirely. Key changes:
-- Import `KeyInput` component instead of raw `` for Get and Delete
-- Import `keyHistory` and call `keyHistory.add(key)` after every Get/Set/Delete
-- Export `executeCurrent` and `setTab` functions for App.svelte to call from keyboard handler
-- Each tab's form state is already separate variables (getKey, setKey, etc.) — no change needed there
-- Tab padding: `6px 16px` → `4px 12px`, panel padding: `16px` → `12px`
-- Add monospace font to value textarea
-
-```svelte
-
-
-
-{/if}
-
-
-```
-
-- [ ] **Step 2: Integrate StatsCards into App layout**
-
-In `gui/frontend/src/App.svelte`, add StatsCards above the JSON display when on Stats tab. Add import and conditional render in the result area:
-
-Add the import at the top of the script:
-```svelte
-import StatsCards from './components/StatsCards.svelte'
-```
-
-Add before the `` inside the result-area div:
-```svelte
-{#if $activeOperationTab === 'stats' && $queryResult && $queryResult.success}
-
-{/if}
-```
-
-- [ ] **Step 3: Commit ConnectionBanner and StatsCards integration**
-
-```bash
-git add gui/frontend/src/components/ConnectionBanner.svelte gui/frontend/src/App.svelte
-git commit -m "feat(gui): add stats display to ConnectionBanner and StatsCards to Stats view"
-```
-
----
-
-## Task 11: Spacing & Font Refinements
-
-**Files:**
-- Modify: `gui/frontend/src/components/ProtocolLog.svelte`
-- Modify: `gui/frontend/src/components/Sidebar.svelte`
-
-- [ ] **Step 1: Update ProtocolLog monospace font and tighten spacing**
-
-In `gui/frontend/src/components/ProtocolLog.svelte`:
-- Change `.log-list` font-family to use `var(--font-mono)` instead of hardcoded list
-- Reduce `.log-header` padding from `8px 12px` to `6px 12px`
-- Reduce `.log-entry` padding from `4px 12px` to `3px 12px`
-
-- [ ] **Step 2: Update Sidebar spacing**
-
-In `gui/frontend/src/components/Sidebar.svelte`:
-- Reduce `.sidebar-header` padding from `16px` to `12px`
-- Reduce `.context-list` padding from `8px` to `6px`
-- Reduce `.context-item` padding from `10px 12px` to `8px 10px`
-
-- [ ] **Step 3: Commit spacing refinements**
-
-```bash
-git add gui/frontend/src/components/ProtocolLog.svelte gui/frontend/src/components/Sidebar.svelte
-git commit -m "style(gui): tighten spacing and use monospace font variable"
-```
-
----
-
-## Task 12: Final Verification
-
-- [ ] **Step 1: Build the frontend to check for compilation errors**
-
-```bash
-cd gui/frontend && npm run build
-```
-
-Expected: Build succeeds with no errors.
-
-- [ ] **Step 2: Build the Wails app to verify full integration**
-
-```bash
-cd gui && wails build
-```
-
-Expected: Build succeeds. If Wails CLI is not available, the frontend build alone is sufficient.
-
-- [ ] **Step 3: Final commit if any fixes were needed**
-
-```bash
-git add -A gui/frontend/src/
-git commit -m "fix(gui): address build issues from verification"
-```
diff --git a/docs/superpowers/specs/2026-04-27-gui-ux-style-enhancement-design.md b/docs/superpowers/specs/2026-04-27-gui-ux-style-enhancement-design.md
deleted file mode 100644
index ddb0dbb..0000000
--- a/docs/superpowers/specs/2026-04-27-gui-ux-style-enhancement-design.md
+++ /dev/null
@@ -1,126 +0,0 @@
-# GUI UX & Style Enhancement Design
-
-## Context
-
-Memcached GUI built with Wails + Svelte. Used primarily for development debugging (mixed operations: query, batch exploration, modify-verify). Current pain points: low input efficiency, poor result display, cumbersome tab switching, lack of overview.
-
-**Design direction:** Panel-Driven — retain existing layout structure, enhance in four areas.
-
-## 1. Input Efficiency
-
-### Key History Panel
-
-- New `KeyHistoryPanel.svelte` component, placed right of OperationPanel input area
-- Shows recent keys (max 50), most recent first, persisted to localStorage
-- Click to populate input field
-- Clear button to wipe history
-- Global store: `keyHistory` writable store, auto-updates on every Get/Set/Delete operation
-
-### Auto-completion
-
-- Input fields show dropdown (max 5 matches) filtered from key history
-- Keyboard navigation: Arrow Up/Down to select, Enter/Tab to confirm, Escape to dismiss
-- Trigger after 1+ character typed
-
-### Keyboard Shortcuts
-
-| Shortcut | Action |
-|----------|--------|
-| `Ctrl+1/2/3/4` | Switch to Get/Set/Delete/Stats tab |
-| `Ctrl+Enter` | Execute current operation |
-| `Ctrl+L` | Clear result area |
-
-Global keydown listener in `App.svelte`, only active when no input/textarea is focused (except for Ctrl+Enter which works in inputs).
-
-## 2. Result Display
-
-### JSON Search & Filter
-
-- Search input above JSON tree area in `ValueDisplay.svelte`
-- Filters tree nodes by matching key or value (case-insensitive)
-- Collapsed paths auto-expand on match
-
-### Expand/Collapse All
-
-- "Expand All" / "Collapse All" toggle button next to search
-
-### Copy Enhancements
-
-- Copy button dropdown: "Raw Value" / "Formatted JSON" / "Current Path"
-- Current path display when hovering JSON tree node
-
-### Syntax Highlighting
-
-Already good, no change needed for color tokens.
-
-## 3. Operation Switching
-
-### Input State Preservation
-
-- Each tab (get, set, delete) maintains its own form state independently
-- Use separate reactive variables per tab (already partially done), ensure no state loss on tab switch
-
-### Tab Memory
-
-- Persist `activeOperationTab` to localStorage
-- Restore on app startup
-
-## 4. Information Overview
-
-### ConnectionBanner Enhancement
-
-- After connecting, auto-fetch stats once, then refresh every 30s
-- Display compact metrics right of connection name: `keys: 1,234 | hits: 89% | mem: 128MB/512MB`
-- New derived store: `connectionStats` to hold parsed stats data
-
-### Stats Visualization
-
-- When Stats tab returns results, show metric cards above the raw JSON:
- - Memory: `bytes_used / limit_maxbytes` with progress bar
- - Hit rate: `get_hits / (get_hits + get_misses)` percentage
- - Connections: `curr_connections` number
-- Cards use existing CSS variables, compact layout (3 columns)
-
-## 5. Visual Style
-
-### Color Palette Adjustment
-
-Dark theme background shift toward terminal black:
-- `--bg-primary`: `#1a2332` → `#0a0e14`
-- `--bg-sidebar`: `#0f172a` → `#0d1117`
-- `--bg-surface`: `#1e293b` → `#0f1923`
-
-Border refinement:
-- `--border`: `#1e293b` → `#1a2332` (subtler)
-- `--border-strong`: `#334155` → `#2a3545`
-
-### Spacing
-
-- Reduce padding in panels from 16px to 12px
-- Tighter form row gaps (8px → 6px)
-- Tab padding: 6px 16px → 4px 12px
-
-### Font
-
-- All UI text remains system font stack
-- Monospace areas (log, value display) explicitly use `'JetBrains Mono', 'SF Mono', 'Monaco', 'Menlo', 'Consolas', monospace`
-
-## Scope
-
-In scope:
-- Key history panel with localStorage persistence
-- Auto-completion on input fields
-- Keyboard shortcuts
-- JSON search/filter in ValueDisplay
-- Expand/collapse all for JSON tree
-- Copy options (raw/formatted/path)
-- Tab input state preservation + tab memory
-- ConnectionBanner stats display (periodic refresh)
-- Stats metric cards
-- Dark theme color/spacing refinement
-
-Out of scope:
-- New operations (TTL touch, CAS update, etc.)
-- Multi-server cluster management
-- Data import/export
-- Unit test changes (unless directly related)
diff --git a/docs/usage.md b/docs/usage.md
new file mode 100644
index 0000000..289b103
--- /dev/null
+++ b/docs/usage.md
@@ -0,0 +1,92 @@
+# Usage guide
+
+The [README](../README.md) covers installation and a first request. This guide collects the rest of the client API and its operational limits. All cache operations accept a `context.Context`; `Close` does not.
+
+## Commands
+
+| Task | Methods |
+| --- | --- |
+| Store values | `Set`, `Add`, `Replace`, `Append`, `Prepend`, `Cas` |
+| Read values | `Get`, `Gets` (includes CAS), `GetAndTouch`, `GetAndTouches` |
+| Manage values | `Delete`, `Incr`, `Decr`, `Touch`, `FlushAll` |
+| Inspect a server | `Version`, `Stats` |
+| Meta text protocol | `MetaGet`, `MetaSet`, `MetaDelete`, `MetaArithmetic`, `MetaDebug`, `MetaNoOp` |
+
+`Set`, `Add`, `Replace`, `Append`, `Prepend`, and `Cas` accept a value, a `uint32` flags field, and an expiration as `time.Duration`. Use zero duration for no expiration. A missing `Get` returns `ErrNotFound`; use `errors.Is` to distinguish it from other failures. `Gets(ctx, key)` returns an item's CAS value for `Cas`.
+
+The meta methods take options named `MetaGetFlag...`, `MetaSetFlag...`, `MetaDeleteFlag...`, or `MetaArithmeticFlag...`. They require a server with meta text protocol support. For example:
+
+```go
+item, err := client.MetaGet(ctx, []byte("article:1"),
+ memcached.MetaGetFlagReturnValue(),
+ memcached.MetaGetFlagReturnCAS(),
+ memcached.MetaGetFlagReturnTTL(),
+)
+```
+
+Other meta options expose client flags, size, opaque tokens, stale items, and recache coordination. See [the meta example](../example/meta.go) and [Go API reference](https://pkg.go.dev/github.com/yeqown/memcached) for the full option list.
+
+## Multiple servers and connection pools
+
+Pass a comma-separated list of addresses to `New`. Routing uses CRC32 by default. Murmur3 and rendezvous hashing are available through `WithPickBuilder`; `WithResolver` and `WithPickBuilder` also accept custom implementations.
+
+```go
+client, err := memcached.New(
+ "cache-1:11211,cache-2:11211",
+ memcached.WithPickBuilder(memcached.NewRendezvousHashPickBuilder(0)),
+ memcached.WithMaxConns(100),
+ memcached.WithMaxIdleConns(10),
+ memcached.WithMaxLifetime(time.Hour),
+ memcached.WithMaxIdleTimeout(5*time.Minute),
+ memcached.WithDialTimeout(3*time.Second),
+ memcached.WithReadTimeout(5*time.Second),
+ memcached.WithWriteTimeout(5*time.Second),
+)
+```
+
+Pools are maintained per address. The address list is resolved when `New` is called; this client does not automatically discover nodes or fail over to another node. Changing the server list or hash strategy can change key placement. `FlushAll` reaches every configured node, while `Version` and `Stats` report one selected node.
+
+Unlike `gomemcache.GetMulti`, this client's `Gets` and `GetAndTouches` do not split keys by node. With multiple servers, use them only for keys known to map to the same node, or call `Get`/`GetAndTouch` separately for each key.
+
+## Value codecs and compression
+
+`WithCodec` installs a `Codec` that transforms values and flags when storing or retrieving data. The API accepts `[]byte`, so applications must serialize Go values before calling it. A custom `Codec` can transform those bytes and flags. The built-in compression codec follows the [MC-COMPRESS flag format](./MC-COMPRESS-SPEC-v1.0.md):
+
+```go
+compressionCodec, err := memcodec.NewCompressCodec(
+ memcodec.CompressionAlgorithmZstd, 1024, 3,
+)
+if err != nil {
+ return err
+}
+client, err := memcached.New("localhost:11211", memcached.WithCodec(compressionCodec))
+```
+
+Import `memcodec` from `github.com/yeqown/memcached/codec`. Available algorithms are `CompressionAlgorithmNone`, `CompressionAlgorithmDeflate`, `CompressionAlgorithmLZ4`, `CompressionAlgorithmSnappy`, and `CompressionAlgorithmZstd`. The second constructor argument is the minimum value size in bytes, and the third is the algorithm-specific compression level. Values below the threshold or not reduced by compression are stored uncompressed.
+
+With this codec installed, reads decode recognized MC-COMPRESS values and return application flags. Application flags must fit in 16 bits. The compression codec rejects `Append` and `Prepend` and the equivalent meta set modes, which cannot preserve compressed-value semantics. Install the same codec on every client that must read those compressed values.
+
+## Telemetry
+
+Pass OpenTelemetry providers to `WithTelemetry` to collect request spans and the `memcached.operation.calls`, `memcached.operation.errors`, and `memcached.operation.duration` metrics. Telemetry is off unless providers are configured.
+
+```go
+client, err := memcached.New("localhost:11211",
+ memcached.WithTelemetry(
+ telemetry.WithTracerProvider(tracerProvider),
+ telemetry.WithMeterProvider(meterProvider),
+ ),
+)
+```
+
+Import `telemetry` from `github.com/yeqown/memcached/telemetry`. The [OpenTelemetry example](../example/otel/main.go) shows provider setup and exporters.
+
+## Transport and other options
+
+- TCP is the default: `localhost:11211`.
+- Unix socket: `unix:///path/to/memcached.sock`.
+- UDP: `udp://localhost:11211` with `WithUDPEnabled()`. The server must also enable UDP; this legacy transport is disabled in many deployments. `WithUDPEnabled` applies to every configured connection, so avoid mixing UDP and TCP addresses in one client.
+- `WithNoReply()` skips acknowledgments for supported write commands; use it only when the application can tolerate missing server-side errors. `Incr` and `Decr` return zero in this mode.
+- `WithSASL(username, password)` remains for legacy binary-protocol authentication and is deprecated because the binary protocol is deprecated.
+
+The repository also contains an [interactive CLI](../cmd/memcached-cli/README.md) and a [Wails desktop GUI](../gui/README.md).
diff --git a/gui/README.md b/gui/README.md
index 2e62a37..1dd4969 100644
--- a/gui/README.md
+++ b/gui/README.md
@@ -1,16 +1,20 @@
-# README
+# Memcached GUI
-## About
+A Wails and Svelte desktop tool for inspecting and changing Memcached data.
-This is the official Wails Svelte-TS template.
+- Save server contexts and switch between connections.
+- Get values with TTL, CAS, flags, size, and access metadata; display text or JSON.
+- Set, delete, increment, decrement, inspect stats and version, and flush all keys.
+- Review the operation log while working.
-## Live Development
+## Development
-To run in live development mode, run `wails dev` in the project directory. This will run a Vite development
-server that will provide very fast hot reload of your frontend changes. If you want to develop in a browser
-and have access to your Go methods, there is also a dev server that runs on http://localhost:34115. Connect
-to this in your browser, and you can call your Go code from devtools.
+Install Go 1.26+, Node.js/npm, and the [Wails CLI and platform dependencies](https://wails.io/docs/gettingstarted/installation). From the repository root:
-## Building
+```bash
+cd gui
+npm --prefix frontend install
+wails dev
+```
-To build a redistributable, production mode package, use `wails build`.
+To build a desktop binary, run `wails build` from `gui/`. The GUI uses the `memcached-gui` Go module and the client in this repository through `go.work` during local development.