# P5 External Connectivity — Human Checklist (Alienware Laptop)

**Master guide:** **`docs/testing/P5-full-test-guide.md`** — use it for site prep (Part A), full battery (Part B), recap format and failure loop (Part C), and canonical URLs/credentials (brendonurban@gmail.com, no passwords in repo).

**This checklist** is an abbreviated Alienware-only flow. For complete steps, site validation, and datetime-stamped recap, follow the master guide.

**For**: Human on the Alienware laptop.  
**Goal**: Run the P5 connectivity test and send back the results (recap per master guide) so we can close issue #255.

---

## What LLMHosts actually is (so the steps make sense)

- **LLMHosts** is a CLI you install (`pip install llmhosts`). It does **not** run in the cloud. It runs on **your** machine.
- On a machine that has (or can reach) **Ollama**, you run:
  1. **`llmhosts serve`** — starts a **proxy** on port 4000. That proxy speaks the OpenAI API and routes requests to **local Ollama** (and optionally LAN/remote/cloud backends).
  2. **`llmhosts tunnel start`** — on the **same machine**, exposes that port 4000 to the internet via Tailscale or Cloudflare. It prints a **tunnel URL** (e.g. `https://myhost.tail1234.ts.net`). Anyone who hits that URL is hitting **that machine’s** proxy, which uses **that machine’s** Ollama (or whatever backends it has).
- So: **one machine** running `llmhosts serve` + `llmhosts tunnel start` (and usually Ollama) = **one “LLMHosts host”**. That host has **one tunnel URL**. No “server” in the cloud — the “server” is your box.
- **llmhosts.com** is a **separate** website (SaaS): sign up, billing, API keys, dashboard. Your proxy can *report* to it (e.g. with `llmhosts up`), but **the proxy does not run on llmhosts.com**. The proxy always runs on your hardware.

**For this test:**

- **Part 1 (Scenario A — Alienware as client):** You need **another** machine that is already an LLMHosts host (it runs Ollama + `llmhosts serve` + `llmhosts tunnel start` and has a tunnel URL). The **Alienware** does **not** run serve or tunnel; you only use the Alienware to **call** that URL (curl, etc.) from an external network. So: two machines. Host = the one with the tunnel URL. Alienware = client only.
- **Part 2 (Scenario B — Alienware as backend):** The **Alienware** is the LLMHosts host. On the Alienware you run Ollama + `llmhosts serve` + `llmhosts tunnel start`. You get the Alienware’s tunnel URL. You (or another device) then call that URL to run inference on the Alienware’s GPU.

---

## What you need before starting

- **Alienware** (has the 4090; will be client in Part 1 and host in Part 2).
- **For Part 1:** Either (a) another machine that already runs LLMHosts (Ollama + serve + tunnel) and gives you a tunnel URL, or (b) you’ll create that host yourself (Part 0 on that other machine).
- **External network** for Part 1: neighbor WiFi or phone hotspot so the Alienware’s public IP is different from the host’s (when they’re different machines).
- **Browser** for Part 3 (llmhosts.com).
- **As you go:** note the **tunnel URL** (and if curl returns 401, an **API key** from the host or llmhosts.com).

---

# Part 0 — Get a tunnel URL (only if you don’t have one yet)

**When to do this:** You need a tunnel URL for Part 1 and don’t have one. So you turn **one** machine into an LLMHosts host.  
**Where:** On the machine that will be the host. That can be a **desktop, another laptop, or a VPS** — not the Alienware if you want to test “Alienware as client” in Part 1 (then the host must be a different machine). If you only have the Alienware, you can do Part 0 on the Alienware to get a URL, but then Part 1 “Alienware as client” would mean calling that same URL from the Alienware on a different network (e.g. after switching to hotspot).

**When to skip:** You already have a tunnel URL (e.g. from a machine that’s already running serve + tunnel). → Skip to Part 1.

| Step | Where | What to do | What to note |
|------|--------|------------|--------------|
| 0.1 | **Host machine** (terminal) | Install Ollama if needed; run it. `ollama list` shows at least one model. | — |
| 0.2 | **Host machine** (terminal) | `llmhosts serve` or `llmhosts serve --no-tui`. Leave it running. | Process stays up. |
| 0.3 | **Host machine** (second terminal) | `llmhosts tunnel start`. Wait until it prints a URL. | **Tunnel URL** (e.g. `https://myhost.tail1234.ts.net`). Copy it. |
| 0.4 | **Host machine** (terminal) | `curl -s <TUNNEL_URL>/health`. If 401, use the API key the tunnel printed. | 200 and `"status":"ok"` in JSON. |
| 0.5 | **Host machine** (terminal) | `curl -s <TUNNEL_URL>/v1/models` (add auth header if 401). | 200 and model list (or empty). |

**Done:** You have a **TUNNEL_URL** for that host. Use it in Part 1. (In Part 2 the host will be the Alienware and you’ll get a second URL there.)

---

# Part 1 — Alienware as client only (Scenario A)

**Meaning:** The Alienware does **not** run `llmhosts serve` or tunnel. It only **calls** the tunnel URL of **another** machine (the host from Part 0). You’re testing: “Can I reach my LLMHosts host from the Alienware on an external network?”

Use the **host’s TUNNEL_URL** (from Part 0 or from an existing host).

## 1.1 — Alienware on external network

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | Connect to neighbor WiFi or phone hotspot. | — |
| Alienware (terminal) | `curl -s ifconfig.me` → note IP. On the **host** machine run same; note its IP. | Alienware IP: … Host IP: … (or “same machine” if host is Alienware). |
| — | If two machines: confirm IPs are **different**. | Pass/Fail |

