medienkundig
My Bachelor’s thesis, turned into a real product.
// in brief// kurz gesagt
A bilingual media-literacy platform I built with my thesis partner Jacqueline Lehmann: a public knowledge site, a learning app with nine exercise types, and an admin dashboard I kept building after the thesis was already graded.
- 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
A product that feels finished across all three apps: the public site, a learning app covering all nine exercise types with real progress tracking, and an admin dashboard with KPIs, a content inbox, and PostHog-linked insights — that last piece entirely self-initiated, well past the original thesis scope.
Open project ↗Projekt öffnen ↗// selected screens// ausgewählte ansichten
15 screens