[BREAKGLASS] BTCPay Server Directory - Merchants, Projects & Charities accepting Bitcoin https://directory.btcpayserver.org/
Go to file
Pavlenex c7a7e06d08
Some checks failed
Build & Deploy / build (push) Has been cancelled
Build & Deploy / deploy (push) Has been cancelled
Add new merchants
close #567  #567 #565 #563 #562
2026-05-21 22:20:35 +05:00
.github/workflows Simplify footer and fix GitHub Pages deployment 2026-02-12 15:53:50 +04:00
public change website preview 2026-03-17 11:03:41 +01:00
scripts Directory improvements: category restructure, country filters, dead link checker 2026-02-12 20:01:17 +04:00
src Add new merchants 2026-05-21 22:20:35 +05:00
.DS_Store Improve opengraph, remove docs link from header, refine copy 2026-02-12 16:11:46 +04:00
.gitignore Security headers and sanitizing links 2026-02-12 22:33:48 +04:00
index.html fix : space in title + opengraph preview 2026-03-17 21:26:29 +01:00
LICENSE Initial commit 2020-03-23 10:35:04 +01:00
netlify.toml fix netlify build 2026-02-12 16:02:03 +04:00
package-lock.json Bump vite from 6.4.1 to 6.4.2 2026-04-07 04:27:36 +00:00
package.json Bump vite from 6.4.1 to 6.4.2 2026-04-07 04:27:36 +00:00
README.md change CTA text 2026-02-26 13:39:37 +04:00
tsconfig.app.json Redesign directory from scratch 2026-02-12 15:45:00 +04:00
tsconfig.json Redesign directory from scratch 2026-02-12 15:45:00 +04:00
vite.config.ts Redesign directory from scratch 2026-02-12 15:45:00 +04:00

BTCPay Server Directory

Merchants, projects, and organizations accepting Bitcoin with BTCPay Server.

Live at directory.btcpayserver.org

Development

npm install
npm run dev        # Start dev server
npm run build      # Type-check + production build
npm run preview    # Preview the production build locally

Requires Node 20+.

Adding a new entry

Entries live in src/data/merchants.json. Each entry follows this structure:

{
  "name": "Store Name",
  "url": "https://example.com",
  "description": "Short description (max 250 chars).",
  "type": "merchants",          // required — see valid types below
  "subType": "electronics",     // required for type "merchants"
  "country": "US",              // optional — for type "hosted-btcpay" only
  "twitter": "@handle",         // optional
  "github": "https://github.com/org",  // optional
  "onionUrl": "http://...onion" // optional
}

Valid type values

Type Description
merchants Stores and services (requires subType)
apps Applications built on BTCPay Server
hosted-btcpay BTCPay Server hosting providers (supports optional country)
non-profits Non-profit organizations

Merchant subtypes

3d-printing, adult, appliances-furniture, art, books, cryptocurrency-paraphernalia, domains-hosting-vpns, education, electronics, fashion, food, gambling, gift-cards, health-household, holiday-travel, jewelry, payment-services, pets, services, software-video-games, sports, tools

Country codes (for hosted-btcpay)

Use ISO 3166-1 alpha-2 country codes (e.g. US, BR, IT) or GLOBAL for providers without a specific region. The UI converts these to flag emojis automatically.

Public submissions

End users submit new entries via the Submit Entry button on the site, which opens a pre-filled GitHub Issue. Maintainers review the issue and manually add the entry to merchants.json.

A maintenance script to detect dead merchant URLs and optionally remove them:

npm run check-links

By default it runs interactively — checks all URLs, prints a report, and prompts before removing dead entries.

Flags

Flag Description
--no-interactive Skip the removal prompt (report only)
--verbose, -v Also list alive entries in the report
--timeout=N Request timeout in ms (default: 15000)
--concurrency=N Parallel requests (default: 5)

Examples

# Report only, no changes
npm run check-links -- --no-interactive

# Verbose report with custom timeout
npm run check-links -- --verbose --timeout=20000

# Faster scan with more concurrency
npm run check-links -- --concurrency=10

How classification works

Each URL is tried up to 3 times (with 3s delay between retries):

  • Dead (auto-removable): DNS lookup failed, connection refused, request timeout after all retries, HTTP 404/410
  • Warning (manual review): SSL certificate errors, Cloudflare blocks (HTTP 403, 5xx, 520-530), connect timeouts (TCP-level bot blocking)
  • Alive: HTTP 2xx, redirects resolving to 2xx

Project structure

src/
  data/
    merchants.json      # All directory entries
    categories.ts       # Types, subtypes, country helpers, Merchant interface
    supporters.ts       # Foundation supporter logos
  components/
    DirectoryFilters.tsx # Sidebar category + subtype + country filters
    MerchantCard.tsx     # Individual entry card
    SubmitForm.tsx       # "Submit a Store" dialog form
    Navbar.tsx           # Top navigation bar
    Footer.tsx           # Site footer
  pages/
    Directory.tsx        # Main directory page (filtering, search, infinite scroll)
scripts/
  check-links.ts        # Dead link checker script