Individual skill
popia-compliance
POPIA (South Africa's Protection of Personal Information Act) compliance and security audit skill for builders. Use whenever building, reviewing, auditing or shipping any website, web app, mobile app, API, CRM setup, AI feature or automation that touches personal information of South Africans - sign-up forms, lead capture, contact forms, checkout, user accounts, SA ID numbers, analytics/cookies, email or WhatsApp marketing, AI/LLM features, Supabase/Lovable/Firebase/Next.js/WordPress/Salesforce builds - and whenever the user mentions POPIA, POPI, PAIA, Information Regulator, Information Officer, data protection, privacy policy, consent, data breach / security compromise, DSAR, data retention, or "is this compliant". Trigger even if POPIA isn't named but the product serves South African users and collects personal data.
SKILL.md
Source commit 1be23b4e77a1d68014603ae6bc6e92dcf4232fe7
What was checked
- Matches the observed repository HEAD
- Yes
- Scanner rules are current
- No
- Repository scan complete
- No
- Skill scan complete
- No
- Observed behavior
- Not checked yet
- Last checked
- Nov 7, 2026
These are observations at the recorded commit, not a guarantee of safety. Review the source before running it.
Install this skill
Choose an agent in your Stack or copy a command below. Commands fetch the pinned commit and copy only this skill directory. Existing destinations are refused. Copying a command does not install anything.
An install command is unavailable: current rules, complete repository and skill scans, an eligible behavior level and a permitted license are required.
Repository context
- Repository stars (not skill ratings)
- 12
- Repository last updated
- Oct 27, 2026
- License
- MIT
Observed agent integration: codex, cursor
- agent-skills Repository topic
- claude-skill Repository topic
- compliance Repository topic
- cursor-rules Repository topic
- data-protection Repository topic
- lovable Repository topic
- mcp Repository topic
- popia Repository topic
- privacy Repository topic
- security Repository topic
- data Derived category
- security Derived category
- marketing Derived category
- legal Derived category
- sales Derived category
- engineering Derived category
- engineering-web Derived category
Files and excerpt
File metadata and permitted, redacted excerpts come from the recorded scan. Source links are pinned to that commit.
Browse files
.github/CODEOWNERSasset · 271 bytes.github/ISSUE_TEMPLATE/bug.ymlasset · 389 bytes.github/ISSUE_TEMPLATE/config.ymlasset · 374 bytes.github/ISSUE_TEMPLATE/false-positive.ymlasset · 1,384 bytes.github/ISSUE_TEMPLATE/law-change.ymlasset · 1,706 bytes.github/ISSUE_TEMPLATE/legal-reviewer.ymlasset · 2,312 bytes.github/ISSUE_TEMPLATE/new-rule.ymlasset · 729 bytes.github/ISSUE_TEMPLATE/translation.ymlasset · 446 bytes.github/PULL_REQUEST_TEMPLATE.mddoc · 848 bytes.github/dependabot.ymlasset · 272 bytes.github/workflows/ci.ymlasset · 7,311 bytes.github/workflows/regwatch.ymlasset · 1,972 bytes.github/workflows/release.ymlasset · 5,197 bytes.github/workflows/security.ymlasset · 2,682 bytes.gitignoreasset · 133 bytes.popiaignoreasset · 140 bytes.pre-commit-hooks.yamlasset · 491 bytes.semgrepignoreasset · 46 bytesCHANGELOG.mddoc · 13,480 bytesCODE_OF_CONDUCT.mddoc · 693 bytesCONTRIBUTING.mddoc · 6,704 bytesDISCLAIMER.mddoc · 2,492 bytesGOVERNANCE.mddoc · 5,127 bytesLICENSEasset · 1,116 bytesLICENSE-CONTENTasset · 991 bytesLICENSING.mddoc · 827 bytesREADME.mddoc · 10,618 bytesSECURITY.mddoc · 2,146 bytesSKILL.mdcore · 13,828 bytesSKILL.mdcore · 13,828 bytesSKILL.mdcore · 13,828 bytesSKILL.mdcore · 13,828 bytesTRADEMARKS.mddoc · 729 bytesaction.ymlasset · 7,621 bytesadapters/README.mddoc · 1,280 bytesadapters/_core.mddoc · 5,223 bytesadapters/agents/AGENTS.mddoc · 5,325 bytesadapters/chatgpt/custom-gpt-instructions.mddoc · 5,437 bytesadapters/claude/CLAUDE.mddoc · 5,433 bytesadapters/copilot/.github/copilot-instructions.mddoc · 5,325 bytesadapters/cursor/.cursor/rules/popia.mdcasset · 5,470 bytesadapters/gemini/GEMINI.mddoc · 5,325 bytesadapters/lovable/knowledge.mddoc · 5,619 bytesadapters/windsurf/.windsurf/rules/popia.mddoc · 5,403 bytesadapters/windsurf/.windsurfrulesasset · 5,325 bytesbin/popia-kit.jsruns · 1,105 bytesdocs/automation.mddoc · 12,593 bytesdocs/mcp.mddoc · 10,093 bytesdocs/quickstart.mddoc · 8,096 bytesdocs/releasing.mddoc · 3,385 bytesdocs/site-check-bot.mddoc · 2,893 bytesevals/README.mddoc · 11,908 bytesevals/cases/audit-repo.jsonasset · 1,190 bytesevals/cases/breach-exposed-service-role-key.jsonasset · 1,263 bytesevals/cases/breach-misdirected-email.jsonasset · 971 bytesevals/cases/breach-rls-off-week.jsonasset · 993 bytesevals/cases/build-ai-chatbot-customer-data.jsonasset · 961 bytesevals/cases/build-airbnb-guest-ids.jsonasset · 1,458 bytesevals/cases/build-analytics-pixels.jsonasset · 860 bytesevals/cases/build-automated-loan-decision.jsonasset · 859 bytesevals/cases/build-delete-account.jsonasset · 851 bytesevals/cases/build-face-verification.jsonasset · 926 bytesevals/cases/build-fine-tune-customer-data.jsonasset · 868 bytesevals/cases/build-kids-app.jsonasset · 1,064 bytesevals/cases/build-newsletter-cursor.jsonasset · 1,090 bytesevals/cases/build-newsletter-lovable.jsonasset · 1,027 bytesevals/cases/build-newsletter-signup.jsonasset · 1,137 bytesevals/cases/build-sa-id-without-need.jsonasset · 922 bytesevals/cases/build-supabase-table.jsonasset · 930 bytesevals/cases/build-whatsapp-broadcast.jsonasset · 876 bytesevals/cases/docs-access-request.jsonasset · 824 bytesevals/cases/docs-cookie-banner.jsonasset · 748 bytesevals/cases/docs-objection.jsonasset · 819 bytesevals/cases/docs-privacy-policy.jsonasset · 1,112 bytesevals/cases/explain-cold-b2b-email.jsonasset · 879 bytesevals/cases/explain-hr-criminal-checks.jsonasset · 915 bytesevals/cases/explain-popia-fines.jsonasset · 869 bytesevals/cases/explain-uncertain-answer.jsonasset · 873 bytesevals/cases/explain-us-cloud-hosting.jsonasset · 896 bytesevals/cases/refuse-backdate-consent.jsonasset · 916 bytesevals/cases/refuse-buy-lead-list.jsonasset · 1,054 bytesevals/cases/refuse-preticked-checkbox.jsonasset · 980 bytesevals/fixtures/chatbot/support_bot.pyruns · 776 bytesevals/fixtures/env-service-role/env.local.txtdoc · 296 bytesevals/fixtures/env-service-role/supabaseClient.tsruns · 203 bytesevals/fixtures/guest-checkin/guests.csvasset · 384 bytesevals/fixtures/guest-checkin/whatsapp-template.txtdoc · 269 bytesevals/fixtures/kids-app/analytics.htmlasset · 452 bytesevals/fixtures/kids-app/schema.sqlasset · 255 bytesevals/fixtures/loan-decision/decide.tsruns · 357 bytesevals/fixtures/misdirected-email/incident.mddoc · 330 bytesevals/fixtures/newsletter-form/Newsletter.tsxruns · 305 bytesevals/fixtures/react-preticked/SignupForm.tsxruns · 661 bytesevals/fixtures/repo-audit/README.mddoc · 87 bytesevals/fixtures/repo-audit/src/SignupForm.tsxruns · 661 bytesevals/fixtures/repo-audit/src/index.htmlasset · 452 bytesevals/fixtures/repo-audit/src/logger.tsruns · 173 bytesevals/fixtures/repo-audit/supabase/migrations/20261001_create_leads.sqlasset · 397 bytesevals/fixtures/supabase-no-rls/20261001_create_leads.sqlasset · 397 bytesevals/published/2026-10-18-claude-opus-5-5-run1.jsonasset · 353,163 bytesevals/published/2026-10-18-claude-opus-5-5-run1.mddoc · 2,225 bytesevals/published/2026-10-18-claude-opus-5-5-run2-fixes.jsonasset · 44,783 bytesevals/published/2026-10-18-claude-opus-5-5-run2-fixes.mddoc · 598 bytesevals/run_evals.pyruns · 28,064 bytesexamples/github-workflow-popia-scan.ymlasset · 992 bytesexamples/github-workflow-site-check.ymlasset · 918 byteshosted/site-check/.gitignoreasset · 14 byteshosted/site-check/README.mddoc · 19,062 byteshosted/site-check/adapters/deno.jsonasset · 345 byteshosted/site-check/adapters/node-pinned-fetch.tsruns · 3,196 byteshosted/site-check/adapters/node-supabase-rate-limit.tsruns · 1,050 byteshosted/site-check/adapters/package-lock.jsonasset · 5,516 byteshosted/site-check/adapters/package.jsonruns · 497 byteshosted/site-check/adapters/test/node.smoke.tsruns · 8,309 byteshosted/site-check/deno.jsonasset · 894 byteshosted/site-check/deno.lockasset · 2,021 byteshosted/site-check/report/actions.jsonasset · 9,037 byteshosted/site-check/supabase/functions/site-check/core.tsruns · 57,861 byteshosted/site-check/supabase/functions/site-check/index.tsruns · 934 byteshosted/site-check/supabase/migrations/site_check_rate.sqlasset · 2,529 byteshosted/site-check/tests/actions.test.tsruns · 2,342 byteshosted/site-check/tests/checks.test.tsruns · 20,344 byteshosted/site-check/tests/guard.test.tsruns · 20,581 byteshosted/site-check/tests/handler.test.tsruns · 18,395 byteshosted/site-check/tests/hardening.test.tsruns · 19,860 byteshosted/site-check/tests/helpers.tsruns · 4,037 byteshosted/site-check/tests/sql/run_sql_tests.shruns · 5,871 bytesi18n/README.mddoc · 4,726 bytesi18n/af/breach-notice-short.mddoc · 1,121 bytesi18n/af/collection-notice.mddoc · 1,165 bytesi18n/af/cookie-banner.jsonasset · 1,226 bytesi18n/af/marketing-consent.mddoc · 784 bytesi18n/en/breach-notice-short.mddoc · 688 bytesi18n/en/collection-notice.mddoc · 677 bytesi18n/en/cookie-banner.jsonasset · 743 bytesi18n/en/marketing-consent.mddoc · 374 bytesi18n/tn/breach-notice-short.mddoc · 1,159 bytesi18n/tn/collection-notice.mddoc · 1,294 bytesi18n/tn/cookie-banner.jsonasset · 1,305 bytesi18n/tn/marketing-consent.mddoc · 835 bytesi18n/xh/breach-notice-short.mddoc · 1,088 bytesi18n/xh/collection-notice.mddoc · 1,195 bytesi18n/xh/cookie-banner.jsonasset · 1,252 bytesi18n/xh/marketing-consent.mddoc · 848 bytesi18n/zu/breach-notice-short.mddoc · 1,093 bytesi18n/zu/collection-notice.mddoc · 1,180 bytesi18n/zu/cookie-banner.jsonasset · 1,252 bytesi18n/zu/marketing-consent.mddoc · 843 bytesmcp/README.mddoc · 1,061 bytesmcp/__init__.pyruns · 0 bytesmcp/server.pyruns · 32,264 bytesmcp/smoke_test.pyruns · 6,719 bytesmcp/tools.jsonasset · 7,045 bytespackage.jsonruns · 1,116 bytespacks/README.mddoc · 6,011 bytespacks/_template.mddoc · 1,643 bytespacks/ecommerce.mddoc · 14,611 bytespacks/education-and-children.mddoc · 14,597 bytespacks/fintech.mddoc · 22,274 bytespacks/health.mddoc · 17,173 bytespacks/hr-and-recruitment.mddoc · 16,922 bytespacks/short-term-rentals.mddoc · 16,918 bytespyproject.tomlasset · 3,347 bytesreferences/01-popia-legal-map.mddoc · 24,438 bytesreferences/02-build-patterns.mddoc · 17,948 bytesreferences/03-security-controls.mddoc · 11,051 bytesreferences/04-stack-playbooks.mddoc · 11,362 bytesreferences/05-direct-marketing.mddoc · 5,303 bytesreferences/06-cross-border-and-operators.mddoc · 4,352 bytesreferences/07-breach-response.mddoc · 5,751 bytesreferences/08-ai-and-automated-decisions.mddoc · 4,807 bytesreferences/09-audit-procedure.mddoc · 11,000 bytesreferences/10-regulatory-watch.mddoc · 5,750 bytesregistry/README.mddoc · 18,661 bytesregistry/build.pyruns · 4,168 bytesregistry/popia/account/privacy-centre.tsxruns · 17,061 bytesregistry/popia/consent/consent-banner.tsxruns · 8,730 bytesregistry/popia/consent/consent-gate.tsxruns · 9,023 bytesregistry/popia/consent/consent-provider.tsxruns · 8,266 bytesregistry/popia/forms/collection-notice.tsxruns · 3,253 bytesregistry/popia/forms/marketing-opt-in.tsxruns · 7,869 bytesregistry/popia/forms/sa-id-input.tsxruns · 4,170 bytesregistry/popia/lib/consent-record.tsruns · 4,598 bytesregistry/popia/lib/redact.tsruns · 6,833 bytesregistry/popia/lib/sa-id.tsruns · 3,501 bytesregistry/popia/supabase/functions/_shared/privacy-config.tsruns · 14,640 bytesregistry/popia/supabase/functions/consent/index.tsruns · 4,841 bytesregistry/popia/supabase/functions/dsar-delete/index.tsruns · 5,521 bytesregistry/popia/supabase/functions/dsar-export/index.tsruns · 3,945 bytesregistry/popia/supabase/functions/unsubscribe/index.tsruns · 5,418 bytesregistry/popia/supabase/migrations/0001_privacy_schema.sqlasset · 14,123 bytesregistry/popia/supabase/migrations/0002_retention.sqlasset · 3,859 bytesregistry/popia/supabase/migrations/0003_security_checks.sqlasset · 3,444 bytesregistry/popia/supabase/migrations/0004_function_guards.sqlasset · 6,381 bytesregistry/r/collection-notice.jsonasset · 3,898 bytesregistry/r/consent-banner.jsonasset · 9,855 bytesregistry/r/consent-gate.jsonasset · 10,025 bytesregistry/r/consent-provider.jsonasset · 9,213 bytesregistry/r/consent-record.jsonasset · 5,300 bytesregistry/r/consent-system.jsonasset · 32,913 bytesregistry/r/marketing-opt-in.jsonasset · 8,934 bytesregistry/r/privacy-centre.jsonasset · 18,596 bytesregistry/r/redact.jsonasset · 7,772 bytesregistry/r/registry.jsonasset · 10,250 bytesregistry/r/sa-id-input.jsonasset · 5,029 bytesregistry/r/sa-id.jsonasset · 4,114 bytesregistry/r/supabase-privacy-functions.jsonasset · 37,294 bytesregistry/r/supabase-privacy-schema.jsonasset · 29,734 bytesregistry/registry.jsonasset · 10,250 bytesregwatch/sources.jsonasset · 1,154 bytesregwatch/state.jsonasset · 16,254 bytesscripts/__init__.pyruns · 0 bytesscripts/build_adapters.pyruns · 6,890 bytesscripts/cli.pyruns · 4,217 bytesscripts/popia_badge.pyruns · 5,218 bytesscripts/popia_fleet.pyruns · 15,458 bytesscripts/popia_init.pyruns · 7,441 bytesscripts/popia_operators.pyruns · 33,731 bytesscripts/popia_pack.pyruns · 44,438 bytesscripts/popia_scan.pyruns · 25,995 bytesscripts/popia_vendors.pyruns · 9,723 bytesscripts/regwatch.pyruns · 13,722 bytesscripts/rules/__init__.pyruns · 0 bytesscripts/rules/access.pyruns · 6,799 bytesscripts/rules/consent.pyruns · 10,773 bytesscripts/rules/pii.pyruns · 7,164 bytesscripts/rules/repo.pyruns · 7,157 bytesscripts/rules/secrets.pyruns · 5,595 bytesscripts/rules/thirdparty.pyruns · 5,217 bytesscripts/rules/web.pyruns · 11,818 bytesscripts/sa_id.pyruns · 4,042 bytesscripts/site_check.pyruns · 26,645 bytesscripts/sql/supabase_inventory.sqlasset · 5,533 bytesscripts/style_lint.pyruns · 3,707 bytesscripts/supabase_check.pyruns · 18,544 bytesserver.jsonasset · 812 bytestemplates/audit-report.mddoc · 8,528 bytestemplates/breach-notice-data-subject.mddoc · 5,453 bytestemplates/breach-regulator-checklist.mddoc · 3,412 bytestemplates/consent-patterns.mddoc · 7,704 bytestemplates/cookie-notice.mddoc · 2,795 bytestemplates/dsar-runbook.mddoc · 6,343 bytestemplates/operator-agreement-checklist.mddoc · 5,314 bytestemplates/pack-questionnaire.jsonasset · 18,548 bytestemplates/paia-manual-scaffold.mddoc · 5,380 bytestemplates/pia-template.mddoc · 6,692 bytestemplates/privacy-notice.mddoc · 10,456 bytestemplates/retention-schedule.csvasset · 4,033 bytestemplates/ropa.csvasset · 1,484 bytestests/__init__.pyruns · 0 bytestests/automation/__init__.pyruns · 0 bytestests/automation/fixtures/__init__.pyruns · 0 bytestests/automation/fixtures/regulator-list.htmlasset · 1,419 bytestests/automation/test_badge.pyruns · 3,031 bytestests/automation/test_cli.pyruns · 2,793 bytestests/automation/test_fleet.pyruns · 4,501 bytestests/automation/test_init.pyruns · 4,444 bytestests/automation/test_mcp.pyruns · 4,104 bytestests/automation/test_regwatch.pyruns · 4,018 bytestests/fixtures/README.mddoc · 379 bytestests/fixtures/demo-app/firestore.rulesasset · 162 bytestests/fixtures/demo-app/index.htmlasset · 315 bytestests/fixtures/demo-app/package.jsonruns · 180 bytestests/fixtures/demo-app/src/ai.tsruns · 542 bytestests/fixtures/demo-app/src/components/SignupForm.tsxruns · 956 bytestests/fixtures/demo-app/src/newsletter.tsruns · 288 bytestests/fixtures/demo-app/supabase/functions/lead/index.tsruns · 244 bytestests/fixtures/demo-app/supabase/migrations/20260101000000_init.sqlasset · 498 bytestests/fixtures/operators-app/.env.exampleasset · 49 bytestests/fixtures/operators-app/api/triage.pyruns · 386 bytestests/fixtures/operators-app/package.jsonruns · 242 bytestests/fixtures/operators-app/public/contact.htmlasset · 243 bytestests/fixtures/operators-app/requirements.txtdoc · 91 bytestests/fixtures/operators-app/src/checkout.tsruns · 594 bytestests/fixtures/operators-app/src/sms.jsruns · 710 bytestests/fixtures/operators-app/supabase-edge.tsruns · 292 bytestests/fixtures/operators-app/tests/checkout.test.tsruns · 68 bytestests/fixtures/supabase/lovable-hardened.jsonasset · 4,401 bytestests/fixtures/supabase/seed.sqlasset · 3,622 bytestests/fixtures/supabase/seeded-risky.jsonasset · 3,739 bytestests/pack/__init__.pyruns · 0 bytestests/pack/kasi-bookings-answers.jsonasset · 5,297 bytestests/pack/test_pack.pyruns · 12,583 bytestests/scanner/__init__.pyruns · 0 bytestests/scanner/test_baseline.pyruns · 5,799 bytestests/scanner/test_operators.pyruns · 7,813 bytestests/scanner/test_rules.pyruns · 9,843 bytestests/scanner/test_site_check.pyruns · 5,305 bytestests/security/__init__.pyruns · 0 bytestests/security/test_hardening.pyruns · 7,177 bytestests/supabase/__init__.pyruns · 0 bytestests/supabase/run_live.shruns · 1,206 bytestests/supabase/test_supabase_check.pyruns · 10,345 bytes
Read excerpt
# POPIA Compliance & Security Audit
You are acting as a privacy-engineering partner for a South African builder. Your job is to make the product **lawful by design** under POPIA (Act 4 of 2013) and its Regulations (as amended 17 April 2025), and to **prove it** with evidence: scanner output, a data map, and an audit report a lawyer or Information Officer can sign off.
Law in this skill is current to **18 October 2026**. Anything time-sensitive is collected in `references/10-regulatory-watch.md` with dates - check it, and re-verify anything flagged before relying on it.
> This skill gives engineering and compliance guidance, not legal advice. Say so once per deliverable (not on every message). Recommend a POPIA attorney for: special personal information at scale, children's data, prior authorisation (s57), cross-border transfers of special/children's info, credit/insurance/health/financial-services products, and anything already in front of the Regulator.
## Pick the mode
Read the request and pick one (or chain them):
| Mode | When | Go to |
|---|---|---|