Einrichtung: Online-Sync und Google Kalender
Ziele, Notizen und Finanzen laufen auf PC, iPhone und iPad. Deine Daten werden auf dem Gerät mit deinem Passwort verschlüsselt und über dein eigenes Supabase-Projekt abgeglichen. Die Apps selbst liegen bei Cloudflare Pages unter einer sicheren Adresse. Einmalig brauchst du dafür drei kostenlose Konten. Rechne mit etwa 45 Minuten. Tipp: Die Startseite deiner Apps prüft die Einrichtung selbst und zeigt dir die Adressen, die du bei Supabase und für die Edge Function brauchst, zum Kopieren an.
Überblick
| Dienst | Wofür | Was er sieht |
|---|---|---|
| Supabase | Anmeldung, verschlüsselte Datensätze, verschlüsselte Bilder, Google-Zugang | Deine E-Mail-Adresse und unlesbare, verschlüsselte Daten. Nie dein Passwort, nie Inhalte. |
| Cloudflare Pages | Stellt die Programmdateien unter https://…pages.dev bereit | Nur die Programmdateien, keine Daten |
| Google Cloud | Offizielle Google-Anmeldung für den Kalender-Abgleich | Nur die Berechtigung „Termine in deinen eigenen Kalendern“ |
Alle drei sind für deinen Zweck kostenlos und brauchen keine Kreditkarte. Supabase pausiert ein kostenloses Projekt nach einer Woche ganz ohne Nutzung. Dann einfach im Supabase-Dashboard auf „Restore project“ klicken; deine Geräte arbeiten in der Zwischenzeit normal weiter.
Dein Passwort ist der Schlüssel. Supabase bekommt nur einen daraus abgeleiteten Wert. Beim Anlegen des Kontos zeigt die App einmalig einen Wiederherstellungscode an. Bewahre ihn getrennt vom Passwort auf (ausgedruckt oder im Passwort-Manager). Ohne Passwort und Code kann niemand die Cloud-Daten öffnen, auch du nicht. Die Daten auf deinen Geräten bleiben davon unberührt.
1 · Supabase einrichten
- Auf supabase.com mit „Start your project“ ein kostenloses Konto anlegen. Merke dir die E-Mail-Adresse; nutze sie später auch in den Apps.
- New project: Name zum Beispiel
viktors-apps, ein Datenbank-Passwort erzeugen und sicher ablegen (wird für die Apps nicht gebraucht), Region Central EU (Frankfurt). Mit „Create new project“ bestätigen und warten, bis das Projekt bereit ist. - Links SQL Editor › New query. Den gesamten Inhalt der Datei
supabase-sql.txt(ausSupabase.zip, öffnet sich im Editor) einfügen und auf Run klicken. Es erscheint „Success“. Unter Table Editor stehen jetztvault,records,google_linksundgoogle_states. - Links Authentication › URL Configuration (erst nach Schritt 2 möglich, dann hierher zurückkehren):
- Site URL: die Adresse deiner Apps mit Schrägstrich am Ende, z. B.
https://viktors-apps.pages.dev/. Die Startseite deiner Apps zeigt sie unter „Deine Adressen für die Einrichtung“ zum Kopieren. - Redirect URLs › „Add URL“: dieselbe Adresse mit
**am Ende, z. B.https://viktors-apps.pages.dev/**. Nur falls du die PC-Version mit „… starten.bat“ weiter nutzt, zusätzlichhttp://127.0.0.1:47811/**,http://127.0.0.1:47812/**,http://127.0.0.1:47813/**. - Save klicken.
- Site URL: die Adresse deiner Apps mit Schrägstrich am Ende, z. B.
- Links Project Settings (Zahnrad):
- unter Data API die Project URL kopieren, z. B.
https://abcdefghijkl.supabase.co. Wird dort…supabase.co/rest/v1/angezeigt, nimm nur den Teil bis.supabase.co. - unter API Keys den Publishable key (
sb_publishable_…) kopieren. Ist dort nur „Legacy API keys“ sichtbar, nimm anon public.
Den secret- bzw. service_role-Schlüssel nie in die Apps eintragen. Er gehört nur in Supabase selbst.
- unter Data API die Project URL kopieren, z. B.
E-Mails (Bestätigung, Passwort vergessen)
Supabase verschickt ohne eigenen Mailserver nur an Mitglieder deines Projekts und höchstens etwa zwei Mails pro Stunde. Melde dich deshalb in den Apps mit derselben E-Mail-Adresse an wie bei Supabase. Kommt keine Bestätigungsmail an, kannst du unter Authentication › Sign In / Providers › Email die Option „Confirm email“ ausschalten.
Nach dem ersten Anmelden in der App
Sobald dein Konto in Schritt 4 angelegt ist: Authentication › Sign In / Providers › „Allow new users to sign up“ ausschalten. Dann kann niemand sonst ein Konto in deinem Projekt anlegen.
2 · Apps bei Cloudflare Pages bereitstellen
Web-Apps.zipentpacken. Im entpackten Ordner liegen direktindex.html,config.jsund die Ordnerziele,notizenundfinanzen. Diesen Ordner lädst du später hoch.- In diesem Ordner
config.jsmit dem Editor öffnen (Rechtsklick › „Öffnen mit“ › Editor) und die beiden Werte aus Schritt 1.5 eintragen. Nur den Text zwischen den Hochkommas ersetzen:window.VAPPS_CONFIG = { supabaseUrl: 'https://abcdefghijkl.supabase.co', supabaseKey: 'sb_publishable_…' };Mit Strg+S speichern. - Auf dash.cloudflare.com ein kostenloses Konto anlegen und die E-Mail bestätigen.
- Links Workers & Pages › Create application. Die angebotenen Workers-Optionen (GitHub, Hello World, Template, „Upload your static files“) nicht wählen. Ganz unten auf der Seite steht „Looking to deploy Pages? Get started“, darauf klicken. Gibt es oben Reiter „Workers“ und „Pages“, stattdessen den Reiter Pages wählen.
- Bei „Drag and drop your files“ auf Get started klicken. Projektname, z. B.
viktors-apps, dann Create project. Die Adresse wirdhttps://viktors-apps.pages.dev. Ist der Name vergeben, hängt Cloudflare Zeichen an; maßgeblich ist die angezeigte Adresse. - Den Ordner aus Punkt 1 in das Feld ziehen (oder „select from computer“ › „Upload folder“). In der Liste müssen Einträge wie
ziele/index.htmlmit Ordnernamen erscheinen, insgesamt rund 45 Dateien. Dann Deploy site. - Prüfen: Die Adresse öffnen. Die Startseite zeigt einen grünen Kasten „✓ Alle drei Apps gefunden und die Verbindung zu Supabase ist eingetragen“. Ein roter Kasten sagt genau, was fehlt. Darunter stehen deine Adressen für Schritt 1.4 und 3 B.
Neue Versionen: Projekt öffnen › Create deployment › Umgebung Production › den ganzen Ordner erneut hochladen › Save and Deploy. Die Apps melden sich dann mit „Neue Version bereit“. Deine Daten bleiben dabei unverändert.
Warum Pages und nicht „Upload your static files“? Das legt einen Worker an. Bei dem gehen beim erneuten Hochladen über das Dashboard die Unterordner verloren; die drei Apps überschreiben sich dann gegenseitig. Die Apps erkennen das und zeigen „Upload unvollständig“.
3 · Google Kalender verbinden (für Ziele und Notizen)
AGoogle-Cloud-Projekt
- console.cloud.google.com mit deinem Google-Konto öffnen und oben über die Projektauswahl ein neues Projekt anlegen, z. B. „Viktors Apps“.
- Menü › APIs & Dienste › Bibliothek › „Google Calendar API“ suchen › Aktivieren.
- Menü › Google Auth Platform. Steht dort „noch nicht konfiguriert“: Erste Schritte. App-Name „Viktors Apps“, deine E-Mail als Support-Adresse › Weiter › Zielgruppe Extern › Weiter › Kontakt-E-Mail › Weiter › den Richtlinien zustimmen › Erstellen. Danach landest du auf einer Übersicht mit „Messwerte“ und „Projektprüfung“.
- Links Clients › Client erstellen (oder auf der Übersicht „OAuth-Client erstellen“) › Anwendungstyp Webanwendung, Name „Viktors Apps“.
- Autorisierte JavaScript-Quellen: leer lassen (werden nicht gebraucht; dort sind keine Pfade erlaubt).
- Autorisierte Weiterleitungs-URIs › „+ URI hinzufügen“: deine Project URL aus Schritt 1.5 plus
/functions/v1/gcal/callback:https://abcdefghijkl.supabase.co/functions/v1/gcal/callback
- Links Datenzugriff › Bereiche hinzufügen oder entfernen › unten bei „Bereiche manuell hinzufügen“
https://www.googleapis.com/auth/calendar.events.ownedeintragen › Zur Tabelle hinzufügen › Aktualisieren › Speichern. - Links Zielgruppe › bei Veröffentlichungsstatus „Testen“ auf App veröffentlichen › bestätigen. Danach steht dort „In Produktion“. Im Testmodus dürften sich nur eingetragene Testnutzer anmelden, und die Verbindung liefe nach 7 Tagen ab. Eine Überprüfung durch Google brauchst du für die eigene Nutzung nicht.
BEdge Function in Supabase
- In Supabase links Edge Functions › Deploy a new function › Via Editor.
- Als Namen genau
gcaleintragen. Im Editor steht Beispielcode: alles markieren (Strg+A) und löschen. Dann den gesamten Inhalt vongcal-index.txt(ausSupabase.zip, öffnet sich im Editor) einfügen und Deploy function klicken. Bei einer neuen Version: Funktiongcalöffnen › Reiter Code › Inhalt ersetzen › Deploy. - Die Funktion öffnen › Reiter Details bzw. Settings › den Schalter zur JWT-Prüfung („Verify JWT“ / „Enforce JWT verification“) ausschalten und speichern. Google ruft die Rückleitung ohne Supabase-Anmeldung auf; alle anderen Wege prüft die Funktion selbst.
- Edge Functions › Secrets. Oben unter „Add or replace secrets“ je Zeile Name und Value eintragen, mit Add another eine weitere Zeile, am Ende Save:
Ein Secret ändern: dieselbe Zeile mit gleichem Namen und neuem Wert eintragen und Save.
Name Value GOOGLE_CLIENT_IDClient-ID aus A.4 (endet auf .apps.googleusercontent.com)GOOGLE_CLIENT_SECRETClientschlüssel aus A.4 ALLOWED_ORIGINSdie Adresse deiner Apps ohne Schrägstrich am Ende, z. B. https://viktors-apps.pages.dev(steht auf der Startseite). Mehrere Adressen mit Komma trennen. - Prüfen:
https://abcdefghijkl.supabase.co/functions/v1/gcal/callback(mit deiner Project URL) im Browser öffnen. Richtig ist der Text „Dieser Anmeldelink ist abgelaufen …“. Erscheint eine Meldung mit „authorization“ oder „JWT“, ist die JWT-Prüfung noch an. Erscheint „GOOGLE_CLIENT_ID und GOOGLE_CLIENT_SECRET fehlen“, fehlen die Secrets. „Not found“ heißt: Die Funktion heißt nicht genaugcal.
CIn der App verbinden
- Ziele (oder Notizen) öffnen und beim Online-Sync angemeldet sein (Wolken-Symbol oben).
- Kalender › Mit Google verbinden › Mit Google verbinden. Es öffnet sich Googles Anmeldefenster.
- Konto wählen. Google warnt: „Google hat diese App nicht überprüft“. Das ist bei eigenen Apps normal: Erweitert › Zu Viktors Apps wechseln.
- Den Zugriff auf deine Kalendertermine erlauben (Häkchen setzen) › Weiter. Das Fenster zeigt „Verbunden“ und schließt sich; auf iPhone/iPad oben auf „Fertig“ tippen.
Eine Verbindung genügt für alle Geräte und für beide Apps. In der jeweils anderen App schaltest du den Abgleich im Kalender mit „Abgleich einschalten“ dazu.
Was abgeglichen wird
- Abgeglichen werden Termine, die du in der Kalenderansicht von Ziele oder Notizen anlegst: mit Uhrzeit oder ganztägig, mit Wiederholung, Zeitzone und Erinnerungen. Sie landen in deinem Google-Hauptkalender und sind dort unsichtbar als Ziele- bzw. Notizen-Termin markiert.
- Beidseitig (Standard): Änderungen und Löschungen auf beiden Seiten werden übernommen. Haben sich beide Seiten geändert, gilt die jüngere Änderung.
- Einseitig (App → Google): Die App ist führend. In Google geänderte oder gelöschte App-Termine stellt sie beim nächsten Abgleich wieder her.
- Deine übrigen Google-Termine zeigt die App nur an, verändert sie nie und speichert sie nicht. Einzelne kannst du mit „In Ziele übernehmen“ zu App-Terminen machen.
- Zieldaten der Ziele und Termine der Hefter in Notizen erscheinen im App-Kalender, werden aber nicht nach Google übertragen.
- Erinnerungen siehst du als Mitteilung der Google-Kalender-App bzw. per E-Mail. Wähle in der App „Standard deines Google-Kalenders“ oder eigene Erinnerungen (höchstens fünf).
4 · Auf deinen Geräten einrichten
PC (Windows)
- Bisherige Daten sichern. Jede bisherige App wie gewohnt starten (Startmenü bzw. „… starten.bat“) und eine Sicherungsdatei exportieren: Ziele › Datenbank-Symbol oben rechts („Daten und Sicherung“) › Sicherung exportieren; Notizen › „Einstellungen und Daten“ (Zahnrad links) › Exportieren; Finanzen › „Einstellungen & Daten“ (links) › Exportieren. Die Dateien landen im Ordner Downloads.
- In Edge oder Chrome die Adresse deiner Apps öffnen, z. B.
https://viktors-apps.pages.dev/, und auf Ziele klicken. In der Adressleiste auf „App verfügbar · Installieren“ klicken. Genauso für Notizen und Finanzen, jeweils aus dem normalen Browserfenster über die Startseite. - In Ziele oben auf das Wolken-Symbol („Nicht angemeldet“) › mit E-Mail und Passwort Anmelden. Hast du noch kein Konto: Neues Konto, Passwort mit mindestens 10 Zeichen, den Wiederherstellungscode speichern oder ausdrucken und bestätigen. Auf dem PC sind Notizen und Finanzen danach automatisch mit angemeldet.
- Erst jetzt importieren, damit die Daten gleich in die Cloud gehen: Ziele › Datenbank-Symbol › Sicherung importieren › Datei wählen › „Übernehmen“ (vorausgewählt; sind in der App schon Ziele, die bleiben sollen: „Nur fehlende Ziele hinzufügen“) › Importieren. Notizen › Einstellungen und Daten › Importieren › Übernehmen. Finanzen › Einstellungen & Daten › Importieren › Übernehmen.
- Das Wolken-Symbol zeigt danach „Synchron“. Die alten Apps bleiben unverändert auf dem PC; du kannst sie später deinstallieren.
Alternative (nicht nötig): Die bisherige PC-Installation (Ordner mit „… starten.bat“) lässt sich auch weiterverwenden. Ersetze dafür die Dateien im Ordner durch das neue Paket (z. B. Ziele.zip), trage in app/config.js deine Supabase-Werte ein, starte „… starten.bat“ und klicke auf „Jetzt aktualisieren“. Deine Daten bleiben erhalten und werden nach der Anmeldung hochgeladen. Dann musst du aber jede neue Version wieder selbst in den Ordner kopieren und die Adressen http://127.0.0.1:4781x bei Supabase und in ALLOWED_ORIGINS eintragen.
iPhone und iPad
- In Safari
https://viktors-apps.pages.dev/öffnen und eine App antippen. - Auf das Teilen-Symbol tippen (Quadrat mit Pfeil; ab iOS 26 über die Taste „…“) › „Zum Home-Bildschirm“ › „Als Web-App öffnen“ eingeschaltet lassen › Hinzufügen.
- Die App über das neue Symbol starten (nicht in Safari weiterarbeiten – die Home-Bildschirm-App hat einen eigenen Speicher).
- Wolken-Symbol › Anmelden mit E-Mail und Passwort. Die Daten werden geladen.
- Für die anderen beiden Apps wiederholen. Auf iPhone und iPad meldest du dich in jeder App einmal an.
Warum nicht einfach in Safari? Safari löscht die Daten einer Website, die sieben Tage lang nicht geöffnet wurde. Apps auf dem Home-Bildschirm sind davon ausgenommen, und deine Daten liegen zusätzlich verschlüsselt in der Cloud.
Notizen auf dem iPad: Sobald du mit dem Apple Pencil zeichnest, blättert der Finger nur noch und zeichnet nicht mehr. Umschalten unter „Einstellungen und Daten“ › „Nur mit dem Stift zeichnen“.
Im Alltag
- Status oben im Wolken-Symbol: „Synchron“, „Gleicht ab …“, „Offline · 3“ (drei Änderungen warten), „Sync-Fehler“. Antippen zeigt Details und „Jetzt abgleichen“.
- Ohne Internet arbeitest du normal weiter. Änderungen werden hochgeladen, sobald das Gerät wieder online ist.
- Gleichzeitige Änderungen: Unterschiedliche Felder werden zusammengeführt. Am selben Feld gilt die jüngere Änderung. Hast du in Notizen dieselbe Seite auf zwei Geräten beschrieben, liegt die ältere Fassung als „Konfliktkopie“ daneben; Zeichnungen werden strichweise zusammengeführt. Was auf einem Gerät gelöscht und auf einem anderen geändert wurde, bleibt erhalten.
- Erster Abgleich auf einem Gerät, das schon eigene Daten hat: Die App fragt, ob zusammengeführt oder der Cloud-Stand übernommen werden soll, und legt vorher eine automatische Kopie an.
- Passwort ändern: Wolken-Symbol › „Passwort ändern“. Es gilt für alle drei Apps; angemeldete Geräte bleiben angemeldet.
- Passwort vergessen: Wolken-Symbol › „Passwort vergessen?“ › Link aus der E-Mail öffnen (am besten am PC) › Wiederherstellungscode und neues Passwort eingeben.
- Sicherungsdateien bleiben sinnvoll. Exportiere ab und zu und bewahre die Datei außerhalb des Browsers auf.
Wenn etwas nicht klappt
| Meldung | Lösung |
|---|---|
| „Online-Sync ist noch nicht eingerichtet“ | config.js enthält noch die Platzhalter. Werte eintragen und neu hochladen, oder in der App unter „Verbindung ändern“ eintragen. |
| „Die Datenbank ist noch nicht eingerichtet“ | Das SQL-Skript aus Schritt 1.3 wurde nicht (vollständig) ausgeführt. |
| „Supabase-Projekt pausiert“ / „Sync-Server antwortet nicht“ | Im Supabase-Dashboard das Projekt öffnen › Restore project. Danach gleichen die Apps automatisch ab. |
| „E-Mail-Adresse oder Passwort stimmt nicht“ | Groß-/Kleinschreibung prüfen. Nach einer Passwortänderung gilt auf neuen Geräten nur das neue Passwort. |
| „Der Tresor wurde auf einem anderen Gerät neu angelegt“ | Jemand hat „Neu beginnen“ gewählt. Mit dem aktuellen Passwort anmelden und „Zusammenführen“ wählen. |
| „Die Edge Function gcal ist noch nicht eingerichtet“ | Schritt 3 B ausführen, Name genau gcal. |
| „Die Adresse … ist nicht freigegeben“ | Die Adresse der App fehlt in ALLOWED_ORIGINS (ohne Schrägstrich am Ende). |
Google meldet redirect_uri_mismatch | Die Weiterleitungs-URI in Google (A.4) muss exakt https://…supabase.co/functions/v1/gcal/callback lauten. |
| „Verbindung zu Google abgelaufen oder widerrufen“ | Im Kalender auf „Neu verbinden“. Passiert das wöchentlich, ist die Google-App noch im Testmodus (A.6). |
| „Google hat den Zugriff nicht erlaubt“ | Beim Verbinden das Häkchen bei den Kalenderterminen setzen. |
| „Upload unvollständig“ in einer App, oder die Startseite zeigt direkt Ziele | Beim Hochladen sind die Unterordner verloren gegangen. Bei Cloudflare Pages (nicht Workers) den ganzen Ordner erneut hochladen (Schritt 2). |
| „Die Edge Function „gcal“ antwortet dieser App nicht“ | Funktion heißt genau gcal, „Verify JWT“ ist aus, ALLOWED_ORIGINS enthält die Adresse der App (Schritt 3 B, mit dem Prüf-Link testen). |
| Beim Anmelden fragt die App nach Projekt-URL und Publishable key | In der hochgeladenen config.js fehlen die Werte. Eintragen und neu hochladen; bis dahin funktioniert auch die Eingabe im Fenster. |
| Google meldet „Zugriff blockiert“ / „nur für Testnutzer“ | Die Google-App ist noch im Testmodus: Google Auth Platform › Zielgruppe › App veröffentlichen (A.6). |
| App auf dem iPhone ist leer | In der Home-Bildschirm-App anmelden, nicht in Safari. Jede Home-Bildschirm-App hat ihren eigenen Speicher. |
Technik in Kürze: Datenschlüssel AES-256-GCM, eingepackt mit PBKDF2-SHA-256 (600.000 Runden) aus deinem Passwort und mit dem Wiederherstellungscode (HKDF). Anmeldung mit einem davon getrennt abgeleiteten Wert. Jeder Datensatz einzeln verschlüsselt und an Konto, App und Kennung gebunden. Datenbank mit Row Level Security; Schreiben nur über Funktionen mit Konflikterkennung. Google: OAuth 2.0 mit PKCE, Berechtigung calendar.events.owned, Refresh-Token verschlüsselt nur in Supabase.