Dein eigenes Calendly: Kostenlos, Open Source & 100% DSGVO-konform

Warum $15 pro Monat für Calendly bezahlen und deine Kundendaten auf US-Server schicken, wenn du es besser, sicherer und kostenlos selbst hosten kannst?Alex FriedlDec 21, 2025
calendly free tool

Jeder Freelancer und jede Agentur kennt das Dilemma: Du brauchst ein Buchungstool. Aber die großen Player (Calendly, Acuity, HubSpot) sind oft teuer und – was noch wichtiger ist – sie lesen deine Daten. Damit ein Buchungstool funktioniert, muss es wissen, was in deinem Kalender steht. Das bedeutet oft, dass Drittanbieter Zugriff auf alle deine Termindetails haben.

Die Lösung: Baue dir deine eigene, datensparsame Infrastruktur. Behalte die Datenhoheit.

Das fehlende Puzzleteil dafür ist oft nicht das Frontend (dafür gibt es tolle Open-Source-Lösungen oder einfache Formulare), sondern das Backend: Wie teile ich meine Verfügbarkeit, ohne meine Privatsphäre aufzugeben?

Hier kommt der Busy ICS Proxy ins Spiel.

Das Repository: github.com/alexfriedl/clean-ics-feed-generator


Das Problem: Google Kalender ist geschwätzig

Du könntest einfach deinen Google Kalender freigeben. Aber:

  1. Privatsphäre: Oft rutschen doch Details durch oder die URL ist öffentlich erratbar.
  2. Kontrolle: Du willst nicht, dass jemand sieht, wie lange deine Mittagspause ist – nur, dass du nicht verfügbar bist.
  3. Kompatibilität: Viele selbstgehostete Tools brauchen saubere .ics Feeds, keine komplexen Google APIs.

Der Busy ICS Proxy ist ein minimalistischer Node.js Microservice. Er stellt sich zwischen deinen privaten Kalender und die Außenwelt. Er fungiert als "Firewall" für deine Termine.


Die Technik: So funktioniert der Code

Der Proxy zieht deinen geheimen Kalender-Feed, berechnet alle Termine (auch komplexe Wiederholungen!) und generiert einen neuen Feed, der nichts enthält außer: "Hier ist belegt".

Hier ist ein Blick unter die Haube (Node.js & Express):

1. Der Server & Security

Wir nutzen einen einfachen Express-Server. Ein optionaler Security-Key sorgt dafür, dass nicht Hinz und Kunz deinen Feed abrufen können, sondern nur deine Booking-App.

javascript
import express from "express"; import dotenv from "dotenv"; const app = express(); dotenv.config(); // Middleware für optional security key app.use((req, res, next) => { const FEED_KEY = process.env.FEED_KEY; if (!FEED_KEY) return next(); // Nur wer den Key hat, darf den Feed sehen if (req.path.endsWith(".ics") && req.query.key !== FEED_KEY) { return res.status(403).send("Forbidden"); } next(); });

2. Die Magie: Parsing & Anonymisierung

Das Skript nutzt node-ical zum Parsen. Der knifflige Teil sind wiederkehrende Termine (Recurring Events). Ein Termin wie "Jeden Montag Meeting" steht im Code nur einmal, muss aber für die Verfügbarkeitsprüfung auf konkrete Daten "ausgerollt" werden.

Zusätzlich müssen wir oft Zeitzonen korrigieren, da Server (wie Railway/Heroku) auf UTC laufen, dein Kalender aber vermutlich in Berlin-Zeit (CET/CEST) ist.

javascript
// Wir holen den originalen Feed const response = await fetch(process.env.SOURCE_ICS_URL); const icsData = await response.text(); const events = await ical.async.parseICS(icsData); // Zeitfenster definieren (z.B. 8 Wochen im Voraus) const now = new Date(); const eightWeeksFromNow = new Date(now.getTime() + (8 * 7 * 24 * 60 * 60 * 1000)); for (const [key, event] of Object.entries(events)) { if (event.type === 'VEVENT') { // Handling für wiederkehrende Termine (RRULE) if (event.rrule) { const dates = event.rrule.between(now, eightWeeksFromNow, true); for (const date of dates) { // Zeitzonen-Korrektur für UTC Server (Wichtig für deutsche Zeit!) let startDate = new Date(date); if (process.env.TZ === 'UTC') { // Einfacher Fix für Europe/Berlin Sommer/Winterzeit const month = startDate.getMonth(); const isSummerTime = month >= 2 && month <= 9; const hoursToAdd = isSummerTime ? 2 : 1; startDate = new Date(startDate.getTime() + hoursToAdd * 3600000); } // Das Event wird anonymisiert zur Liste hinzugefügt busyBlocks.push({ start: startDate, end: new Date(startDate.getTime() + duration), uid: `${key}-${startDate.getTime()}` // Eindeutige ID generieren }); } } // Handling für normale Einzel-Events... } }

3. Der Output: 100% DSGVO-konform

Am Ende generieren wir einen validen .ics Stream. Egal was im Original stand ("Zahnarzt", "Date", "Geheimes Projekt") – im Output steht nur SUMMARY:Busy.

javascript
// ... Loop durch alle busyBlocks ... busyIcs += "BEGIN:VEVENT\r\n"; busyIcs += "SUMMARY:Busy\r\n"; // Das wichtigste: Keine Details! busyIcs += "CLASS:PRIVATE\r\n"; busyIcs += `DTSTART:${dtStart}\r\n`; busyIcs += `DTEND:${dtEnd}\r\n`; busyIcs += "END:VEVENT\r\n";

Deployment in 2 Minuten (Kostenlos)

Du brauchst keinen eigenen Server. Railway ist hierfür perfekt (und hat einen großzügigen Free-Tier/Trial).

  1. Forke das Repo.
  2. Erstelle ein neues Projekt auf Railway via GitHub Connect.
  3. Setze die Environment Variables:
  • SOURCE_ICS_URL: Deine geheime Google Kalender URL.
  • FEED_KEY: Dein Passwort (z.B. meinGeheimerKey123).
  • TZ: UTC (oder deine Server-Zeit).

Fertig. Deine URL lautet nun: https://dein-projekt.railway.app/busy.ics?key=meinGeheimerKey123


Use Case: Deine eigene Booking-Page

Jetzt hast du das Backend. Was machst du damit?

Schau dir alexfriedl.com/booking an. Dort läuft genau dieses Setup.

  1. Das Frontend ist eine statische Seite (könnte Next.js, HTML oder WordPress sein).
  2. Es ruft den Busy ICS Proxy auf.
  3. Es zeigt freie Slots an, basierend auf den "Busy"-Blöcken.
  4. Der User bucht einen Termin -> dieser landet via Formular (oder Webhook) wieder in deinem Kalender.

Das Ergebnis:

  • Du sparst ~$150/Jahr an SaaS-Kosten.
  • Kein US-Unternehmen analysiert deine Meeting-Struktur.
  • Volle Kontrolle über das Design.
  • Deine Clients sehen nur, wann du frei bist – niemals warum du beschäftigt bist.

Hol dir den Code und starte dein eigenes, souveränes Booking-System: 👉 Zum GitHub Repository

Über den Autor

Alex Friedl

Alex Friedl

Experte für digitale Produkte

Ich vereine User Research, Prototyping und TypeScript Frontend-/API-Entwicklung um exzellente digitale Lösungen zu gestalten.

Alexander Friedl
Checking...
Checking...

Lassen Sie uns über Ihr Projekt sprechen

Ich verwandle komplexe Anforderungen in elegante Lösungen.

Design
Design & Dev
Development

+49 157 581 508 46