kvkk-compliance skill
KVKK and GDPR compliance patterns - consent management, right to erasure, breach notification, audit logging, cookie consent, and data classification.
Is the kvkk-compliance skill safe?
Clean: nothing in its files matched our rules. We read 1 file in the folder on 2026-09-28.
No findings.
Install the kvkk-compliance skill
A skill is a folder. Copy it into your agent's skills folder and the agent loads it when the task matches its description.
git clone --depth 1 https://github.com/ThomasMoreAI/legal-skills-open.git /tmp/legal-skills-open mkdir -p ~/.claude/skills cp -r /tmp/legal-skills-open/cross-jurisdiction/data-protection/skills/kvkk-compliance ~/.claude/skills/kvkk-compliance
In the Claude apps, zip the folder and upload it from the Skills settings. The folder on GitHub
The instructions your agent would load
SKILL.md as published, without the frontmatter. Read it on GitHub
KVKK & GDPR Compliance Patterns
Practical patterns for Turkish KVKK (Law No. 6698) and EU GDPR data protection compliance.
KVKK vs GDPR Comparison
Data Classification
enum DataCategory {
PERSONAL = 'personal', // name, email, phone
SPECIAL = 'special_category', // health, biometrics, religion
ANONYMOUS = 'anonymous', // cannot identify anyone
PSEUDONYMOUS = 'pseudonymous', // identifiable only with additional data
}
interface DataField {
name: string
category: DataCategory
retentionDays: number
requiresExplicitConsent: boolean
encryptAtRest: boolean
}
const USER_DATA_FIELDS: DataField[] = [
{ name: 'email', category: DataCategory.PERSONAL, retentionDays: 730, requiresExplicitConsent: false, encryptAtRest: false },
{ name: 'healthRecords', category: DataCategory.SPECIAL, retentionDays: 365, requiresExplicitConsent: true, encryptAtRest: true },
{ name: 'analyticsId', category: DataCategory.PSEUDONYMOUS, retentionDays: 365, requiresExplicitConsent: false, encryptAtRest: false },
]Consent Management
// BAD: single "accept all" checkbox - violates both KVKK and GDPR
// <input type="checkbox" /> I accept everything
// GOOD: granular, purpose-specific consent
interface ConsentRecord {
userId: string; purpose: string; granted: boolean
timestamp: Date; ipAddress: string; version: string
}
const CONSENT_PURPOSES = [
{ id: 'essential', label: 'Service operation', required: true },
{ id: 'analytics', label: 'Usage analytics', required: false },
{ id: 'marketing', label: 'Marketing emails', required: false },
{ id: 'third_party', label: 'Third-party sharing', required: false },
] as const
async function recordConsent(userId: string, purposeId: string, granted: boolean, meta: { ip: string; userAgent: string }): Promise<ConsentRecord> {
// Always INSERT, never UPDATE - full audit trail
return db.consentRecords.create({
data: { userId, purpose: purposeId, granted, timestamp: new Date(), ipAddress: meta.ip, version: CURRENT_CONSENT_VERSION },
})
}
async function hasActiveConsent(userId: string, purposeId: string): Promise<boolean> {
const latest = await db.consentRecords.findFirst({
where: { userId, purpose: purposeId },
orderBy: { timestamp: 'desc' },
Right to Erasure (Soft Delete + Anonymization)
const GRACE_PERIOD_DAYS = 30
async function requestAccountDeletion(userId: string): Promise<void> {
await db.users.update({ where: { id: userId }, data: { status: 'deletion_pending', deactivatedAt: new Date() } })
await db.deletionRequests.create({
data: { userId, requestedAt: new Date(), gracePeriodEndsAt: new Date(Date.now() + GRACE_PERIOD_DAYS * 86400000), status: 'pending' },
})
}
// Scheduled job: purge after grace period
async function purgeExpiredAccounts(): Promise<void> {
const expired = await db.deletionRequests.findMany({
where: { status: 'pending', gracePeriodEndsAt: { lte: new Date() } },
})
for (const req of expired) {
await db.$transaction(async (tx) => {
await tx.users.update({
where: { id: req.userId },
data: { email: `deleted-${req.userId}@anon.local`, fullName: 'Deleted User', phone: null, address: null, status: 'deleted' },
})
// Anonymize consent records (retain for legal proof, not delete)
await tx.consentRecords.updateMany({
where: { userId: req.userId },
data: { userId: `deleted-${req.userId}`, ipAddress: 'REDACTED' }
})
await tx.orders.updateMany({ where: { userId:Cookie Consent Flow
const COOKIE_CATEGORIES = {
necessary: { name: 'Strictly Necessary', required: true },
functional: { name: 'Functional', required: false },
analytics: { name: 'Analytics', required: false },
marketing: { name: 'Marketing', required: false },
} as const
type CookiePrefs = Record<keyof typeof COOKIE_CATEGORIES, boolean>
// BAD: set tracking cookies before consent
// document.cookie = '_ga=GA1.2.123; max-age=63072000'
// GOOD: only after explicit consent per category
function applyCookiePreferences(prefs: CookiePrefs): void {
initSessionCookies() // always allowed
prefs.analytics ? initGoogleAnalytics() : removeAnalyticsCookies()
prefs.marketing ? initMarketingPixels() : removeMarketingCookies()
document.cookie = `cookie_consent=${JSON.stringify(prefs)}; path=/; max-age=${365 * 86400}; SameSite=Lax; Secure`
}Data Breach Notification (72-Hour Rule)
const NOTIFICATION_DEADLINE_HOURS = 72
async function reportBreach(breach: { detectedAt: Date; severity: string; affectedCount: number; dataTypes: string[]; description: string }): Promise<void> {
const record = await db.dataBreaches.create({ data: { ...breach, notifiedAuthorityAt: null, notifiedUsersAt: null } })
const deadline = new Date(breach.detectedAt.getTime() + NOTIFICATION_DEADLINE_HOURS * 3600000)
// GDPR Art 33: notify authority within 72h | KVKK: "as soon as possible"
await notifyDataProtectionAuthority({ breachId: record.id, deadline, ...breach })
// GDPR Art 34: high-risk breaches require user notification
if (breach.severity === 'high' || breach.severity === 'critical') {
await notifyAffectedUsers(record.id)
}
}Audit Logging (Who, What, When, Which Data)
interface AuditLogEntry {
actorId: string; actorRole: string
action: 'read' | 'create' | 'update' | 'delete' | 'export'
resourceType: string; resourceId: string
fieldsAccessed: string[]; ipAddress: string
justification?: string
}
async function logDataAccess(entry: AuditLogEntry): Promise<void> {
// Append-only table - no UPDATE or DELETE allowed on audit_logs
await db.$executeRaw`
INSERT INTO audit_logs (actor_id, actor_role, action, resource_type, resource_id, fields_accessed, ip_address, justification, timestamp)
VALUES (${entry.actorId}, ${entry.actorRole}, ${entry.action}, ${entry.resourceType}, ${entry.resourceId}, ${JSON.stringify(entry.fieldsAccessed)}, ${entry.ipAddress}, ${entry.justification || null}, NOW())
`
}
// Express middleware: auto-log every personal data access
function auditMiddleware(resourceType: string) {
return (req: Request, res: Response, next: NextFunction) => {
const origJson = res.json.bind(res)
res.json = (body: unknown) => {
const actionMap: Record<string, string> = {
GET: 'read', POST: 'create', PUT: 'update', PATCH: 'update', DELETE: 'delete'
}
logDataAccess({
actorId: req.user?.Privacy Policy Checklist
Controller identity [ ] Company name, address, contact, VERBiS number
Data collected [ ] Full list of categories with examples
Legal basis [ ] Purpose + legal basis for each activity
Retention periods [ ] How long each type is kept
Data subject rights [ ] Access, rectification, erasure, portability, objection
Consent withdrawal [ ] Clear opt-out instructions
Cookie policy [ ] Categories, purposes, opt-out
International transfer [ ] Countries, safeguards (SCCs, adequacy)
Third parties [ ] Processors and sub-processors
Automated decisions [ ] Profiling details, right to object
Breach procedure [ ] Notification timeline and method
DPO contact [ ] Data Protection Officer detailsDPA Template Reference
Every third-party processor needs a Data Processing Agreement with these clauses:
Subject & duration What data, how long, why
Processor obligations Process only on documented instructions
Sub-processors Prior written auth, flow-down obligations
Security measures Encryption, access controls, incident response
Audit rights Controller can inspect compliance
Data return/deletion Return or destroy data at contract end
Breach notification Notify controller without undue delay
International transfer SCCs if data leaves TR/EUContrast: GOOD vs BAD Consent
// BAD: blanket consent - violates KVKK Art 3, GDPR Art 7
function BadForm() {
return (
<form>
<label><input type="checkbox" /> I agree to privacy policy, marketing, tracking, and sharing.</label>
<button>Sign Up</button>
</form>
)
}
// GOOD: granular opt-in per purpose
function GoodForm() {
return (
<form>
<fieldset>
<legend>Data Processing Consent</legend>
<label><input type="checkbox" checked disabled /> Account operation (required)</label>
<label><input type="checkbox" name="analytics" /> Usage analytics</label>
<label><input type="checkbox" name="marketing" /> Marketing emails</label>
<label><input type="checkbox" name="third_party" /> Partner sharing (<a href="/privacy">details</a>)</label>
</fieldset>
<p>Change preferences anytime in account settings.</p>
<button>Sign Up</button>
</form>
)
}Core rule: Compliance is not a one-time feature. Build data protection into every flow, log every access, and assume regulators will ask "show me the evidence."
More skills from ThomasMoreAI/legal-skills-open
- A02民事诉讼案件的诉讼文书制备阶段。承接阶段一(战略把脉)的分析成果,将策略方案转化为可直接提交法院的正式法律文书,同时建立对方来文和法院来文的管理机制。当用户已完成阶段一、需要起草起诉状/答辩状、制作证据目录、或收到对方/法院文书需要处理时触发。适用于原告准备起诉材料,或被告准备应诉材料。
- A02-lyronlee二审程序的诉讼文书制备阶段。承接阶段一(战略分析)的分析成果,将上诉策略转化为可直接提交二审法院的正式法律文书。当用户已完成阶段一、需要起草上诉状或二审答辩状、制作新证据目录、或收到法院来文需要处理时触发。适用于上诉人准备上诉材料,或被上诉人准备应诉材料。
- Aad-compliance-review广告合规审核技能,用于审核广告素材是否符合中国广告法及相关法规。适用场景:(1) 用户提交广告文案、广告素材要求合规审核时;(2) 用户提到"广告审核""广告合规""广告法审查"等关键词时;(3) 用户要求检查广告内容是否存在违法违规风险时;(4) 用户提交房地产、食品、医疗、药品、互联网等行业广告要求专项审核时。审核依据涵盖《广告法》《反不正当竞争法》及行业专项法规。
- Aadmin-reviewReviews administrative case documents for procedural compliance across 38 checkpoints, covering filing, summons, handling outcomes, evidence, and rights protection. Use when auditing public security administrative case files in txt format for legal procedure violations.
- Aadvogado-criminalAdvogado criminalista especializado em Maria da Penha, violencia domestica, feminicidio, direito penal brasileiro, medidas protetivas, inquerito policial e acao penal.
- Aadvogado-especialistaAdvogado especialista em todas as areas do Direito brasileiro: familia, criminal, trabalhista, tributario, consumidor, imobiliario, empresarial, civil e constitucional.
- Aage-verification-methodsEvaluates and implements age estimation and verification technologies for online services. Covers facial age estimation, digital ID verification, self-declaration with risk assessment, AI-based age estimation, and the accuracy versus privacy tradeoff. Includes ICO guidance and euCONSENT framework. Keywords: age verification, age estimation, facial analysis, digital ID, children, online safety.
- Aai-privacy-assessmentGuides the combined DPIA and AI Act conformity assessment for AI systems processing personal data. Covers EDPB-EDPS Joint Opinion 5/2021, training data lawfulness under Art. 6 and Art. 9, Art. 22 automated decision-making, algorithmic bias detection, and NIST AI RMF MAP function. Keywords: AI privacy, DPIA, AI Act, algorithmic bias, automated decision-making, Art. 22, training data, NIST AI RMF.
- Aanalise-processo-penalAssessoria judicial completa para processos penais. Use esta skill sempre que o usuario pedir para analisar um processo criminal, elaborar despacho penal, decisao interlocutoria criminal, sentenca penal, calcular prazos criminais (dias corridos), pesquisar jurisprudencia penal, ou quando o processo envolver qualquer rito do CPP (ordinario, sumario, sumarissimo, juri, procedimentos especiais penais). Tambem use quando o usuario mencionar termos como "criminal", "penal", "CPP", "crime", "denuncia", "inquerito", "prisao", "liberdade provisoria", "habeas corpus", "tribunal do juri", "acao penal", "execucao penal", "LEP", "suspensao condicional", "sursis", "livramento condicional", "medida de seguranca", "transacao penal", "suspensao condicional do processo", "audiencia de custodia", "colaboracao premiada", "acordo de nao persecucao penal", ou qualquer procedimento regulado pelo Codigo de Processo Penal brasileiro.
- Aapac-transfersGuides management of cross-border data transfers under Asia-Pacific regulatory frameworks including APEC CBPR, ASEAN Model Contractual Clauses, Japan APPI supplementary rules, South Korea PIPA provisions, and Thailand/Singapore PDPA mechanisms. Keywords: APEC CBPR, ASEAN MCCs, APPI, PIPA, PDPA, APAC transfers.
- Aapec-cbpr-certGuides APEC Cross-Border Privacy Rules system certification process including self-assessment against the APEC Privacy Framework principles, accountability agent selection, intake questionnaire completion, certification decision, annual recertification, and Global CBPR Forum transition. Keywords: APEC, CBPR, cross-border privacy, accountability agent, certification, Global CBPR.
- Aarckit-at-bvergg[COMMUNITY] Generate Austrian public procurement documentation aligned with Bundesvergabegesetz 2018 — Oberschwellen/Unterschwellen determination, ANKÖ publication, BVergGVS secondary rules, and BVwG review pathway