<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>6</buildNumber><marked><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><branch><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><branch><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><branch><SHA1>2264c156533706f135d03479119c61e6af91fa0d</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'><environment><GIT_SHA>2264c15</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/6-2264c15</RELEASE_DIR><RELEASE_ID>6-2264c15</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/6/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/6/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/6/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Checkout</restartableStage><restartableStage>Guard: main only</restartableStage><restartableStage>Ship source to target</restartableStage><restartableStage>Build, health-check and swap</restartableStage><restartableStage>Smoke test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#6 2264c15</displayName><duration>26542</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #6 2264c15</fullDisplayName><id>6</id><keepLog>false</keepLog><number>6</number><queueId>5451</queueId><result>SUCCESS</result><timestamp>1785228290744</timestamp><url>https://jenkins.younex.de/job/blut24-landing/6/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/datenschutz.vue</affectedPath><commitId>2264c156533706f135d03479119c61e6af91fa0d</commitId><timestamp>1785228279000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>datenschutz: name the actual controller, matching the Impressum

Both pages must name the same responsible party or they contradict each other,
so the Verantwortlicher section now carries the same operator data as the
Impressum (Younes Kalakhi, IT Beratung &amp; Dienstleistung, Lahnau) instead of
bracketed placeholders.

Two judgement calls, both noted in the file:
- the e-mail is still a placeholder because it is obfuscated on the source page
  and could not be read; Art. 13 DSGVO requires a contact route, so it must be
  filled before this is treated as live
- no Datenschutzbeauftragter is claimed - a freelancer of this size is generally
  not required to appoint one under § 38 BDSG, and asserting one that does not
  exist would be worse than saying none is appointed

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 10:44:39 +0200</date><id>2264c156533706f135d03479119c61e6af91fa0d</id><msg>datenschutz: name the actual controller, matching the Impressum</msg><path><editType>edit</editType><file>app/pages/datenschutz.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit><inProgress>false</inProgress><nextBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>7</buildNumber><marked><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><branch><SHA1>4476c9c4298767c7d1e75e392fda5233727c5d91</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#7 4476c9c</displayName><duration>26829</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #7 4476c9c</fullDisplayName><id>7</id><keepLog>false</keepLog><number>7</number><queueId>5453</queueId><result>SUCCESS</result><timestamp>1785228855796</timestamp><url>https://jenkins.younex.de/job/blut24-landing/7/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/SectionCourier.vue</affectedPath><affectedPath>app/components/SectionHowItWorks.vue</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>app/components/SiteFooter.vue</affectedPath><affectedPath>app/components/SectionRegistration.vue</affectedPath><affectedPath>app/components/SectionProof.vue</affectedPath><commitId>4476c9c4298767c7d1e75e392fda5233727c5d91</commitId><timestamp>1785228842000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>landing: copy pass — courier value proposition, step 4, spacing, footer

- Step 4 now says what actually happens: if the other clinic is on Blut24 too,
  order, delivery note and unit data stay inside the system with nothing retyped
  or faxed; DGTI-Lieferschein, PDF and e-mail remain available for houses that
  are not yet connected, rather than being the default path.
- Courier section rewritten around the app: orders arrive on the phone, pickup
  and delivery are confirmed there, and participation is free so a courier can
  win additional runs without buying software. Kept strictly to goods transport
  wording - no patient-transport terms.
