Dashboard
Real-time WAF monitoring and analytics
| Time | Domain | IP Address | Path | Attack Type | Severity | Status |
|---|
Security first
Real-time WAF monitoring and analytics
| Time | Domain | IP Address | Path | Attack Type | Severity | Status |
|---|
| Timestamp | Domain | IP Address | Method | Path | Attack Type | Rule | Severity | Status | Matched Data | Actions |
|---|
| Domain | Owner | Backend | Port | Description | Status | Anti-Bot | GeoIP | Actions |
|---|
| ID | Name | Type | Severity | Description | Status |
|---|
| Username | Role | Mode | Max Domains | Current Domains | Max Requests/Month | Current Requests | Created At | Actions |
|---|
| Code | Description | Uses | Status | Created By | Created At | Actions |
|---|
| IP Address | Reason | Added By | Added At | Expires | Actions |
|---|
| IP Address | Reason | Added By | Added At | Actions |
|---|
GeoIP Status
Loading...
Note: After configuring GeoIP, you can manage country blocking per domain in the domain settings.
To use Let's Encrypt automatic SSL, your domain must be configured to point to this Neptune WAF instance:
A Record:
your-domain.com → Your WAF Public IP
CloudFlare Setup:
1. Add your domain to CloudFlare
2. Create an A record pointing to your WAF IP
3. Set CloudFlare proxy status to "DNS Only" (gray cloud) during initial setup
4. After SSL certificate is obtained, you can enable CloudFlare proxy (orange cloud) for extra protection
5. Set SSL/TLS mode to "Full" in CloudFlare dashboard
Tip: Certificates automatically renew every 60 days. Neptune WAF handles this automatically!
Cookie: Automatic verification for all users
PoW: Browser solves crypto puzzle (Premium)
Captcha: User enters displayed code (Premium)
How long a verified user can access before being challenged again
Custom anti-bot HTML pages are exclusive to premium users
Maximum requests allowed
Time window for counting
Hold Ctrl/Cmd to select multiple countries
Important: Custom HTML replaces the default challenge page. Your code must handle the verification flow for the selected challenge type.
/__neptune_verify without parameters.
type, challenge, nonce, hash to verify.
type, captcha_id, captcha_input to verify.
Simple verification - just call the endpoint:
fetch('/__neptune_verify', { method: 'POST' })
.then(r => r.json())
.then(data => {
if (data.status === 'verified') window.location.reload();
});
Your page receives placeholders {{CHALLENGE}} and {{DIFFICULTY}}:
const challenge = '{{CHALLENGE}}';
const difficulty = {{DIFFICULTY}};
const target = '0'.repeat(difficulty);
async function sha256(msg) {
const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(msg));
return [...new Uint8Array(buf)].map(b => b.toString(16).padStart(2,'0')).join('');
}
async function solve() {
let nonce = 0;
while (true) {
const hash = await sha256(challenge + ':' + nonce);
if (hash.startsWith(target)) {
// Submit solution
fetch('/__neptune_verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ type: 'pow', challenge, nonce, hash })
}).then(r => r.json()).then(d => {
if (d.status === 'verified') window.location.reload();
});
break;
}
nonce++;
}
}
solve();
Your page receives placeholders {{CAPTCHA_ID}} and {{CAPTCHA_IMAGE}} (base64 PNG):
🔒 Security: The captcha text is NEVER sent to the client. Only a server-generated image (base64 data URL) is provided. The actual text stays securely on the server.
let captchaId = '{{CAPTCHA_ID}}';
// Display the server-generated captcha image
// {{CAPTCHA_IMAGE}} is a base64 data URL (data:image/png;base64,...)
document.getElementById('captcha-img').src = '{{CAPTCHA_IMAGE}}';
function verify(userInput) {
fetch('/__neptune_verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
type: 'captcha',
captcha_id: captchaId,
captcha_input: userInput.toUpperCase()
})
}).then(r => r.json()).then(d => {
if (d.status === 'verified') window.location.reload();
else refreshCaptcha(); // Get new captcha on failure
});
}
// Refresh captcha - gets new image from server
function refreshCaptcha() {
fetch('/__neptune_captcha_refresh', { method: 'POST' })
.then(r => r.json())
.then(d => {
captchaId = d.captcha_id;
document.getElementById('captcha-img').src = d.captcha_image;
});
}
HTML example: <img id="captcha-img" src="{{CAPTCHA_IMAGE}}" alt="Captcha">
POST /__neptune_verify{"status":"verified","redirect":"/"}{"status":"error","error":"..."}POST /__neptune_captcha_refresh returns captcha_id + captcha_image (base64)💡 Tip: The placeholders ({{CHALLENGE}}, {{CAPTCHA_ID}}, etc.) are replaced server-side before the page is sent. Make sure your custom HTML matches the challenge type selected above!
This category is featured for Premiums only.
Your account has been created!
Username:
⭐ Premium Account Activated!
You have premium access: 10 domains, 1M requests/month, and all premium features!
⚠ IMPORTANT: Save Your Recovery Token
This token is your ONLY way to recover your password if you forget it. Save it in a safe place NOW!
Welcome back, !
Your password has been updated.
No users have used this code yet.