medienkundig
Meine Bachelorarbeit, weitergebaut zu einem echten Produkt.
// in brief// kurz gesagt
Eine zweisprachige Plattform für Medienkompetenz, gebaut mit meiner Thesis-Partnerin Jacqueline Lehmann: eine öffentliche Wissensseite, eine Lern-App mit neun Übungstypen und ein Admin-Dashboard, das ich nach der Abgabe einfach weitergebaut habe.
- RoleRolle
- Full Stack Dev + UX (Bachelor's thesis, with Jacqueline Lehmann)Full Stack Dev + UX (Bachelorarbeit, mit Jacqueline Lehmann)
- Built withEntwickelt mit
- Astro · React + Vite · TypeScript
- FormatFormat
- Product App
// for whom// für wen
Adults who want to check a suspicious message, link, or claim without first becoming “good with technology.”Erwachsene, die eine verdächtige Nachricht, einen Link oder eine Behauptung prüfen wollen, ohne erst „gut mit Technik“ sein zu müssen.
// project focus// projektfokus
- Teach in contextIm Kontext unterrichtenNine exercise types cover scenarios, URL reading, matching, confidence, and feedback.Neun Übungstypen decken Szenarien, URL-Lesen, Zuordnung, Sicherheitseinschätzung und Feedback ab.
- Lower the first barrierDie erste Hürde senkenAnonymous sessions let people start learning and preserve progress when they later create an account.Anonyme Sessions ermöglichen einen Lernstart und bewahren Fortschritt bei späterer Kontoerstellung.
- Make the product maintainableDas Produkt wartbar machenThe admin dashboard adds content operations, KPIs, and an RSS-backed warning workflow.Das Admin-Dashboard ergänzt Content Operations, KPIs und einen RSS-gestützten Warnungs-Workflow.
// inside// bestandteile
- Public siteÖffentliche WebsiteGlossary and current warningsGlossar und aktuelle Warnungen
- Learning appLern-AppPaths, exercises, progressPfade, Übungen, Fortschritt
- AdminAdminContent operations and insightsContent Operations und Insights
// the decisions behind the screen// die entscheidungen hinter dem screen
Reduce cognitive load before teachingKognitive Last vor dem Lernen reduzieren
One prominent next step, calm spacing, plain German, and a small number of choices keep the interface from becoming another digital hurdle for the people it is meant to support.Ein klarer nächster Schritt, ruhige Abstände, verständliche Sprache und wenige Auswahlmöglichkeiten verhindern, dass die Oberfläche selbst zur digitalen Hürde wird.
Practice with immediate, explanatory feedbackÜben mit direktem, erklärendem Feedback
Exercises do more than mark an answer right or wrong. They explain the cue that matters, which supports transfer when a similar message or URL appears outside the course.Übungen markieren nicht nur richtig oder falsch. Sie erklären den entscheidenden Hinweis—das unterstützt den Transfer, wenn später eine ähnliche Nachricht oder URL auftaucht.
Accessibility is the default pathBarrierearm ist der Standardweg
Generous targets, explicit labels, strong contrast, and tested desktop/mobile breakpoints are product decisions, not a separate compliance layer added later.Große Ziele, explizite Labels, hoher Kontrast und getestete Desktop-/Mobile-Breakpoints sind Produktentscheidungen, keine nachträgliche Compliance-Schicht.
// a technical decision// eine technische entscheidung
XP written server-side through a security-definer RPCXP wird serverseitig über eine Security-Definer-RPC geschrieben
XP and streaks are never written from the browser. The client calls this RPC; Row Level Security plus security definer make sure a learner can only ever touch their own row, and only through logic the server controls.XP und Streaks werden nie im Browser geschrieben. Der Client ruft diese RPC auf; Row Level Security plus Security Definer sorgen dafür, dass Lernende immer nur ihre eigene Zeile ändern können — und nur über Logik, die der Server kontrolliert.
-- supabase/migrations/..._award_xp.sql
create or replace function award_xp(exercise_id uuid, correct boolean)
returns void
language plpgsql
security definer
set search_path = public
as $$
begin
if not correct then
return;
end if;
update progress
set xp = xp + 10,
streak_days = case
when last_active_at::date = (now() - interval '1 day')::date
then streak_days + 1
when last_active_at::date = now()::date
then streak_days
else 1
end,
last_active_at = now()
where user_id = auth.uid();
end;
$$;// outcome// ergebnis
Ein Produkt, das sich über alle drei Apps hinweg fertig anfühlt: die öffentliche Website, eine Lern-App mit allen neun Übungstypen und echtem Fortschrittstracking, sowie ein Admin-Dashboard mit KPIs, Content-Inbox und PostHog-Insights — Letzteres komplett aus eigenem Antrieb, weit über den ursprünglichen Thesis-Rahmen hinaus.
Open project ↗Projekt öffnen ↗// selected screens// ausgewählte ansichten
15 Ansichten