Skip to main content
skill CX Codex

supabase-detect — Claude Code skill for Supabase detection

This skill checks a web app for signs of Supabase and records what it finds. Use it before auditing an unfamiliar application.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add yoanbernabeu/supabase-pentest-skills --skill supabase-detect -a claude-code
Open on GitHub

What supabase-detect does

The skill examines an accessible site and its JavaScript for Supabase domains, client-library signatures, API routes, and response headers. The target URL must be publicly reachable, and the check needs an internet connection.

Findings go into .sb-pentest-context.json; actions are recorded in .sb-pentest-audit.log. Both files are updated as the check proceeds, preserving discoveries if execution stops early. Lazy-loaded SPA chunks can hide evidence until the relevant parts of the app have been opened. Custom API domains and self-hosted instances call for other clues, such as /rest/v1/ and /auth/v1/ routes.

What it helps with

  • check whether a site uses Supabase
  • find Supabase clues in JavaScript and response headers
  • save detection findings for a security audit
  • compare direct and indirect signs of Supabase

Example prompts for the agent

  • Check whether https://myapp.example.com uses Supabase.
  • Inspect https://myapp.example.com for Supabase and show the evidence.
  • Check https://myapp.com, including all JavaScript chunks, and account for the custom API domain api.mycompany.com.

How to install supabase-detect

1Skills CLI (Vercel)

npx skills add yoanbernabeu/supabase-pentest-skills --skill supabase-detect -a claude-code

2Manually: put the files in place

~/.claude/skills/supabase-detect/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/supabase-detect/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about supabase-detect

How do I install supabase-detect in Claude Code?

Run npx skills add yoanbernabeu/supabase-pentest-skills --skill supabase-detect -a claude-code, then use ~/.claude/skills/supabase-detect/SKILL.md.

What does supabase-detect do?

It checks a web app's HTML, JavaScript, network patterns, and response headers for Supabase evidence. It writes findings to .sb-pentest-context.json and activity to .sb-pentest-audit.log.

What does the check need to run?

The target URL must be publicly accessible, and the check needs internet access to fetch and inspect it. For a single-page app, open relevant sections first if its JavaScript loads in chunks.

Source text

SKILL.md · MIT
---
name: supabase-detect
description: Detect if a web application uses Supabase by analyzing client-side code, network patterns, and API endpoints.
---

# Supabase Detection

> 🔴 **CRITICAL: PROGRESSIVE FILE UPDATES REQUIRED**
>
> You MUST write to context files **AS YOU GO**, not just at the end.
> - Write to `.sb-pentest-context.json` **IMMEDIATELY after each discovery**
> - Log to `.sb-pentest-audit.log` **BEFORE and AFTER each action**
> - **DO NOT** wait until the skill completes to update files
> - If the skill crashes or is interrupted, all prior findings must already be saved
>
> **This is not optional. Failure to write progressively is a critical error.**

This skill determines whether a web application uses Supabase as its backend.

## When to Use This Skill

- Starting a security audit on an unknown application
- Verifying Supabase usage before running other audit skills
- Quickly checking multiple applications for Supabase presence

## Prerequisites

- Target URL must be publicly accessible
- Internet connection to fetch and analyze the target

## Detection Methods

The skill uses multiple detection vectors:

### 1. Domain Pattern Matching

Searches for Supabase-related domains in:
- HTML source code
- JavaScript bundles
- Network requests (via inline scripts)

**Patterns detected:**
```
*.supabase.co
*.supabase.com
supabase-cdn.com
```

### 2. JavaScript Client Detection

Looks for Supabase client library signatures:

```javascript
// Import patterns
import { createClient } from '@supabase/supabase-js'
const { createClient } = require('@supabase/supabase-js')

// Client initialization
supabase.createClient(
createClient('https://
SUPABASE_URL
NEXT_PUBLIC_SUPABASE
VITE_SUPABASE
REACT_APP_SUPABASE
```

### 3. API Endpoint Detection

Checks for characteristic Supabase endpoints:

