Reproducible Science Setup

Dieses Kapitel dokumentiert den technischen Aufbau des HyponaTrack-Projekts als Vorlage für reproduzierbare klinische Forschung. Das Ziel: Andere Forschungsgruppen sollen dieses Setup adaptieren können, um eigene Studien mit dem gleichen Qualitätsanspruch aufzusetzen.

Monorepo-Konzept

Alle Projektbestandteile — App-Code, wissenschaftliche Dokumentation, Datenauswertung und Präsentationen — leben in einem Repository:

HyponaTrack-Project/
├── app/                    iOS App (SwiftUI, ResearchKit)
├── site/                   Quarto Website
│   ├── konzept/            Wissenschaftliches Konzeptpapier
│   ├── auswertung/         Statistische Auswertung (Python)
│   ├── slides/             Reveal.js Präsentationen
│   ├── _bibliography/      Zotero-Export (Better BibTeX)
│   └── _templates/         Typst + Reveal.js Vorlagen
├── netlify/                Edge Functions (Passwortschutz)
├── .github/workflows/      CI/CD (GitHub Actions)
├── CLAUDE.md               Instruktionen für Claude Code
└── README.md

Vorteile:

  • Eine Quelle der Wahrheit: Keine Versionskonflikte zwischen App-Code und Dokumentation
  • Gemeinsame Bibliographie: Eine references.bib für alle Dokumente
  • Atomare Commits: Änderungen an App und Dokumentation in einem Commit
  • Ein CI/CD-Pipeline: Push → Build → Deploy

Quarto als Publikationsplattform

Quarto vereint vier Ausgabeformate in einem Toolchain:

Format Verwendung Quarto-Typ
Website (HTML) Online-Dokumentation mit Sidebar-Navigation website
Reveal.js Slides Präsentationen für Vorträge und Ethikkommission revealjs
PDF (via Typst) Formale Dokumente (Protokoll, Patienteninfo) typst
Word (DOCX) Einreichung bei Journals docx
Tabelle 1: Quarto-Ausgabeformate im Projekt.

Executable Code

Quarto rendert Python-Code direkt in den Dokumenten — Diagramme, Tabellen und statistische Analysen sind reproduzierbar und werden bei jedem Build neu berechnet:

import plotly.graph_objects as go
fig = go.Figure(go.Bar(x=["A","B"], y=[1,2]))
fig.show()

Graphviz-Diagramme

Flussdiagramme und Architekturdiagramme werden als {dot}-Blöcke geschrieben — kein externes Tool nötig:

digraph { A -> B -> C }

Zotero + Better BibTeX

Workflow

  1. Zotero verwaltet alle zitierten Paper (DOI-Import, PDF-Anhänge, Notizen)
  2. Better BibTeX exportiert automatisch nach site/_bibliography/references.bib
  3. Quarto zitiert via [@CitationKey] und generiert das Literaturverzeichnis
  4. CSL-Style (APA 7th) formatiert die Zitate

Einrichtung

# Zotero installieren
brew install --cask zotero

# Better BibTeX Plugin: manuell in Zotero installieren
# Werkzeuge → Plugins → Zahnrad → Install Add-on From File

# Auto-Export konfigurieren:
# Sammlung → Rechtsklick → Export → Better BibTeX → Keep updated
# Speicherort: site/_bibliography/references.bib

Zitieren in Quarto

Die DPH-Inzidenz liegt bei 13,3 % [@Webb2025].
Mehrere Studien bestätigen dies [@Lee2021; @Klaassen2025].
@Roser2023 zeigten, dass Gewichtszunahme signifikant ist.

Typst für PDF-Generierung

Typst ist eine moderne Alternative zu LaTeX für die PDF-Generierung. Quarto kann Typst als Backend verwenden:

format:
  typst:
    template: _templates/typst/elspub.typ
    toc: true

Die App nutzt Typst auch intern für die Generierung von Patienten-Berichten (bericht_vorlage.typ) und Einwilligungserklärungen (consent_vorlage.typ).

GitHub Actions CI/CD

Jeder Push auf main löst automatisch aus:

  1. Python + Jupyter installieren (Dependencies)
  2. Graphviz installieren (Diagramme)
  3. Quarto render (alle .qmd → HTML)
  4. Netlify deploy (Passwortgeschützte Website)
# .github/workflows/deploy.yml (vereinfacht)
on:
  push:
    branches: [main]
    paths: ['site/**']

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
      - run: pip install jupyter plotly numpy scipy pandas
      - uses: quarto-dev/quarto-actions/setup@v2
      - run: cd site && quarto render
      - uses: nwtgck/actions-netlify@v3

Netlify mit Passwortschutz

Die Website wird auf Netlify gehostet mit einer Edge Function für Passwortschutz:

  • Login-Seite im UKE-Branding
  • SHA-256-gehashtes Passwort als Cookie (30 Tage)
  • Edge Function prüft Cookie server-seitig
  • Alle Inhalte nur nach Authentifizierung zugänglich

Dieses Setup adaptieren

Für eine neue Studie:

  1. Repository forken/klonen
  2. App anpassen (andere Parameter, andere Schwellenwerte)
  3. Konzeptpapier-Kapitel an eigene Fragestellung anpassen
  4. references.bib durch eigene Zotero-Sammlung ersetzen
  5. _quarto.yml anpassen (Titel, Autor, Sidebar-Struktur)
  6. GitHub Secrets setzen (NETLIFY_AUTH_TOKEN, NETLIFY_SITE_ID)
  7. Push → automatisch live