hardy-emails is a public website for searching and extracting email addresses. A visitor arrives, enters a search query, receives matching email addresses as results, and can then extract those addresses into a usable list. The product intent is narrow and exact: make email discovery and collection fast, legible, and trustworthy for people who work with email data.
The audience is the Email researcher — a person who needs to find email addresses by query and turn the matches into a clean, usable list. The product is a public tool: no account, sign-in, or personal workspace is required to search or extract.
This document is the System Requirements Document for hardy-emails, written from the requester's stated product intent.
hardy-emails is delivered as a three-part web application:
All three pages are public (access_requirement: none). There is no application-owned identity, no sign-in, and no per-user persistence. A visitor can move from Landing to Search to Extract without establishing an account.
The accepted behavior is: search for email addresses, and extract email addresses from search results. The supporting interaction mechanics — entering a query, and triggering extraction from the results — are the minimum needed to make those two commitments executable.
Removed from scope
hardy-emails is a first-party public web tool. The application owns the full lifecycle of both accepted capabilities: the visitor enters a query on the Search page, the backend returns matching email addresses, and the visitor triggers extraction on the Extract page to receive a usable list of those addresses.
Access is open. Because no accepted behavior requires a durable, privately owned, or resumable per-user state, no identity establishment, verification, or account management is introduced. The Landing page is the anonymous public entry; Search and Extract are equally public working surfaces. Nothing in the current scope is delegated to a provider surface or an external destination.
The current delivery horizon covers only search and extraction. Future ideas — such as saved lists or verification — are not part of this release and are not represented in any page or requirement.
FR-1 — Search for email addresses (explicit) As an Email researcher, I should search for email addresses so that I can find the addresses matching my query.
FR-2 — Extract email addresses from search results (explicit) As an Email researcher, I should extract email addresses from search results so that I get a usable list of addresses.
FR-3 — Enter a search query (required_inference) As an Email researcher, I should enter a search query so that the search has an input to act on.
FR-4 — Extract addresses from the results (required_inference) As an Email researcher, I should trigger extraction from the results so that the addresses become a usable list.
The creative direction is authoritative: typographic infrastructure in the spirit of Erik Spiekermann — warm order built from type and signal colour, like a transit system for data.
Palette (light mode)
| Role | Hex | Usage |
|---|---|---|
| Background | #F4F1EA | Warm paper ground, ~70% of surface |
| Surface | #FFFFFF | Result rows, panels |
| Text | #1A1A18 | Ink for all type |
| Primary | #D7261E | Signal red for search and extract actions |
| Accent | #F2B705 | Yellow tag chips on result rows |
| Muted | #6E6A62 | Metadata, counts, secondary labels |
Typography
clamp() so text stays whole at 375px, 768px, and 1280px.Shape language
Layout
Motion
Imagery
The public entry is a full-width ruled band on warm paper #F4F1EA. A 96px flush-left headline in Fira Sans Bold sits above a wide search field with a solid red square button (#D7261E) pinned to its right edge. A yellow line-code tag (#F2B705) reads LINE 01 — SEARCH. A left rail of numbered line codes marks each section like a transit map, and a small schematic line map shows the search → extract flow. The composition recomposes only accepted content — the product statement, the entry action, and the flow schematic — with no new behavior.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
clamp().prefers-reduced-motion, a usable static arrangement is provided; row slide-in is suppressed.docker-compose.yml provisioning the backend, database, and frontend services.#F2B705 label attached to each result row and extracted address.
Line 01 — Search
Search and extract email addresses — enter a query, read the matching addresses, and take them away as a clean list.

Line 01 — Search
Search and extract email addresses — enter a query, read the matching addresses, and take them away as a clean list.
No comments yet. Be the first!