```
/rest/v1/
/auth/v1/
/storage/v1/
/realtime/v1/
/functions/v1/
```

### 4. Response Header Analysis

Looks for Supabase-specific headers:

```
x-supabase-*
sb-*
```

## Usage

### Basic Detection

```
Check if https://myapp.example.com uses Supabase
```

### Detection with Verbose Output

```
Detect Supabase on https://myapp.example.com with full details
```

## Output Format

### Supabase Detected

```
═══════════════════════════════════════════════════════════
 SUPABASE DETECTED
═══════════════════════════════════════════════════════════

 Target: https://myapp.example.com
 Status: ✅ Supabase usage confirmed

 Detection Evidence:
 ├── Domain: abc123def.supabase.co (found in main.js)
 ├── Client: @supabase/supabase-js v2.x detected
 ├── Endpoints: /rest/v1/, /auth/v1/, /storage/v1/
 └── Headers: x-supabase-api-version present

 Project Reference: abc123def
 Project URL: https://abc123def.supabase.co

 Context saved to: .sb-pentest-context.json
═══════════════════════════════════════════════════════════
```

### Supabase Not Detected

```
═══════════════════════════════════════════════════════════
 DETECTION RESULT
═══════════════════════════════════════════════════════════

 Target: https://myapp.example.com
 Status: ❌ Supabase not detected

 Scanned:
 ├── HTML source: No Supabase patterns
 ├── JavaScript bundles: 3 files analyzed, no matches
 ├── Network patterns: No Supabase endpoints
 └── Response headers: No Supabase headers

 Note: The app may use a self-hosted Supabase or custom domain.
       Try providing a known Supabase URL manually if you have one.
═══════════════════════════════════════════════════════════
```

## Context Output

When Supabase is detected, the skill saves to `.sb-pentest-context.json`:

```json
{
  "target_url": "https://myapp.example.com",
  "detection": {
    "detected": true,
    "confidence": "high",
    "timestamp": "2025-01-31T10:00:00Z",
    "evidence": [
      {
        "type": "domain",
        "value": "abc123def.supabase.co",
        "location": "/static/js/main.js",
        "line": 1247
      },
      {
        "type": "client_library",
        "value": "@supabase/supabase-js",
        "version": "2.x"
      }
    ]
  },
  "supabase": {
    "project_ref": "abc123def",
    "project_url": "https://abc123def.supabase.co"
  }
}
```

## Audit Log Entry

Each detection is logged to `.sb-pentest-audit.log`:

```
[2025-01-31T10:00:00Z] DETECTION_START target=https://myapp.example.com
[2025-01-31T10:00:01Z] FETCH_HTML status=200 size=45KB
[2025-01-31T10:00:02Z] FETCH_JS file=main.js status=200 size=1.2MB
[2025-01-31T10:00:03Z] PATTERN_MATCH type=domain value=abc123def.supabase.co
[2025-01-31T10:00:03Z] DETECTION_COMPLETE result=detected confidence=high
```

## Confidence Levels

| Level | Criteria |
|-------|----------|
| **High** | Multiple evidence types (domain + client + endpoints) |
| **Medium** | Single strong evidence (domain or explicit client init) |
| **Low** | Only indirect evidence (generic patterns, possible false positive) |

## Edge Cases

### Custom Domains

Some Supabase projects use custom domains (e.g., `api.mycompany.com`). In this case:

```
Detect Supabase on https://myapp.com with custom API domain api.mycompany.com
```

### Self-Hosted Supabase

Self-hosted instances won't have `.supabase.co` domains. Look for:
- PostgREST patterns (`/rest/v1/`)
- GoTrue auth patterns (`/auth/v1/`)
- Supabase client library in code

### Single Page Applications

For SPAs with lazy-loaded chunks:

```
Detect Supabase on https://myapp.com including all JS chunks
```

## Common Issues

❌ **Problem:** Detection returns false negative on SPA
✅ **Solution:** The app may lazy-load Supabase. Try interacting with the app first to load all chunks, or provide known patterns.

