# Build Guide: Reddit Shadowban Checker

## 1. Build objective

Create a utility-first page at:

`/reddit-shadowban-checker/`

The checker must be the first meaningful content after the existing site header. It should feel like a free account-health tool, not a product landing page or long-form blog post.

Use the site’s existing:

- Header, footer and navigation
- Page-width containers and spacing scale
- Typography and heading styles
- Form, button, alert, table and icon components
- Color tokens, border radii and shadows
- Dark-mode behavior, if supported
- Analytics and consent implementation

Do not introduce a separate visual theme for this page.

Use the supplied written page as the source of truth for headings and prose. Do not replace its headings with wording from this guide. Match sections by their meaning and order.

---

## 2. Page structure

Build the page in this order:

```text
Existing site header
Main
  Checker hero
    H1
    One-line introduction
    Checker form
    Dynamic results
    Static result legend
    Checker methodology/supporting copy

  Shadowban explanation
    Definition
    Signs list
    Status comparison table
    “Visible account but hidden posts” explanation

  Manual confirmation
    Three numbered check methods
    Partial-shadowban note

  Recovery and next steps
    Appeal steps
    Duration
    Recovery likelihood
    Starting over
    Linked/alternate accounts

  Causes and prevention
    Common causes list
    Prevention list

  About the tool
    Trust/privacy statement
    Two inline closing links
Existing site footer
```

Use one H1 only. Major sections are H2s; question-level subsections and individual manual checks are H3s. Do not place substantive copy in accordions or tabs—the full explanation should remain visible and server-rendered.

Recommended stable anchors:

- `#checker`
- `#what-a-shadowban-means`
- `#confirm-the-result`
- `#appeal`
- `#causes`
- `#about-the-tool`

The “run another check” link should point to `#checker`.

---

## 3. Checker hero

### Layout

Keep the hero compact so the form is visible above the fold on common desktop and mobile screens. Do not add an illustration, promotional banner, product cards or a large breadcrumb treatment above it.

Use this order:

1. H1
2. Introductory sentence
3. Checker card
4. Dynamic result panel
5. Persistent result legend
6. The supplied paragraphs explaining who can be checked and how the check works

The checker card should be centered and approximately 720–800px wide. Supporting copy may use the normal article width.

### Form

Use a visible label and a multiline textarea so users can enter one username or several usernames, one per line.

Required controls:

- Label: use the supplied form label, or “Reddit username(s)” if none is provided
- Textarea
- Short helper text explaining one username per line
- Primary Check button
- Inline validation/error area

Do not request:

- Reddit login details
- Reddit access tokens
- Email addresses
- Payment details
- Marketing consent

The button should use the supplied CTA wording. If no CTA is supplied, use “Check username” for one entry and “Check usernames” for multiple entries.

### Input handling

On submission:

1. Split entries by line.
2. Trim whitespace.
3. Accept and normalize:
   - `username`
   - `u/username`
   - `/u/username`
   - `@username`
   - A full `reddit.com/user/username` or `reddit.com/u/username` URL
4. Deduplicate usernames case-insensitively.
5. Validate against Reddit username syntax.
6. Escape all displayed values.
7. Check no more than 10 unique usernames in one submission.

Show clear validation for blank, malformed or excessive input. Do not place usernames in the page URL, query string, analytics payload or browser history.

Ordinary Enter should add a new line. Support Ctrl/Cmd + Enter to submit.

### Loading behavior

While checking:

- Keep the submitted usernames visible
- Disable duplicate submission
- Show a spinner and “Checking…” state
- For a batch, show progress such as “Checking 2 of 5”
- Do not hide the static legend or the rest of the page

After completion, move keyboard focus to a result-summary heading without scrolling the heading under a sticky site header.

---

## 4. Results panel

Insert results between the form and the static legend. Show one result card or row per username, in input order.

Each result must contain:

- Normalized username in the form `u/username`
- Status icon
- Written status label
- Full-sentence explanation
- Recent-post visibility line when reliable data exists
- UTC timestamp
- Link to the public Reddit profile

Use a timestamp format that is clear in screenshots:

`Checked 12 Jun 2025, 14:32 UTC`

The four semantic statuses are:

### Visible

- Green success treatment
- Label: “Visible”
- Explain that the public profile loads
- State whether recent posts were publicly visible, if tested

### Shadowbanned

- Red danger treatment
- Label: “Shadowbanned” or the supplied equivalent
- Explain that the public profile is unavailable while the account is otherwise known to remain active
- Use “appears to be shadowbanned” where the backend reports a likely rather than confirmed result

### Suspended

- Amber warning treatment
- Label: “Suspended”
- Explain that Reddit displays a suspension state and that this is not a shadowban

### Not found

- Neutral treatment
- Label: “Not found”
- Explain that the username may be misspelled, deleted or never registered