- "dauerhaft kostenlos" -&gt; "für Kliniken kostenlos" everywhere.
- Tightened the gap between the header and the hero headline on both breakpoints.
- Dropped the Bundes-Klinik-Atlas source line from the footer.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 10:54:02 +0200</date><id>4476c9c4298767c7d1e75e392fda5233727c5d91</id><msg>landing: copy pass — courier value proposition, step 4, spacing, footer</msg><path><editType>edit</editType><file>app/components/SectionHowItWorks.vue</file></path><path><editType>edit</editType><file>app/components/SectionProof.vue</file></path><path><editType>edit</editType><file>app/components/SectionRegistration.vue</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/components/SectionCourier.vue</file></path><path><editType>edit</editType><file>app/components/SiteFooter.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>8</number><url>https://jenkins.younex.de/job/blut24-landing/8/</url></nextBuild><previousBuild><number>6</number><url>https://jenkins.younex.de/job/blut24-landing/6/</url></previousBuild></nextBuild><previousBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>5</buildNumber><marked><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><branch><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><branch><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><branch><SHA1>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#5 9d95707</displayName><duration>26645</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #5 9d95707</fullDisplayName><id>5</id><keepLog>false</keepLog><number>5</number><queueId>5449</queueId><result>SUCCESS</result><timestamp>1785227610682</timestamp><url>https://jenkins.younex.de/job/blut24-landing/5/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>deploy/README.md</affectedPath><affectedPath>app/app.vue</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>server/api/registration/submit.post.ts</affectedPath><affectedPath>app/components/SiteFooter.vue</affectedPath><affectedPath>app/components/SiteHeader.vue</affectedPath><affectedPath>app/components/SectionRegistration.vue</affectedPath><affectedPath>app/pages/datenschutz.vue</affectedPath><affectedPath>README.md</affectedPath><affectedPath>app/components/SectionCourier.vue</affectedPath><affectedPath>.idea/vcs.xml</affectedPath><affectedPath>app/components/SectionApp.vue</affectedPath><affectedPath>app/components/RegistrationDialog.vue</affectedPath><affectedPath>server/utils/registrationValidation.ts</affectedPath><affectedPath>scripts/test-registration.mjs</affectedPath><affectedPath>app/composables/useRegistrationDialog.ts</affectedPath><affectedPath>server/utils/registrationDb.ts</affectedPath><affectedPath>app/components/AndroidBadge.vue</affectedPath><affectedPath>app/components/AppIcon.vue</affectedPath><affectedPath>app/components/RegistrationForm.vue</affectedPath><affectedPath>deploy/nginx-blut24.conf</affectedPath><affectedPath>app/components/SectionProof.vue</affectedPath><commitId>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</commitId><timestamp>1785227601000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>landing: modal registration, value-led proof band, autocomplete fix, APK live

- Registration moved into a native &lt;dialog&gt; modal driven from every CTA, with
  focus trap/return, scroll lock, backdrop + ESC dismissal, full-screen sheet on
  mobile and prefers-reduced-motion respected.
- Replaced the data-source stats ("Quelle: Bundes-Klinik-Atlas", 293, 906) with
  three statements of what the product actually does. No invented metrics: the
  only figure left is the real 1.581 Klinik-Atlas count that was already there.
- Fixed the autocomplete staying open after a clinic was picked. Root cause was
  watch(query): selecting wrote the label back into the field, which the watcher
  read as a new search and reopened the list ~220ms later. The input is now
  :value + @input so a programmatic write cannot be a search intent, with a
  pendingQuery flag gating every path that opens the list.
- Removed Anrede end-to-end. The DB column is deliberately NOT migrated: it keeps
  its NOT NULL DEFAULT '' so inserts that omit it stay valid on existing databases.
- Android badge switched live: the APK is published at
  https://blut24.com/downloads/blut24-mobile.apk and served from disk by nginx
  with the correct package MIME type.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 10:33:21 +0200</date><id>9d957078b237f5dd9f22e2d14badac3ff8e33bd6</id><msg>landing: modal registration, value-led proof band, autocomplete fix, APK live</msg><path><editType>edit</editType><file>app/components/AppIcon.vue</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/components/SiteFooter.vue</file></path><path><editType>edit</editType><file>app/components/SiteHeader.vue</file></path><path><editType>edit</editType><file>server/utils/registrationValidation.ts</file></path><path><editType>edit</editType><file>app/app.vue</file></path><path><editType>edit</editType><file>app/components/SectionCourier.vue</file></path><path><editType>edit</editType><file>scripts/test-registration.mjs</file></path><path><editType>edit</editType><file>deploy/README.md</file></path><path><editType>edit</editType><file>app/components/RegistrationForm.vue</file></path><path><editType>add</editType><file>.idea/vcs.xml</file></path><path><editType>edit</editType><file>app/components/SectionProof.vue</file></path><path><editType>add</editType><file>app/components/RegistrationDialog.vue</file></path><path><editType>edit</editType><file>README.md</file></path><path><editType>edit</editType><file>app/components/SectionApp.vue</file></path><path><editType>edit</editType><file>app/pages/datenschutz.vue</file></path><path><editType>edit</editType><file>deploy/nginx-blut24.conf</file></path><path><editType>add</editType><file>app/composables/useRegistrationDialog.ts</file></path><path><editType>edit</editType><file>server/api/registration/submit.post.ts</file></path><path><editType>edit</editType><file>app/components/SectionRegistration.vue</file></path><path><editType>edit</editType><file>server/utils/registrationDb.ts</file></path><path><editType>edit</editType><file>app/components/AndroidBadge.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>6</number><url>https://jenkins.younex.de/job/blut24-landing/6/</url></nextBuild><previousBuild><number>4</number><url>https://jenkins.younex.de/job/blut24-landing/4/</url></previousBuild></previousBuild></workflowRun>