<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>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'><environment><GIT_SHA>9d95707</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/5-9d95707</RELEASE_DIR><RELEASE_ID>5-9d95707</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/5/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/5/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/5/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>#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><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>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'></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>#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></culprit><inProgress>false</inProgress><nextBuild><number>7</number><url>https://jenkins.younex.de/job/blut24-landing/7/</url></nextBuild><previousBuild><number>5</number><url>https://jenkins.younex.de/job/blut24-landing/5/</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>4</buildNumber><marked><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</SHA1><branch><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</SHA1><branch><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</SHA1><branch><SHA1>88fb8db79ff790ff6f298d61b279dade9abc8b3b</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>#4 88fb8db</displayName><duration>26252</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #4 88fb8db</fullDisplayName><id>4</id><keepLog>false</keepLog><number>4</number><queueId>5446</queueId><result>SUCCESS</result><timestamp>1785223605276</timestamp><url>https://jenkins.younex.de/job/blut24-landing/4/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/SiteFooter.vue</affectedPath><affectedPath>app/components/AndroidBadge.vue</affectedPath><affectedPath>app/components/SectionApp.vue</affectedPath><commitId>88fb8db79ff790ff6f298d61b279dade9abc8b3b</commitId><timestamp>1785223594000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>landing: proper Android download badge, reused in the footer

Replaces the flat outline-icon button with a badge in the visual language people
actually recognise: dark pill, mark on the left, small kicker over a bold line,
and the Android robot drawn inline in its own green (#3DDC84).

Deliberately NOT the official "Get it on Google Play" badge. That artwork is
Google's trademark and licensed only for links pointing at a Play Store listing;
this link is a direct APK download, so copying it would be both a trademark
problem and a false claim to the visitor. Same recognition, honest wording
("Direkt-Download / Android APK").

Extracted as AndroidBadge.vue with a `compact` variant so the app section and the
footer cannot drift apart. Until an APK exists the badge renders as a disabled
span (not a dead link) with its own aria-label; set `available` to switch it on.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 09:26:34 +0200</date><id>88fb8db79ff790ff6f298d61b279dade9abc8b3b</id><msg>landing: proper Android download badge, reused in the footer</msg><path><editType>add</editType><file>app/components/AndroidBadge.vue</file></path><path><editType>edit</editType><file>app/components/SiteFooter.vue</file></path><path><editType>edit</editType><file>app/components/SectionApp.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>5</number><url>https://jenkins.younex.de/job/blut24-landing/5/</url></nextBuild><previousBuild><number>3</number><url>https://jenkins.younex.de/job/blut24-landing/3/</url></previousBuild></previousBuild></workflowRun>