Pleiades proxy store: SOCKS5 gateway + Flask storefront + BTCPay checkout

This commit is contained in:
drjones
2026-09-19 18:19:46 -07:00
commit 9d084373dc
17 changed files with 1194 additions and 0 deletions

42
templates/base.html Normal file
View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}Clean Proxys{% endblock %}</title>
<meta name="description" content="Clean residential SOCKS5 & HTTP proxies. Global geo-targeting. No KYC. Bitcoin checkout. Encrypted backend. Agent-ready.">
<meta name="robots" content="index,follow">
<meta property="og:title" content="Clean Proxys — residential SOCKS5 proxies">
<meta property="og:description" content="Clean, fast, geo-targeted residential proxies. No KYC. Pay with Bitcoin. Built for agents and humans alike.">
<meta property="og:type" content="website">
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<nav>
<div class="wrap inner">
<a class="logo" href="/">CLEAN<span class="dot">.</span>PROXYS</a>
<div class="nav-links">
<a href="/">Home</a>
<a href="/plans">Plans</a>
{% if user %}<a href="/dashboard">Dashboard</a><a href="/logout">Logout</a>
{% else %}<a href="/login">Login</a><a class="cta" href="/signup">Sign up</a>{% endif %}
</div>
</div>
</nav>
<div class="wrap">
{% with msgs = get_flashed_messages(with_categories=true) %}
{% for cat, m in msgs %}<div class="flash {{ cat }}">{{ m }}</div>{% endfor %}
{% endwith %}
{% block body %}{% endblock %}
</div>
<footer>
<div class="wrap">
Clean Proxys — residential SOCKS5 &amp; HTTP proxies. &nbsp;·&nbsp;
<a href="https://buymeacoffee.com/r26xrthzttg" target="_blank" rel="noopener">Support the project ☕</a>
&nbsp;·&nbsp; <a href="/llms.txt">llms.txt</a>
</div>
</footer>
</body>
</html>

58
templates/dashboard.html Normal file
View File

@@ -0,0 +1,58 @@
{% extends "base.html" %}
{% block body %}
<h2>Dashboard</h2>
<div class="stats-row">
<div class="card stat"><span class="lbl">Balance</span><span class="val">{{ '%.2f'|format(user.balance_gb) }} GB</span></div>
<div class="card stat"><span class="lbl">Used</span><span class="val">{{ '%.3f'|format(used_gb) }} GB</span></div>
<div class="card stat"><span class="lbl">Status</span>
<span class="val" style="color:{{ 'var(--ok)' if user.active else 'var(--danger)' }}">{{ 'ACTIVE' if user.active else 'INACTIVE' }}</span>
</div>
</div>
{% if not user.active %}
<div class="flash warn">Account inactive — <a href="/plans">top up</a> to activate your proxies.</div>
{% endif %}
<div class="dash-grid">
<div>
<div class="card">
<h3>Connection strings</h3>
<label>SOCKS5</label>
<div class="copy">
<input type="text" readonly value="{{ socks }}" onclick="this.select()">
<button onclick="copy(this.previousElementSibling)">Copy</button>
</div>
<label>HTTP (HTTPS tunneling)</label>
<div class="copy">
<input type="text" readonly value="{{ http }}" onclick="this.select()">
<button onclick="copy(this.previousElementSibling)">Copy</button>
</div>
<p class="muted" style="font-size:12px;margin-bottom:0">Proxy password is unique to you. Use it for proxy auth, not your web password.</p>
<form method="post" action="/dashboard/rotate" style="margin-top:14px">
<input type="submit" value="Rotate proxy password">
</form>
</div>
</div>
<div class="card">
<h3>Location &amp; session</h3>
<form method="post" action="/dashboard/location">
<label>Country (ISO code, e.g. US, GB, JP, DE)</label>
<input type="text" name="country" value="{{ user.country }}" placeholder="US">
<label>City (optional)</label>
<input type="text" name="city" value="{{ user.city }}" placeholder="New York">
<label>Region (optional, e.g. europe)</label>
<input type="text" name="region" value="{{ user.region }}" placeholder="">
<div class="switch" style="margin-top:14px">
<input type="checkbox" name="sticky" id="sticky" {% if user.sticky %}checked{% endif %} style="width:auto">
<label for="sticky" style="margin:0">Sticky session (hold IP 30 min)</label>
</div>
<input type="submit" value="Save location">
</form>
</div>
</div>
<script>
function copy(el){ el.select(); document.execCommand('copy'); }
</script>
{% endblock %}

41
templates/index.html Normal file
View File