Icons and written labels are required; do not communicate status through color alone.

### Operational failures

Network failures, rate limiting, timeouts and malformed upstream responses are not account statuses. Show a separate error state:

- “This account could not be checked right now.”
- Include a Retry control
- Do not map errors or HTTP 429/5xx responses to “Shadowbanned” or “Not found”

For a mixed batch, preserve successful results and show errors only for affected usernames.

### Recent-post visibility

Use one of these supporting values:

- Recent posts are publicly visible
- Recent posts appear to be hidden
- No recent posts were available to test
- Recent post visibility could not be tested

Do not infer that posts are hidden merely because the public account has no recent submissions. Only report hidden posts when the checker has a reliable comparison signal.

If the profile is visible but reliable evidence says recent submissions are hidden, keep the primary state as Visible and add a prominent warning line. The written page’s partial-shadowban explanation provides the context.

---

## 5. Checker backend

Use the site’s existing account-health or fulfillment checker as the first-choice data source. The page states that it uses the same check the business applies before account delivery, so both workflows must call the same underlying service or shared library.

Expose it through a server-side route following the project’s existing API conventions. A suitable logical contract is:

```json
POST /api/reddit-shadowban-check
{
  "usernames": ["example_user", "second_user"]
}
```

```json
{
  "checkedAt": "2025-06-12T14:32:00Z",
  "results": [
    {
      "username": "example_user",
      "status": "visible",
      "confidence": "confirmed",
      "profileVisible": true,
      "recentPostsVisibility": "visible",
      "profileUrl": "https://www.reddit.com/user/example_user/"
    }
  ]
}
```

Allowed status values:

```text
visible
shadowbanned
suspended
not_found
error
```

Allowed post-visibility values:

```text
visible
hidden
none
unknown
```

### Detection safeguards

Status precedence should be:

1. Explicit suspension signal → Suspended
2. Valid public profile → Visible
3. Public profile absent while a separate reliable signal confirms the account still exists and remains usable → Shadowbanned
4. No reliable existence signal → Not found

A bare profile 404 is not, by itself, enough to prove a shadowban because Reddit can return an unavailable profile for deleted or nonexistent accounts. Do not present a definite shadowban verdict from an ambiguous 404.

If the existing checker returns confidence, preserve it. Use “appears to be” for likely results and unqualified wording only for confirmed results.

All Reddit credentials, service tokens and implementation details must remain server-side. “No token required” means the visitor does not provide one; it does not prevent the server from using the site’s own approved credentials.

Set a reasonable upstream timeout, retry a rate-limited request only when the upstream response permits it, and keep batch concurrency low. Follow Reddit’s current API terms and use the site’s identifying server user agent.

Return `Cache-Control: no-store` for checker responses.

---

## 6. Static result legend

Keep the four-state legend visible before and after a check. This is indexable explanatory content, not a replacement for dynamic results.

Build it as four compact rows containing:

- Status icon
- Status name
- One complete explanatory sentence

On desktop it may be a four-column strip or stacked rows. On mobile it must become a single column. Do not truncate the explanations.

---

## 7. Explanatory content components

### Shadowban definition and signs

Render the definition as a short paragraph followed by the supplied signs as a standard bulleted list. Keep the closing qualification about low engagement visually attached to the list.

### Status comparison

Use a semantic HTML table.

Columns:

- Row heading
- Shadowban
- Suspension
- Subreddit ban
- Removed or filtered post

Rows:

- Notice received
- Logged-out profile behavior
- Who applied it
- Where to appeal or resolve it

Use `<th scope="col">` and `<th scope="row">`. On narrow screens, place the table in a horizontally scrollable region with an accessible label. Keep the first column visible if the site’s table component supports sticky row headings.

Do not create separate desktop and mobile copies of the table.

### Manual checks

Render the three manual confirmation methods as numbered step blocks. Each block should have:

- Number
- H3
- Two to four short ordered steps
- A final “how to read the result” sentence
- Relevant Reddit link

Use these destinations where the written copy refers to them:

- Profile: `https://www.reddit.com/user/{username}/`
- Appeals: `https://www.reddit.com/appeals`
- ShadowBan community: `https://www.reddit.com/r/ShadowBan/`

After a successful check, the profile link may use the first checked username. Before a check, display the URL pattern as text rather than linking to a placeholder account.

Follow the site’s normal external-link behavior and include `rel="noopener noreferrer"` when opening a new tab.

### Appeal and recovery section

Use the supplied appeal instructions as a true ordered list. Keep duration, likelihood, starting-over and linked-account content as separate H3 subsections or clearly separated paragraphs according to the written page.

Do not add:

- Antidetect browser recommendations
- Proxy tutorials
- Fingerprint configuration
- Detailed ban-evasion workflows
- Additional warm-up protocols
- Contributor Quality Score material

