Sample report · Real scan, repo name hidden

A real VibeHP report

This is the full, unedited report from scanning a public school-management app built with Lovable + Supabase. Only the repository name is hidden and the personal re-scan link removed.

vibehp-report.md

Repo: github.com/•••/school-management-app (name hidden)
Scanned: 2026-10-15 20:50

HP 52/100 · Critical condition

Don't launch yet. Real users or data are at risk.

Critical: 2 High: 3 Medium: 2 Low/info: 3
Heal all critical + high issues → HP 93/100

HP by category

Category HP lost
database -22
deps -17
hygiene -9

Healing plan (do these in order)

1. CRITICAL: 1 vulnerable package(s) (critical) (+8 HP)

Why it matters: These dependency versions have publicly known vulnerabilities.
Where: tinypool@1.1.1
Found by: osv-scanner

Copy-paste this into Cursor / Lovable:

These packages have known vulnerabilities: tinypool@1.1.1. Upgrade each to the nearest patched version, run `npm audit fix` where safe, and list any breaking changes I need to handle.

2. CRITICAL: Supabase tables without Row Level Security (+14 HP)

Why it matters: These tables are created without RLS enabled in your migrations. With the public anon key, anyone may read/write them.
Where: attendance_records, credit_notes, fee_reminders, fee_structure_items, grading_scale_bands, health_records, inventory_categories, inventory_items, inventory_transactions, invoice_line_items, mpesa_c2b_transactions, payments
Found by: custom

Copy-paste this into Cursor / Lovable:

Enable Row Level Security on these Supabase tables: attendance_records, credit_notes, fee_reminders, fee_structure_items, grading_scale_bands, health_records, inventory_categories, inventory_items, inventory_transactions, invoice_line_items, mpesa_c2b_transactions, payments, payroll_runs, purchase_order_items, route_stops, routes, school_days, setup_progress, student_discounts, student_enrollments, student_fee_structures, student_transport, vehicle_assignments. Write a migration that runs `alter table ... enable row level security` and adds sensible policies (users can only read/write their own rows via auth.uid()). Explain each policy.

3. HIGH: 7 vulnerable package(s) (high) (+3 HP)

Why it matters: These dependency versions have publicly known vulnerabilities.
Where: brace-expansion@1.1.18, brace-expansion@5.0.9, braces@3.0.3, js-yaml@4.3.1, source-map-js@1.2.1, vite@5.4.21, xlsx@0.18.5
Found by: osv-scanner

Copy-paste this into Cursor / Lovable:

These packages have known vulnerabilities: brace-expansion@1.1.18, brace-expansion@5.0.9, braces@3.0.3, js-yaml@4.3.1, source-map-js@1.2.1, vite@5.4.21, xlsx@0.18.5. Upgrade each to the nearest patched version, run `npm audit fix` where safe, and list any breaking changes I need to handle.

4. HIGH: RLS policy allows everyone (using (true)) (+5 HP)

Why it matters: At least one policy lets any user, even logged-out, access every row.
Where: supabase/migrations
Found by: custom

Copy-paste this into Cursor / Lovable:

Find every Supabase RLS policy using `using (true)` or `with check (true)`, and replace it with an ownership check like `auth.uid() = user_id` unless the data is truly meant to be public. List which ones you changed and why.

5. HIGH: .env file committed to the repo (+5 HP)

Why it matters: Env files usually hold secrets and should never be in git.
Where: .env
Found by: custom

Copy-paste this into Cursor / Lovable:

My .env file is committed to git. Add `.env*` (except .env.example) to .gitignore, remove it from tracking with `git rm --cached`, create a .env.example with placeholder values, and tell me which keys inside need rotating.

6. MEDIUM: 7 vulnerable package(s) (medium) (+1 HP)

Why it matters: These dependency versions have publicly known vulnerabilities.
Where: @vitest/mocker@3.2.7, dompurify@3.4.14, esbuild@0.21.5, postcss-selector-parser@6.0.10, postcss-selector-parser@6.1.4, react-router@6.30.6, vitest@3.2.7
Found by: osv-scanner

Copy-paste this into Cursor / Lovable:

These packages have known vulnerabilities: @vitest/mocker@3.2.7, dompurify@3.4.14, esbuild@0.21.5, postcss-selector-parser@6.0.10, postcss-selector-parser@6.1.4, react-router@6.30.6, vitest@3.2.7. Upgrade each to the nearest patched version, run `npm audit fix` where safe, and list any breaking changes I need to handle.

7. MEDIUM: .gitignore doesn't ignore .env (+2 HP)

Why it matters: One careless commit will publish your secrets.
Where: .gitignore
Found by: custom

Copy-paste this into Cursor / Lovable:

Update .gitignore to ignore .env, .env.local, .env.*.local and similar, while keeping .env.example tracked.

8. LOW / INFO: Supabase anon (public) key in repo (+<1 HP)

Why it matters: This is Supabase's public anon key. It's designed to ship to the browser, so it's not a leak by itself. It's only safe if Row Level Security is on for every table (see the database findings).
Where: .env:2
Found by: gitleaks

Copy-paste this into Cursor / Lovable:

My Supabase anon key is in the repo. Move it to VITE_SUPABASE_ANON_KEY in .env (listed in .env.example), and confirm RLS is enabled on every table so the public key can't read private data.

9. LOW / INFO: Supabase anon (public) key in repo (+<1 HP)

Why it matters: This is Supabase's public anon key. It's designed to ship to the browser, so it's not a leak by itself. It's only safe if Row Level Security is on for every table (see the database findings).
Where: src/integrations/supabase/client.ts:6
Found by: gitleaks

Copy-paste this into Cursor / Lovable:

My Supabase anon key is in the repo. Move it to VITE_SUPABASE_ANON_KEY in .env (listed in .env.example), and confirm RLS is enabled on every table so the public key can't read private data.

10. LOW / INFO: Hardcoded Supabase URL/anon key (not env-based) (+<1 HP)

Why it matters: Fine to be public only if Row Level Security is enabled on every table; it also makes switching environments painful.
Where: .env, index.html, src/integrations/supabase/client.ts
Found by: custom

Copy-paste this into Cursor / Lovable:

My Supabase URL and anon key are hardcoded. The anon key is OK to be public ONLY if RLS is on for every table. Move them to VITE_SUPABASE_URL / VITE_SUPABASE_ANON_KEY env vars and add them to .env.example.

Scan log

  • gitleaks: 3 raw hits, 2 kept after skipping tests/fixtures
  • semgrep: 0 results
  • osv-scanner: 15 vulnerable packages
  • custom checks: done
  • build: passed ✅

VibeHP is an automated scan. It catches common launch blockers but isn't a full security audit. Your code was deleted right after this scan.

Shield icon

Get this report for your app

Paste your GitHub link at checkout. Your report arrives by email in minutes, with one free re-scan after you fix things.

Check my HP for $19 →