@@ -0,0 +1,41 @@
{% extends "base.html" %}
{% block body %}
<div class="hero">
<h1>The <span class="glow">cleanest</span> residential proxies on the web.</h1>
<p class="lede">Global geo-targeted SOCKS5 &amp; HTTP proxies with an encrypted backend. No KYC. No email required. Pay with Bitcoin and connect in seconds.</p>
<div class="cta-row">
<a class="btn btn-primary" href="/signup">Get proxies →</a>
<a class="btn btn-ghost" href="/plans">View plans</a>
</div>
<pre class="code" style="max-width:640px;margin:34px auto 0;text-align:left;">$ curl -x <span class="k">socks5h://user:pass@host:1080</span> https://ipinfo.io/ip
# 81.5.104.39 ← your clean, geo-targeted egress</pre>
</div>
<section>
<h2>Built <span class="accent">different</span>.</h2>
<p class="sub">Everything a serious operator needs, nothing that gets in the way.</p>
<div class="grid">
<div class="card"><span class="ic">🌍</span><h3>Global geo-targeting</h3><p>Country, city and region targeting across a real residential pool — not a VPN masquerade.</p></div>
<div class="card"><span class="ic">🔌</span><h3>SOCKS5 &amp; HTTP</h3><p>Native SOCKS5 and HTTP CONNECT. Drop-in for any tool, bot, or agent.</p></div>
<div class="card"><span class="ic">🔐</span><h3>Encrypted backend</h3><p>Your traffic rides an encrypted transport from end to end. Per-user credentials, always.</p></div>
<div class="card"><span class="ic">⚡</span><h3>Instant activation</h3><p>Pay with Bitcoin, top up in seconds. No verification queue, no paperwork.</p></div>
<div class="card"><span class="ic">🕶️</span><h3>No KYC</h3><p>Just a username and password. That's it.</p></div>
<div class="card"><span class="ic">🤖</span><h3>Agent-ready</h3><p>REST API, llms.txt, and a schema agents can parse. Programmatic access is a first-class feature.</p></div>
</div>
</section>
<section>
<h2>Sticky or <span class="accent">rotating</span>.</h2>
<p class="sub">Choose a stable session IP or a fresh egress on every request — switch anytime from your dashboard.</p>
<div class="grid">
<div class="card"><h3>Sticky sessions</h3><p>Hold the same IP for 30 minutes. Ideal for account sessions and stateful tasks.</p></div>
<div class="card"><h3>Rotating</h3><p>A new IP on every connection. Ideal for scraping, crawling, and high-volume jobs.</p></div>
</div>
</section>
<section class="center">
<h2>Ready when you are.</h2>
<p class="sub">Sign up, top up, connect. The whole thing takes under a minute.</p>
<a class="btn btn-primary" href="/signup">Create an account</a>
</section>
{% endblock %}

14
templates/login.html Normal file
View File

@@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block body %}
<div class="form-card card">
<h2>Log in</h2>
<form method="post">
<label>Username</label>
<input type="text" name="username" required autocomplete="username">
<label>Password</label>
<input type="password" name="password" required autocomplete="current-password">
<input type="submit" value="Log in">
</form>
<p class="muted center" style="margin-top:16px">No account? <a href="/signup">Sign up</a></p>
</div>
{% endblock %}

15
templates/order.html Normal file
View File

@@ -0,0 +1,15 @@
{% extends "base.html" %}
{% block body %}
<div class="form-card card center">
<h2>Order placed</h2>
<p class="muted">Invoice <span class="mono">{{ order.invoice_id }}</span></p>
<p class="muted">Status: <strong>{{ order.status }}</strong></p>
{% if order.status != 'paid' %}
<p class="muted">Complete payment in the BTCPay checkout, then return here. Your balance credits automatically.</p>
<a class="btn btn-primary" href="/dashboard">Check dashboard</a>
{% else %}
<p style="color:var(--ok)">Paid. Balance credited.</p>
<a class="btn btn-primary" href="/dashboard">Go to dashboard</a>
{% endif %}
</div>
{% endblock %}

29
templates/plans.html Normal file
View File

@@ -0,0 +1,29 @@
{% extends "base.html" %}
{% block body %}
<div class="hero" style="padding-bottom:20px">
<h1>Simple <span class="glow">pricing</span>.</h1>
<p class="lede">Pay-per-GB residential proxies. Bitcoin only. No subscriptions, no expiry traps.</p>
</div>
<div class="grid">
{% for p in plans %}
<div class="card plan">
{% if p.gb >= 100 %}<span class="tag">BEST VALUE</span>{% endif %}
<h3>{{ p.name }}</h3>
<div class="price">{{ p.price_sats }} <span style="font-size:16px;color:var(--muted)">sats</span></div>
<div class="per">{{ p.gb }} GB residential traffic</div>
<ul>
<li>{{ p.gb }} GB residential traffic</li>
<li>All countries &amp; cities</li>
<li>SOCKS5 + HTTP</li>
<li>Sticky or rotating</li>
<li>No KYC</li>
</ul>
{% if user %}
<form method="post" action="/buy/{{ p.id }}"><input type="submit" value="Buy {{ p.gb }} GB"></form>
{% else %}
<a class="btn btn-ghost" href="/signup">Sign up to buy</a>
{% endif %}
</div>
{% endfor %}
</div>
{% endblock %}

15
templates/signup.html Normal file
View File

@@ -0,0 +1,15 @@
{% extends "base.html" %}
{% block body %}
<div class="form-card card">
<h2>Create account</h2>
<p class="muted" style="margin-top:-4px">No email. No KYC. Just a username and password.</p>
<form method="post">
<label>Username</label>
<input type="text" name="username" required minlength="3" autocomplete="username">
<label>Password</label>
<input type="password" name="password" required minlength="6" autocomplete="new-password">
<input type="submit" value="Create account">
</form>
<p class="muted center" style="margin-top:16px">Already have one? <a href="/login">Log in</a></p>
</div>
{% endblock %}