## 1.2 — Health from Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `curl -s <TUNNEL_URL>/health` (host’s URL). | 200 + body snippet, or error. |

## 1.3 — Models from Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `curl -s <TUNNEL_URL>/v1/models` (auth header if 401). | 200 + one model id or “empty”, or error. |

## 1.4 — One completion (non-streaming) from Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `curl -s -X POST <TUNNEL_URL>/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"<MODEL>","messages":[{"role":"user","content":"Say hello in one word."}]}'` (use a model from 1.3; add auth if needed). | 200 + first 200 chars of response, or full error. |

## 1.5 — One completion (streaming)

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | Same as 1.4 with `"stream":true` in the JSON. Chunks should print. | Pass / Fail + error. |

## 1.6 — Latency

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | Time one request (e.g. `time curl ...`). | Time in seconds. Pass if &lt; 10s. |

## 1.7 — Disconnect / reconnect

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware | Turn off WiFi/hotspot; retry request → expect failure. Turn back on; retry → expect success. | Pass/Fail. |

## 1.8 — Sequential and concurrent

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | 5 sequential completion requests; then 3 concurrent. All succeed. | Pass/Fail. |

## 1.9 — Large context (optional)

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | One request with long prompt; short reply. | 200 and completed? Y/N or error. |

**Scenario A done.** Note any step that failed.

---

# Part 2 — Alienware as the LLMHosts host (Scenario B)

**Meaning:** The Alienware runs Ollama + `llmhosts serve` + `llmhosts tunnel start`. So the Alienware **is** the host; it has its **own** tunnel URL. You (or another device) call that URL to run inference on the Alienware’s GPU.

## 2.1 — Ollama on Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `ollama serve` (or ensure running). `ollama list`. | One model name. |

## 2.2 — Doctor on Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `llmhosts doctor`. | Ollama PASS? GPU (e.g. 4090) shown? Pass/Fail. |

## 2.3 — Serve and tunnel on Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Alienware (terminal) | `llmhosts serve` or `llmhosts serve --no-tui`. Leave running. | — |
| Alienware (second terminal) | `llmhosts tunnel start`. Note the URL. | **Alienware tunnel URL**: … |

## 2.4 — Register Alienware as a backend (optional)

| Where | Action | What to send back |
|-------|--------|-------------------|
| If you have a central dashboard or config that lists “backends” or “devices” | Add the Alienware’s tunnel URL so traffic can be routed to it. If you’re only testing by calling the Alienware URL directly, skip. | Done / N/A. |

## 2.5 — Inference to the Alienware

| Where | Action | What to send back |
|-------|--------|-------------------|
| Any machine that can reach the Alienware’s tunnel URL (can be the Alienware itself, or your phone, or another PC) | `curl -s -X POST <ALIENWARE_TUNNEL_URL>/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"<MODEL>","messages":[{"role":"user","content":"Hello"}]}'` (model from `ollama list`). | 200 + reply text, or full error. |

**Expected:** Inference runs on the Alienware’s GPU.

## 2.6 — Streaming and reconnect (quick)

| Where | Action | What to send back |
|-------|--------|-------------------|
| Same as 2.5 | One request with `stream: true`. Then disconnect Alienware network briefly; retry; reconnect; retry. | Pass/Fail. |

**Scenario B done.** Note any failure.

---

# Part 3 — Browser (llmhosts.com)

llmhosts.com is the **SaaS site** (accounts, billing, dashboard). It is **not** where your proxy runs. Do these from any browser.

| Step | Where | Action | What to send back |
|------|--------|--------|-------------------|
| 3.1 | Browser | Open https://llmhosts.com and log in. | Pass/Fail. |
| 3.2 | Browser | Dashboard → Overview. Page loads. | Pass/Fail. |
| 3.3 | Browser | Dashboard → Topology. | What you see (empty, N nodes, error). Pass if no 5xx. |
| 3.4 | Browser | Dashboard → Devices (if it exists). Does the Alienware (or your host) appear? | Y/N / N/A. |

---

# Part 4 — What to send back

**Option A (best):** Copy `docs/testing/P5-external-connectivity-results-template.md` to `P5-external-connectivity-results-YYYY-MM-DD.md`. Fill: run date, machine names, tunnel URL(s), result summary (Smoke / A / B), per-step pass/fail, and for any failure paste the exact command, full error, and timestamp. Then paste the file into a comment on **GitHub issue #255** or here in chat.

**Option B (minimum):** Comment on **#255** (or paste in chat):

```
P5 run YYYY-MM-DD (Alienware)
- Scenario A (Alienware client): Pass / Fail
- Scenario B (Alienware host): Pass / Fail
- Tunnel URL (host for Part 1): ...
- Tunnel URL (Alienware for Part 2): ...
- Failures: [paste errors or "none"]
- What worked / what didn't: [1–2 sentences]
```

---

## Where everything lives

| Document | Path | Purpose |
|----------|------|---------|
| **This checklist** | `docs/testing/P5-external-connectivity-human-checklist.md` | Human steps and what to send back. |
| Full runbook | `docs/testing/P5-external-connectivity-runbook.md` | All scenarios, AI/human, code refs. |
| Results template | `docs/testing/P5-external-connectivity-results-template.md` | Copy to `results-YYYY-MM-DD.md` and fill. |
| GitHub issue | [#255](https://github.com/LookNoHandsMom/LLMHosts.com/issues/255) | Comment with results; close when done. |