### Causes and prevention

Use two H3s followed by two bulleted lists. They may sit in two columns above approximately 900px and must stack on smaller screens.

Do not turn this section into cards with product promotion.

---

## 8. Commercial links

The page must not look like a sales page.

The established-account offer appears only:

1. As an inline text link in the supplied fallback/start-over paragraph
2. In the final closing line in the About section

Link to the site’s existing canonical established Reddit accounts collection or product page. Reuse the live route already present on the site; do not create a duplicate product route.

Do not add:

- Product grids
- Prices
- “Buy now” buttons
- Sticky sales CTAs
- Promotional banners
- Exit-intent modals
- Testimonials inside this page

The final “run another check” link should be visually equal to the product link, not subordinate to a large sales button.

---

## 9. Privacy and security

The page claims the checker stores nothing about the username or person checking. Implement accordingly:

- Use POST, not query parameters
- Do not persist submitted usernames
- Do not include usernames in application logs or error traces
- Mask the textarea in session-replay tools
- Do not send field values to analytics
- Do not retain result histories in local storage
- Do not add accounts to recent-search lists
- Use only transient, non-persistent abuse controls if required
- Sanitize and encode usernames before rendering or constructing URLs

No email capture, login wall or CAPTCHA should appear during normal use. Existing edge-level abuse protection may be used if the endpoint is attacked.

---

## 10. Accessibility and responsive behavior

Meet WCAG 2.2 AA standards.

Required behavior:

- Visible form label
- Associated helper and error text
- Keyboard-operable submission and retry controls
- `aria-busy="true"` while the checker is running
- A polite `aria-live` region for progress
- Result summary receives focus after completion
- Status icons marked decorative when the written label provides the meaning
- Minimum 44px touch targets
- Sufficient contrast for all status treatments
- No horizontal page overflow
- Table scroll region is keyboard accessible
- Reduced-motion preference respected

On mobile:

- Stack textarea and button
- Show one result card per username
- Keep full explanations and timestamps visible
- Stack cause/prevention lists
- Avoid oversized top spacing that pushes the checker below the fold

Include a small `<noscript>` message stating that JavaScript is required to run the checker while leaving the written guide readable.

---

## 11. SEO and metadata

All written explanatory content and the static legend must be server-rendered. Only submitted results should be client-rendered.

Use the writer-supplied SEO title and H1. If no separate metadata is supplied, use:

- **Title:** `Reddit Shadowban Checker: Free Instant Test for Any Username`
- **Meta description:** `Check whether any Reddit username is visible, suspended, not found or likely shadowbanned. Free Reddit shadowban test with no login required.`
- **Canonical:** the absolute canonical URL for `/reddit-shadowban-checker/`

Add normal Open Graph and social metadata using the site’s existing implementation.

Add `WebApplication` structured data:

- Name from the page title
- Application category: `UtilityApplication`
- Operating system: `Web`
- Current canonical URL
- `isAccessibleForFree: true`
- Offer price `0` in `USD`

Do not add review ratings or claims unsupported by the page. Do not add FAQ schema unless the final written page contains a discrete, visible FAQ section in question-and-answer form.

Dynamic username checks must not generate indexable URLs or separate result pages.

---

## 12. Analytics

Use the existing analytics provider only. Track:

- Checker submitted
- Checker completed
- Retry used
- Appeal link clicked
- Established-accounts link clicked
- Run-another-check link clicked

Permitted event properties:

- Number of usernames
- Completion time
- Aggregate count by status
- Whether the batch contained an error

Never send usernames, profile URLs, entered text or other identifying values.

---

## 13. Acceptance checks

Before publishing, verify:

1. The checker is usable without login, email or a user-supplied token.
2. Single and multiline username checks work.
3. `u/name`, `@name` and Reddit profile URLs normalize correctly.
4. Duplicate usernames are checked once.
5. Visible, suspended, shadowbanned and not-found fixtures render distinct results.
6. A bare 404 is not falsely presented as a confirmed shadowban.
7. Timeouts, 429s and 5xx responses produce Retry errors rather than account verdicts.
8. Mixed batches preserve successful results.
9. Every result includes a complete sentence and UTC timestamp.
10. No username appears in URLs, analytics, storage or logs.
11. The static four-state legend is present before running the tool.
12. The comparison table remains usable on mobile.
13. The three manual-check links work.
14. The appeal link points to Reddit’s current appeal page.
15. Product links are inline only and use the existing canonical product route.
16. There is one H1 and a logical H2/H3 hierarchy.
17. Static content is present without JavaScript.
18. Keyboard, screen-reader and mobile tests pass.
19. Metadata, canonical and structured data validate.
20. No additional sales modules, evasion tutorials or unrelated account-management content have been added.