Model Release Form for photographers — KUG §22 + GDPR compliance with digital signature
9 min read

Model Release Form: legally sound consent system for photographers (KUG §22 + GDPR)

#Photography #Legal #GDPR #KUG #Astro #Forms #Brevo

Today I want to talk about the Model Release Form at halle.online/model-release — a legally sound consent system for photography that I built for my own portfolio and am now expanding into a standalone product for German and EU photographers.

§ 22
KUG (German copyright)
Art. 7
GDPR
3
Languages (DE/EN/ES)
~4 min
To complete

The problem

Anyone photographing people in Germany who wants to publish those images needs documented consent under § 22 KunstUrhG (German Copyright Act). GDPR adds Article 7: consent must be freely given, informed, unambiguous, and revocable. Plus the standard data protection notice under Article 13.

What most photographers actually use:

  • Paper forms — get lost, hard to search, the subject rarely gets a copy
  • Generic SaaS — English-only, US-law-oriented, don’t cover the German specifics
  • PDF templates from the internet — usually outdated (pre-GDPR), often legally unsound
  • Custom Word documents — no audit trail of who signed what when

I needed something for my portfolio that was legally clean, digitally signable, automatically documented, and available in three languages (Halle has an international student scene — many of my model requests come in English or Spanish).

Nothing existed that covered all four requirements. So I built it.

What it does

Complete data capture

Personal data, contact, date of birth (for minor-specific provisions), photoshoot context (date, location, type).

Granular usage rights

Individually selectable: portfolio, social media, commercial use, advertising. Each option is optional — the model decides.

Geographic scope

Worldwide, DACH region (DE/AT/CH), Germany only — choose progressively.

Time limitation

Indefinite, 10 years, 5 years, or revocable at any time — explicitly set per model.

Minor protection

For people under 18, a second block for parental consent appears automatically — no consent without it.

Digital signature

Drawing with finger/mouse on canvas OR plain-text name entry as legally compliant electronic signature (eIDAS Level 1).

Automatic PDF delivery

After submission, the model immediately receives a PDF copy by email (via Brevo). Plus confirmation to me. No login, no delivery questions.

Revocation built in

Explicitly mentioned in the PDF and confirmation text: "This consent can be revoked at any time." Plus contact address for revocation.

Compliance anchors

The form is not “probably legally OK” — it’s explicitly built against German and EU regulations:

KUG § 22 — consent documented

Name, date, signature, context. Meets the evidentiary requirements per BGH (Federal Court of Justice) precedent (BGH I ZR 75/05).

KUG § 23 — exceptions noted

Persons of public interest, accompaniment, gatherings — the form does NOT claim these KUG exceptions; it instead obtains explicit consent (the safer path).

GDPR Art. 7 — consent as legal basis

(a) freely given: model can decline each item separately. (b) informed: purpose, recipients, retention named in the form. (c) unambiguous: active confirmation by click + signature, no pre-check. (d) revocable: explicitly stated + contact.

GDPR Art. 13 — information at collection

Controller (Arnold Wender, Halle.Online), purpose (portfolio + possibly commercial), legal basis (Art. 6 (1) (a) GDPR), retention period, recipients (Brevo as data processor), data subject rights — all listed, not just linked.

GDPR Art. 8 — minors

Under 16, consent only with parental authorization (German-specific — stricter than the EU default of 13). The form detects the date of birth and unlocks the corresponding block automatically.

eIDAS Art. 25 — electronic signature

Level 1 (simple electronic signature) is sufficient for KUG consent. The canvas drawing or plain-text entry meets that.

Tech stack

The implementation is intentionally minimalist — no React, no backend, all in Astro with a few targeted vanilla-JS islands:

What runs under the hood

  1. Astro 6 as framework

    The whole halle.online site runs on Astro 6.1 + TypeScript strict. The form is a single .astro file (ModelReleaseForm.astro) plus three form molecules (FormFieldset, FormCheckbox, FormRadioGroup).

  2. Trilingual i18n

    src/i18n/model-release.ts holds all strings for DE/EN/ES. The slug path stays the same (/model-release/), but fields, labels, buttons, and confirmation PDF differ by browser locale.

  3. Vanilla JS for signature

    Canvas element + pointer events for drawing, fallback to plain-text entry. No external library. ~80 lines including touch support for tablet/phone.

  4. Brevo for email delivery

    POST → /api/model-release collects form data, generates the PDF (jspdf), sends it as an attachment via Brevo Transactional API to the model + a copy to me. Idempotent: same email within 60s does not get sent twice.

  5. Success page rendered separately

    src/pages/model-release/erfolg.astro shows confirmation + email arrival hint + revocation notes after submission. No SPA navigation — clean server-render with a unique URL for browser history.

  6. GDPR logging minimal

    No input is stored longer than necessary. PDF delivery complete → data is not buffered further on the frontend. Brevo logs (for data processing) are documented in the data processing agreement.

Effort and what’s next

April 27
First deployed
3 days
Initial build
6 fields
Required / 14 optional
0
External backend calls (except Brevo)

The form has been live on halle.online since April 27, 2026. I’ve used it for three photo sessions since. Every model received the PDF within seconds, every revocation notice was included, no edge case has come up.

While using it, I kept thinking: “All photographers should need this.”

Especially one: my brother Wolf Wender, photographer and post-producer based in Mexico City. Wolf is at another level — his portfolio includes the Rolling Stones Mexico 2016 campaign, work with Wisin, and a long list of commercial and editorial gigs that don’t fit in a single sentence. Every time he photographs someone he needs exactly what I need: documented consent, in the model’s language, with a copy for him and for the model, no paperwork lost.

His current site runs on WordPress (built years ago by Werbeagentur Wender Media). The plan: migrate it to Astro in the coming months — and when that happens, I’ll gift him this component integrated into his new site. Until then it’s on the list. But knowing this tool will serve someone who travels the world between shoots and takes his craft seriously validates the decision to build it right from the start.

Roadmap to a standalone system

Phase 1 — embed variant

Other photographers can embed the form via `<script>` or iframe into their own WordPress / Shopify / Squarespace site. Logo + colors customizable. PDF arrives with their logo, address, domain in the sender.

Phase 2 — standalone SaaS

Standalone domain, login, dashboard with all signed releases. Search by model name, date, shoot. Export as bulk PDF or CSV.

Phase 3 — audit log

Every consent has an immutable audit trail (IP, timestamp, browser fingerprint). Court-defensible in case of dispute.

Phase 4 — multi-photographer studios

Studios with multiple photographers can centrally manage releases — who used which models when and how, with permission system.

Why no existing tool fits

I researched before building. What’s out there:

  • EasyRelease — US-based, KUG not covered, no German
  • Releases.app — generic, no GDPR specifics
  • PhotoForm by Mylio — photo workflow tool with releases as a side feature, no German legal focus
  • Generic form builders (Typeform, Tally, Jotform) — don’t build a KUG-compliant form without significant manual setup

What doesn’t exist: a legally compliant, German-centric, multilingual, photographer-specific system.

That’s exactly the gap I’m filling.

How you can use it

In the meantime: the form on halle.online is live, free for models, and you can study it as a working example.


Links: