wild-hu is a basic web site for testing APIs. It gives engineers and testers a single browser-based instrument for firing an HTTP request at an API endpoint and reading the exact response that comes back — the method, the URL, the headers, the body, the status code, and the timing — without leaving the browser for a terminal or a desktop client.
The product intent is deliberately narrow: one request, one response, one exact reading. The site is not a workspace, a collection manager, or a collaboration platform. It is a precision instrument whose whole job is to show exact codes and exact payloads, and whose interface is built to stay out of the way of that reading.
The audience is developers and QA/testers who already understand HTTP, who live in terminals and browser inspectors, and who distrust marketing gloss. They want to type a URL, choose a method, send, and see the truth. The site is public and requires no account: opening it and sending a request is the entire first-use experience.
wild-hu is delivered as a first-party web application with two pages:
Both pages are reachable without any account, sign-in, or identity establishment. There is no application-owned identity in the current product: no user record, no saved history, no private state to resume. A visitor who reloads the page starts a fresh, empty request. This is a deliberate consequence of the accepted scope — a basic testing site — and not an omission to be filled with adjacent account features.
The system has one human actor, the API Tester, and one non-persona actor: the target API endpoint, an external HTTP server owned by whoever the tester chooses to call. wild-hu does not own, host, or proxy that endpoint; it sends the tester's request to it and renders whatever comes back.
Current delivery boundary. Current work covers: the Landing entry surface, the API Tester instrument, request composition (method, URL, headers, body), request dispatch, response rendering (status code, status text, headers, body, elapsed time, response size), the coded status alphabet, and the error/recovery states for malformed input, network failure, timeout, and cancellation.
Narrow exclusions. The current product does not include: accounts, sign-in, or saved request history; collections, folders, or environments; automated test suites, assertions, or CI integration; team sharing or collaboration; API mocking or proxying; authentication helpers such as OAuth flows or token vaults; or any analytics or telemetry surface. These are not prohibited forever — they are simply not part of the accepted current scope, and nothing in this document should be read as building them.
What the product is. A browser page that sends one HTTP request and shows you exactly what came back. The tester supplies a method, a URL, optional headers, and an optional body; the site dispatches that request from the browser and renders the response as a ruled data sheet: a status square with its numeric code, the status text, the response headers, the body, the elapsed time, and the size.
Who owns what. wild-hu owns the request bar, the request editor, the response viewer, the status legend, and the error states. The target API endpoint is external and owns its own behaviour — its availability, its latency, its status codes, and its payloads are outside wild-hu's control, and the site's job is to report them faithfully rather than to interpret or correct them. The browser's own networking layer performs the dispatch; wild-hu does not run a server-side proxy for the tester's requests in the current scope.
Access. Both pages are public and anonymous. No account is created, no session is established, and no state persists between visits. Because there is no durable actor-specific state, no commitment, and no value transfer that must remain bound to a particular person, application-owned identity is not required and is not introduced.
Current versus future. Everything described in sections 2c, 3, and 5 is current. Anything a reader might expect from a fuller API client — saved requests, collections, environments, assertions, sharing — is future at best and is not specified here. The one thing the current product must do well is the request/response cycle, read exactly.
Information and state. The page is a full-bleed ink-black field. Its content is: a top-left metadata block reading WILD-HU / API TESTER / v1.0; the oversized display statement SEND. READ. REPEAT.; one line of body copy describing what the tool does; the request bar as the hero artefact; and a bottom-right coded status legend. There is no conventional header bar, no nav menu, and no centred headline-plus-subtext-plus-button stack.
Primary action. Proceed into the API Tester. The request bar on the Landing page is the entry gesture: the visitor can type an endpoint into the URL field and press SEND, which carries them into the API Tester with that URL pre-filled and the request ready to dispatch. A secondary, quieter path is a direct link into the API Tester with an empty request.
Supporting actions. Choose the HTTP method from the method chip (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS). Read the status legend to learn the colour code before using the tool.
Domain entities. None persisted. The only entity in play is the in-flight request the visitor is composing.
Component responsibilities.
clamp(40px, 9.5vw, 132px), flush-left across nine columns, ragged-right; the third word in Saville orange, the rest off-white.#2A2A2D border, divided by vertical hairlines into method chip / URL field / SEND block. The SEND block is solid Saville orange and bleeds flush to the grid edge.States.
Information and state. A two-zone instrument face. The request bar spans all twelve columns at the top. Below it, a 5/7 split: the request editor on the left, the response viewer on the right. Everything is flush-left, ragged-right, aligned to visible column rules. The page carries the same top-left metadata block and bottom-right status legend as the Landing page.
Primary action. Send the composed request and read the response.
Supporting actions. Change the HTTP method; edit the URL; add, edit, and remove request headers as ruled rows; edit the request body as monospaced text; cancel an in-flight request; clear the request and start over; copy the response body to the clipboard.
Domain entities.
Component responsibilities.
#141416 with hairline row rules; header rows have a name field, a value field, and a remove control; an add-header control appends a new ruled row.States.
#6E6E73 and reads ---; the SEND block reads CANCEL; the response viewer shows an empty ruled sheet with no rows.#E8552A, the code reads ERR, and a single off-white line names the failure (for example, the endpoint refused the connection or the host could not be resolved).#E8552A, the code reads TIMEOUT, and the elapsed time is shown.#E8552A, the code reads CORS, and a single off-white line explains that the endpoint did not permit the browser to read the response.#6E6E73, the code reads CANCELLED, and the response viewer keeps whatever had already rendered.As an API Tester I should open the wild-hu site and immediately understand that it is a tool for sending HTTP requests and reading responses so that I can decide whether it does what I need without reading documentation.
required_inference (Landing page rationale: mandatory anonymous public entry that explains the product before any protected work).As an API Tester I should choose an HTTP method, enter a URL, and optionally add request headers and a request body so that I can describe exactly the request I want to send.
explicit (build a basic web site for testing APIs).As an API Tester I should press SEND and have wild-hu dispatch my request to the endpoint I named so that I can observe how that endpoint actually behaves.
explicit (build a basic web site for testing APIs).#6E6E73 and reads ---; the SEND block becomes CANCEL.As an API Tester I should see the response status as a coded colour square paired with its exact numeric code and status text so that I can read the outcome at a glance and still have the exact code when I need it.
explicit (build a basic web site for testing APIs) with the coded status alphabet supplied by the creative direction.#9BE84B for 2xx, #E8C64B for 3xx and 4xx, #E8552A for 5xx and errors, #6E6E73 for pending — beside the numeric code and the status text in IBM Plex Mono.As an API Tester I should see the response headers, the response body, the elapsed time, and the response size rendered as a ruled data sheet so that I can inspect exactly what the endpoint returned and how long it took.
explicit (build a basic web site for testing APIs).As an API Tester I should be told plainly when a request could not be completed and be able to retry without losing my work so that I can distinguish a broken endpoint from a broken request.
required_inference (indispensable failure and recovery mechanics for the accepted send-and-read lifecycle).#E8552A with the code ERR, TIMEOUT, or CORS, or #6E6E73 with the code CANCELLED, and a single off-white line names the failure.As an API Tester I should be able to cancel a request that is taking too long so that I am not held hostage by a slow or hanging endpoint.
required_inference (indispensable control over the accepted send lifecycle).#6E6E73 and reads CANCELLED; whatever had already rendered in the response viewer remains.As an API Tester I should be able to clear the request editor and the response viewer so that I can start a fresh reading without reloading the page.
required_inference (indispensable continuation mechanic for repeated use of the accepted send-and-read lifecycle).As an API Tester I should be able to copy the response body to my clipboard so that I can paste it into an issue, a test, or another tool.
required_inference (indispensable handoff of the accepted response reading into the tester's other work).Product context. The API Tester is a developer or QA engineer working against an HTTP API — their own, a colleague's, or a third party's. They are usually mid-task: a build is failing, an endpoint is returning something unexpected, a contract needs checking, or a payload needs inspecting. They already know HTTP. They know what a 404 means, they know what a header is, and they do not need the tool to explain any of it. What they need is a place to type a URL, pick a method, send, and see the truth without ceremony.
Primary goal. Send one HTTP request to one endpoint and read exactly what came back — the status code, the headers, the body, the time, and the size — with enough fidelity to act on it.
Distinct accepted responsibilities.
Relevant inputs and decisions. The method and URL are the primary inputs; headers and body are conditional on what the endpoint expects. The recurring decision is whether the response is the endpoint's fault or the request's fault — which is exactly what the coded status alphabet and the distinct error states are there to answer.
Interactions with other accepted participants. The only other participant in the lifecycle is the target API endpoint, an external HTTP server owned by someone else. The tester's interaction with it is indirect: they name it, wild-hu dispatches to it, and it answers. The tester never negotiates with wild-hu about the endpoint's behaviour; wild-hu reports it.
Observable success. The tester sees the exact status code, the exact headers, and the exact body they were looking for, in a form they can read at a glance and copy out — and knows, without ambiguity, whether a failure came from their request or from the endpoint.
What makes this role distinct. There is no second human role in this product. The API Tester is simultaneously the author of the request and the reader of the response; there is no reviewer, approver, or recipient to hand off to, and no shared state for anyone else to see. That is why the product has no accounts, no sharing, and no history: the entire lifecycle begins and ends with one person at one instrument.
WILD-HU / API TESTER / v1.0; the display statement SEND. READ. REPEAT. sits flush-left across nine columns with the third word in Saville orange; one line of body copy describes the tool; the request bar spans the grid; the coded status legend sits bottom-right.#9BE84B for 2xx, #E8C64B for 3xx and 4xx, #E8552A for 5xx and errors, #6E6E73 for pending.GET from the method list. The chip takes Saville orange.#6E6E73 and reads ---; the SEND block becomes CANCEL.POST from the method chip.Content-Type in the name field and application/json in the value field of the first ruled row.Authorization and its value.#E8552A and the code reads ERR; a single off-white line names the failure, such as the host not resolving or the connection being refused. The tester checks the URL and their network, corrects the request, and presses SEND again.#E8552A, the code reads TIMEOUT, and the elapsed time is shown. The tester either retries or presses CANCEL on a subsequent attempt.#E8552A, the code reads CORS, and a single off-white line explains that the endpoint did not permit the browser to read the response. The tester understands that the endpoint answered but the browser withheld the body, and adjusts their expectation or their endpoint's configuration.#E8C64B or #E8552A accordingly, and the exact numeric code, status text, headers, and body all render. The tester reads the body to find out what the endpoint objected to.--- in #6E6E73 and the SEND block reads CANCEL.#6E6E73 and reads CANCELLED. Whatever had already rendered in the response viewer remains on screen.The creative direction is authoritative for this section. The muse is Peter Saville; the headline idea is one coded artefact, a lot of silence. The tool is treated as a piece of scientific apparatus, not a SaaS dashboard: an ink-black instrument face with a single exact spot colour, hard edges, hairlines, and gallery-like emptiness.
| Role | Hex | Use |
|---|---|---|
| Background | #0B0B0C | Full-bleed page ground; the instrument face. |
| Surface | #141416 | Panels one step lighter — request editor, response viewer. |
| Text | #F2F0EB | All type, off-white on black; contrast > 15:1. |
| Primary | #E8552A | Saville orange. The only identity colour: primary action, active method chip, focused field border, 5xx and error status. Nothing else. |
| Accent | #9BE84B | 2xx status only. |
| Status — 3xx/4xx | #E8C64B | 3xx and 4xx status only. |
| Status — pending | #6E6E73 | Pending, cancelled, and muted text. |
| Rule | #2A2A2D | 1px hairlines: borders, row rules, grid rules. |
Status colour is a code system, never decoration. Every status square is paired with its numeric code so colour is never the only signal.
clamp(40px, 9.5vw, 132px) for the hero statement; clamp(28px, 4vw, 48px) for page titles.Hard edges and hairlines only. Radii 0–2px. 1px rules at #2A2A2D. Panels butt directly against each other rather than float. The request bar is a single 56px-tall rectangle divided by vertical hairlines into method / URL / send — one object, not three cards. Status is a 10px square of coded colour plus a monospaced number, never a pill or a badge. No shadows, no glows, no rounded blobs.
A 12-column grid with a 48px outer margin (24px on mobile) and a huge empty band above the fold. The Landing page is a full-height black field whose only artefact is the centred request bar, with a small metadata block top-left and the code legend bottom-right. The API Tester page is a two-zone instrument face: the request bar spanning columns 1–12 at the top, then a 5/7 split with the request editor on the left and the response viewer on the right. Everything is flush-left, ragged-right, aligned to visible column rules.
No photography, no illustration, no 3D. The imagery is the artefact itself: a scientific-diagram treatment of the request/response cycle drawn in 1px white lines on black (client box → arrow → server box → arrow back), a colour-code legend rendered as a row of labelled squares, and monospaced JSON as the only "picture" on the page. Found-diagram austerity; everything else is silence.
Any blue or indigo primary (#0057FF, #2563EB, #4F46E5) — the only identity colour is Saville orange #E8552A. Rounded cards, floating panels, drop shadows, glassmorphism. Gradient blobs, glows, or any decorative background behind the request bar. Pill-shaped status badges, or colour without the numeric code beside it. Inter, Roboto, Poppins, system-ui, or any neutral template sans for headings or body. Bouncy or springy motion, hover-lift cards, animated illustrations. Photography, 3D renders, emoji, or character illustration anywhere on the site. A centred hero stack of headline + subtext + button with a nav bar above it.
The instrument is the hero.
The Landing page is a full-bleed #0B0B0C field — not a card, not a gradient, not a hero image. The dominant element is the request bar: a single 56px-tall, full-grid-width black rectangle with a 1px #2A2A2D border, split by vertical hairlines into a method chip (GET, in Saville orange when active), a monospaced URL field showing a live placeholder endpoint, and a solid #E8552A SEND block flush to the right grid edge. It is one object, not three cards.
Above it, at the top-left of the grid, a small metadata block reads WILD-HU / API TESTER / v1.0 in 11px uppercase Archivo at 0.18em tracking. Below the bar, one line of off-white body copy at 18px, ragged-right, max 46 characters. In the lower-right corner, the coded status legend: four 10px squares with their codes.
The oversized display statement SEND. READ. REPEAT. is set in Archivo 400 at clamp(40px, 9.5vw, 132px), flush-left across nine columns, with the third word in #E8552A and the rest off-white.
There is no centred headline, no subtext stack, no blue button, no blob. The instrument is the hero, and the emptiness around it is the composition. The signature moves are: the request bar as a single ruled artefact; the coded status alphabet repeated as a corner legend on both pages; the oversized display statement; metadata blocks instead of a nav bar; and the response viewer as a ruled data sheet with a 12ms-per-line streaming reveal that stops dead when the body ends.
Interaction Model: Static (direction) Motion Tempo: still Hero Dimensionality: flat
Focal subject. The request bar — the single ruled artefact that is the product's whole identity.
Input → transformation → outcome thesis. The visitor focuses the URL field; a single 1px rule draws across the request bar; the visitor presses SEND and the bar's SEND block hands off to the API Tester, where the status square swaps colour instantly as the response lands. The motion is mechanical feedback, not animation: the instrument responds to being operated.
Motion vocabulary. One slow fade-and-settle on first load (240ms, no bounce). A single 1px rule that draws across the request bar on focus. A status square that swaps colour instantly with no transition. Response body lines revealing at 12ms per line while streaming, then stopping dead.
Composed first frame. The full-bleed #0B0B0C field at rest: metadata block top-left, display statement flush-left across nine columns, the request bar spanning the grid with its hairline divisions, one line of body copy below, the four-square status legend bottom-right. Nothing moves until the visitor touches the bar.
Reduced-motion state. With prefers-reduced-motion: reduce, the first-load fade becomes instant, the focus rule is drawn statically rather than animated, and the response body renders in full rather than line by line. Every state remains fully readable and every control remains operable.
required_inference from the accepted "web site for testing APIs" scope; a browser-based tester is the minimal truthful implementation.explicit — the accepted scope is a basic testing site with no identity requirement, and no durable actor-specific state exists that would justify one.explicit from the creative direction's coded status alphabet.font-size: clamp(...) with its mobile size) to fit. No other element covers any part of them. Provenance: explicit from the creative direction's readability rule.prefers-reduced-motion: reduce, all reveals become instant and the focus rule is drawn statically. Provenance: explicit from the creative direction.#F2F0EB on #0B0B0C, a contrast ratio above 15:1. Provenance: explicit from the creative direction.TIMEOUT rather than hanging indefinitely. Provenance: required_inference — the accepted send lifecycle needs a terminal state for an unresponsive endpoint.explicit — no such capability is in the accepted scope.docker-compose.yml as the runnable service inventory — one application service. [Default — not specified by user]No source-specified technology choices were given, so the above are labeled defaults and carry no product behaviour.
CORS state rather than a readable body; this is a browser and endpoint constraint, not a wild-hu defect. (Assumption; drives FR-6 Case D.)#9BE84B for 2xx, #E8C64B for 3xx and 4xx, #E8552A for 5xx and errors, #6E6E73 for pending.#6E6E73, code ---.#E8552A, code CORS.WILD-HU / API TESTER / v1.0, top-left of the grid, replacing a conventional header bar.

What it does
One request, one exact reading — status, headers, body, time.
No comments yet. Be the first!