TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Mobile-first PWA für die Haushaltsorganisation von zwei Personen (Next.js + Supabase)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Mobile-first PWA für zwei Personen: Wer macht was, wann – fair verteilt nach Aufwand, mit Checklisten statt gegenseitiger Kontrolle. Umgesetzt ist die komplette Roadmap: Aufgabenliste mit automatischer Rotation, Erledigt-Markierung, Login für zwei Personen, Checklisten, Aufwand-Gewichtung, Verlauf, Tausch-Funktion, Push-Benachrichtigungen und die Dashboard-Ansicht fürs Tablet. • Next.js 16 (App Router, Server Actions) + React 19 • Tailwind CSS 4 • Supabase – Postgres, Auth und Realtime • PWA – Web App Manifest + Service Worker, installierbar über „Zum Homebildschirm"README 전문 보기 ↗
Mobile-first PWA für zwei Personen: Wer macht was, wann – fair verteilt nach Aufwand, mit Checklisten statt gegenseitiger Kontrolle.
Umgesetzt ist die komplette Roadmap: Aufgabenliste mit automatischer Rotation, Erledigt-Markierung, Login für zwei Personen, Checklisten, Aufwand-Gewichtung, Verlauf, Tausch-Funktion, Push-Benachrichtigungen und die Dashboard-Ansicht fürs Tablet.
Auf supabase.com ein kostenloses Projekt erstellen (das musst du selbst machen – Account und Passwort gehören dir).
Im Supabase-Dashboard unter SQL Editor nacheinander ausführen:
supabase/schema.sql – Tabellen, Trigger, RLS-Policies, Realtimesupabase/seed.sql – optionale Beispiel-Aufgabenlisteseed.sql ist als leicht editierbare Liste geschrieben: Namen, Turnus, Aufwand und
Checklisten stehen ganz oben als Tabelle. Mehrfaches Ausführen legt keine Duplikate an.
Update auf eine neue Version: schema.sql ist idempotent und darf jederzeit komplett
erneut ausgeführt werden – neue Spalten, Typen und Funktionen kommen dann einfach dazu.
Für „Auf morgen“, „Diesmal auslassen“ und das automatische Weiterrollen überfälliger
Aufgaben muss die Datei einmal erneut gelaufen sein.
cp .env.local.example .env.local
| Variable | Pflicht | Wofür |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | ja | Projekt-URL (ohne /rest/v1/) |
NEXT_PUBLIC_SUPABASE_ANON_KEY | ja | anon/public-Key aus Project Settings → API |
NEXT_PUBLIC_APP_TIMEZONE | nein | Standard Europe/Berlin; bestimmt, wann der Tag umschlägt |
NEXT_PUBLIC_VAPID_PUBLIC_KEY | für Push | öffentlicher VAPID-Schlüssel |
VAPID_PRIVATE_KEY | für Push | privater VAPID-Schlüssel |
VAPID_SUBJECT | für Push | mailto:-Adresse für den Push-Dienst |
SUPABASE_SERVICE_ROLE_KEY | für Push | nur serverseitig; nötig, um an die andere Person zu senden |
CRON_SECRET | für Push | schützt /api/cron/reminders |
Neue VAPID-Schlüssel erzeugt npx web-push generate-vapid-keys.
Der
service_role-Schlüssel umgeht alle RLS-Policies. Er gehört ausschließlich in serverseitige Variablen (keinNEXT_PUBLIC_-Präfix) und darf nie ins Repo.
npm install
npm run dev
Dann http://localhost:3000 öffnen. Beide Personen registrieren sich je einmal selbst über den Tab Registrieren – Name und Farbe werden dabei direkt gesetzt. Die Rotation greift, sobald beide Konten existieren.
Falls Supabase E-Mail-Bestätigung verlangt: unter Authentication → Providers → Email die Bestätigung abschalten, oder die beiden Bestätigungsmails einmal anklicken.
| Befehl | Zweck |
|---|---|
npm run dev | Entwicklungsserver |
npm run build | Produktions-Build (inkl. TypeScript-Prüfung) |
npm start | Produktions-Server |
npm test | Tests für Verteilungslogik und Datumsrechnung |
npm run typecheck | Nur TypeScript prüfen |
npm run format | Prettier über das Projekt laufen lassen |
npm run icons | PWA-Icons neu erzeugen |
Der Kern steckt in src/lib/rotation.ts und
src/lib/scheduler.ts:
assignments_one_open_per_task) stellt sicher,
dass pro Aufgabe nie zwei offene Zuweisungen entstehen – auch nicht, wenn beide Handys
gleichzeitig syncen.npm test deckt genau diese Regeln ab.
Wer eine Aufgabe zugewiesen bekommen hat, kann sie auf der Karte zum Tausch anbieten. Die andere Person sieht die Anfrage ganz oben auf Heute und kann übernehmen oder ablehnen; bei Annahme wechselt die Zuweisung, und die Minuten zählen ab dann für die neue Person. Ein partieller Unique-Index lässt pro Zuweisung nur eine offene Anfrage zu. Wird die Aufgabe zwischenzeitlich erledigt, schließt sich die Anfrage von selbst.
Zwei Anlässe: eine neue Tauschanfrage (sofort) und die Erinnerung an fällige Aufgaben (einmal täglich, eine Nachricht pro Person statt eine pro Aufgabe).
Aktiviert wird das pro Gerät unter Profil → Benachrichtigungen. Der Versand läuft
über die Web-Push-API mit VAPID; public/sw.js verarbeitet push und
notificationclick. Tote Endpunkte (App deinstalliert) räumt der Server automatisch auf.
Die tägliche Erinnerung hängt an /api/cron/reminders, geschützt über CRON_SECRET.
Auf Vercel übernimmt das der Cron-Eintrag in vercel.json (06:00 UTC).
Lokal testen:
curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/reminders
Der Endpunkt ist idempotent – pro Zuweisung wird über reminded_at höchstens einmal
erinnert.
Auf dem iPhone funktioniert Push nur, wenn die App über „Teilen → Zum Homebildschirm“ installiert und von dort geöffnet wird (iOS 16.4+). Im Safari-Tab fehlt die API komplett; die App weist im Profil darauf hin.
/einkauf: ein Feld, ein Knopf. Steht eine Menge vorne („2 Liter Milch"), wird sie
automatisch abgetrennt und separat angezeigt. Abgehakte Artikel wandern nach „Im Wagen"
und lassen sich nach dem Einkauf per „Liste aufräumen" in einem Rutsch löschen. Beide
Geräte sehen Änderungen sofort.
An jeder offenen Zuweisung hängt ein kleiner Notizblock: ein Kommentar („Wischmopp ist hin") und beliebig viele Fotos. Ein Kommentar löst eine Benachrichtigung bei der anderen Person aus.
Bilder werden im Browser auf 1600 px längste Kante heruntergerechnet, bevor sie hochgeladen
werden – ein Handyfoto hat sonst leicht 8 MB. Sie liegen im privaten Storage-Bucket
task-photos; die Anzeige läuft über signierte Links mit einer Stunde Gültigkeit.
Unter /verlauf, unterhalb der neutralen Verteilungsübersicht: Punkte (= erledigte
Minuten), Serie in Tagen, Monats- und Gesamtwertung. Die Serie zählt aufeinanderfolgende
Tage mit mindestens einer erledigten Aufgabe und reißt am laufenden Tag noch nicht.
Die Logik steckt in src/lib/score.ts und ist getestet.
Unter Profil → Kalender-Abo steht eine Adresse der Form
/api/kalender/<token>.ics. Einmal in Google Kalender („Weitere Kalender → Per URL"),
Apple Kalender oder Outlook eintragen – danach stehen alle Aufgaben dort, offene am
Fälligkeitstag, erledigte der letzten vier Wochen mit Häkchen am Tag der Erledigung.
Der Feed ist bewusst einbahn (App → Kalender). Das Token in der URL ist der einzige Schutz, Kalender-Clients können sich nicht anmelden – die Adresse ist deshalb wie ein Passwort zu behandeln. „Neue Adresse erzeugen" macht die alte sofort ungültig.
Der Turnus wird nicht als RRULE abgebildet: die App verschiebt Fälligkeiten
dynamisch, eine feste Wiederholungsregel würde im Kalender bald etwas anderes behaupten
als die App.
Eine gemeinsame Pinnwand für kurze Nachrichten – „Milch ist alle", „Handwerker kommt
Donnerstag". Zu finden unter /notizen, in Kurzform auch auf der Startseite und auf dem
Wochenplan (dort nur lesend).
Eine neue Notiz löst eine Benachrichtigung bei der anderen Person aus. Notizen lassen sich anheften (stehen dann immer oben), abhaken (verschwinden aus der aktiven Liste, bleiben unter „Erledigt" nachlesbar) oder endgültig löschen.
Nicht zu verwechseln mit der Notiz an einer Aufgabe – die steht im Aufgabenformular und beschreibt die Aufgabe selbst dauerhaft.
/dashboard zeigt Montag bis Sonntag nebeneinander, jede Aufgabe farbig nach Person,
der heutige Tag hervorgehoben. Unter jeder Spalte steht der Tagesaufwand – daran sieht
man sofort, ob ein Tag überladen ist.
Eine Aufgabe antippen öffnet die Tagesauswahl: damit wandert sie auf einen anderen Tag derselben Woche. Verschoben wird nur die Fälligkeit, nicht die Zuständigkeit, und der Turnus rechnet weiterhin ab der tatsächlichen Erledigung – eine Verschiebung verzerrt ihn also nicht dauerhaft.
Überfälliges steht in einem eigenen Streifen über dem Raster, alles jenseits des Sonntags unter „Nächste Woche". Abgehakt wird weiterhin am Handy. Die Seite aktualisiert sich über Realtime und zusätzlich alle fünf Minuten, damit auch der Tageswechsel ankommt.
src/
app/
(app)/ Angemeldeter Bereich mit Bottom-Navigation
page.tsx „Heute" – überfällig / heute / diese Woche + Wochenverteilung
aufgaben/ Liste, Anlegen, Bearbeiten inkl. Verlauf pro Aufgabe
einkauf/ Einkaufsliste
notizen/ Gemeinsame Pinnwand
verlauf/ Woche & Monat pro Person, zuletzt Erledigtes
profil/ Name, Farbe, Abwesenheit, Abmelden
login/ Anmelden und Registrieren
dashboard/ Große Übersicht für Tablet/Wand-Display
api/cron/ Täglicher Erinnerungs-Endpunkt
api/kalender/ ICS-Feed zum Abonnieren
components/ UI-Bausteine (Client Components)
lib/
rotation.ts Reine Verteilungslogik (getestet)
scheduler.ts Erzeugt fällige Zuweisungen
actions.ts Server Actions (Schreiben)
queries.ts Server-seitige Lesezugriffe
score.ts Punkte und Serien (getestet)
ics.ts iCalendar-Generator (getestet)
push.ts Push-Versand (Server)
push-client.ts An-/Abmelden von Geräten (Browser)
supabase/ Client für Browser, Server, Proxy und Service-Role
supabase/ schema.sql und seed.sql
scripts/ Icon-Generator
NEXT_PUBLIC_SUPABASE_*-Variablen als Environment Variables eintragen.message existiert schon,
die UI schickt es noch nicht mit).npm install funktioniert normal. Nur beim Hinzufügen von vitest stolpert npm 10.9.2
über einen Bug in der Peer-Dependency-Auflösung – falls das nötig wird, hilft
npm install --legacy-peer-deps.household_id dazukommen.