❌ **Problem:** Multiple Supabase projects detected
✅ **Solution:** This can happen with multi-tenant setups. The skill will list all found projects.

❌ **Problem:** Detection is slow
✅ **Solution:** Large JS bundles take time to analyze. Use `--quick` mode for faster but less thorough detection:
```
Quick detect Supabase on https://myapp.com
```

## Next Steps

After detection:
1. Run `supabase-extract-url` to confirm and extract the project URL
2. Run `supabase-extract-anon-key` to find the API key
3. Or use `supabase-pentest` for a full guided audit

## MANDATORY: Progressive Context File Updates

⚠️ **This skill MUST update tracking files PROGRESSIVELY during execution, NOT just at the end.**

### Critical Rule: Write As You Go

**DO NOT** batch all writes at the end. Instead:

1. **Before starting any action** → Log the action to `.sb-pentest-audit.log`
2. **After each discovery** → Immediately update `.sb-pentest-context.json`
3. **After each significant step** → Log completion to `.sb-pentest-audit.log`

This ensures that if the skill is interrupted, crashes, or times out, all findings up to that point are preserved.

### Required Actions (Progressive)

1. **Create/Update `.sb-pentest-context.json`** with results:
   ```json
   {
     "target_url": "https://myapp.example.com",
     "detection": {
       "detected": true,
       "confidence": "high",
       "timestamp": "...",
       "evidence": [ ... ]
     },
     "supabase": {
       "project_ref": "abc123def",
       "project_url": "https://abc123def.supabase.co"
     }
   }
   ```

2. **Create/Log to `.sb-pentest-audit.log`**:
   ```
   [TIMESTAMP] [supabase-detect] [START] Starting Supabase detection
   [TIMESTAMP] [supabase-detect] [SUCCESS] Supabase detected with high confidence
   [TIMESTAMP] [supabase-detect] [CONTEXT_UPDATED] .sb-pentest-context.json created/updated
   ```

3. **IMPORTANT: As the first skill in the audit chain, this skill is responsible for creating the context files if they don't exist.**

**FAILURE TO UPDATE CONTEXT FILES IS NOT ACCEPTABLE.**

## MANDATORY: Evidence Collection

📁 **Evidence Directory:** `.sb-pentest-evidence/01-detection/`

### Evidence Files to Create

| File | Content |
|------|---------|
| `initial-scan.json` | Raw detection results with all evidence |
| `supabase-endpoints.txt` | List of discovered Supabase endpoints |
| `client-code-snippets/` | Directory with relevant code excerpts |

### Evidence Format

```json
{
  "evidence_id": "DET-001",
  "timestamp": "2025-01-31T10:00:00Z",
  "category": "detection",
  "target_url": "https://myapp.example.com",

  "detection_results": {
    "supabase_detected": true,
    "confidence": "high",
    "project_url": "https://abc123def.supabase.co",
    "project_ref": "abc123def"
  },

  "evidence": [
    {
      "type": "domain_pattern",
      "value": "abc123def.supabase.co",
      "location": "/static/js/main.js",
      "line": 1247,
      "context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
    },
    {
      "type": "client_library",
      "value": "@supabase/supabase-js",
      "version": "2.x"
    }
  ],

  "curl_command": "curl -s 'https://abc123def.supabase.co/rest/v1/' -H 'apikey: [ANON_KEY]'"
}
```

### Add to curl-commands.sh

```bash
# === DETECTION ===
# Check Supabase API availability
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY" | head -100
```

### Add to timeline.md

```markdown
## [TIMESTAMP] - Detection Phase Complete
- Supabase detected with [confidence] confidence
- Project: [project_ref]
- Evidence: `01-detection/initial-scan.json`
```

## Related Skills

- `supabase-extract-url` — Extract project URL from code
- `supabase-extract-anon-key` — Find anon key
- `supabase-pentest` — Full orchestrated audit

© yoanbernabeu · MIT · yoanbernabeu/supabase-pentest-skills

Similar skills

All skills for Security →

From the same set19

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor