{"id":48714837,"url":"https://github.com/crystalgamesstudio/wspolniak","last_synced_at":"2026-04-25T14:09:55.289Z","repository":{"id":350686286,"uuid":"1206255377","full_name":"CrystalGamesStudio/wspolniak","owner":"CrystalGamesStudio","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-23T11:14:26.000Z","size":551,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T11:28:12.356Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://wspolniak.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CrystalGamesStudio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-09T18:24:00.000Z","updated_at":"2026-04-23T11:14:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/CrystalGamesStudio/wspolniak","commit_stats":null,"previous_names":["crystalgamesstudio/wspolniak"],"tags_count":5,"template":false,"template_full_name":"auditmos/tstack-on-cf","purl":"pkg:github/CrystalGamesStudio/wspolniak","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrystalGamesStudio%2Fwspolniak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrystalGamesStudio%2Fwspolniak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrystalGamesStudio%2Fwspolniak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrystalGamesStudio%2Fwspolniak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CrystalGamesStudio","download_url":"https://codeload.github.com/CrystalGamesStudio/wspolniak/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrystalGamesStudio%2Fwspolniak/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32179387,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T11:42:27.955Z","status":"ssl_error","status_checked_at":"2026-04-23T11:42:18.877Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-11T16:14:50.282Z","updated_at":"2026-04-23T12:01:11.141Z","avatar_url":"https://github.com/CrystalGamesStudio.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wspólniak\n\n**Prywatny rodzinny serwis do dzielenia się zdjęciami — self-hostowany na Cloudflare.**\n\nWspólniak to prosta, otwarta alternatywa dla Facebooka, Google Photos i iCloud Shared Albums — zaprojektowana dla jednej rodziny, jednej instancji i jednego admina. Bez haseł, bez reklam, bez śledzenia. Babcia dostaje link, klika, instaluje PWA na telefonie i już jest w środku.\n\n\u003e **Status:** MVP in development. Zobacz [`docs/002-prd.md`](docs/002-prd.md) oraz [`plans/wspolniak-mvp.md`](plans/wspolniak-mvp.md).\n\n---\n\n## About\n\n### Dla kogo\n\nDla rodzin, które chcą prywatnej przestrzeni na zdjęcia, bez:\n\n- **Rejestracji i haseł** — starsze osoby w rodzinie (babcia, dziadek) nie radzą sobie z logowaniem, captchami i weryfikacją email. Każda bariera = nieużywany serwis.\n- **Algorytmicznego feedu** — chcesz widzieć zdjęcia chronologicznie, nie wg tego co AI uzna za \"angażujące\".\n- **Reklam i trackingu** — zdjęcia rodzinne nie powinny karmić cudzych modeli ML.\n- **Centralnego dostawcy** — jedna rodzina = jedna instancja = osobne dane. Zero shared infrastructure.\n\n### Jak to działa\n\n1. **Admin** (głowa rodziny) wdraża swoją instancję Wspólniaka jednym kliknięciem \"Deploy to Cloudflare\".\n2. Admin tworzy konta dla członków rodziny i dostaje dla każdego unikalny **magic link**.\n3. Admin dystrybuuje linki poza systemem — SMS, WhatsApp, email.\n4. Członek rodziny klika link → zostaje zalogowany na zawsze (long-lived cookie).\n5. Członek instaluje PWA na telefonie (\"Dodaj do ekranu głównego\"), robi zdjęcie, wrzuca.\n6. Reszta rodziny dostaje natychmiastowe **push notification** i widzi zdjęcie w chronologicznym feedzie.\n\n### Funkcjonalności MVP\n\n- Posty z opisem i 1-10 zdjęciami (JPEG, PNG, WebP, **HEIC z iPhone'a** — automatyczna konwersja)\n- Chronologiczny feed z infinite scroll\n- Komentarze pod postami\n- Push notifications (Android, iOS 16.4+, desktop)\n- PWA — instalowalna na ekranie głównym telefonu\n- Offline reading ostatnio załadowanego feedu\n- Jeden admin per instancja, dowolna liczba członków\n\n### Czego **nie** ma i nie będzie\n\n- Multi-tenancy (jeden Worker = jedna rodzina)\n- Publicznych profili\n- Reakcji / lajków (post-MVP)\n- Algorytmicznego rankingu\n- Reklam\n- Hostowanej wersji SaaS\n\n### Stack\n\n| Layer | Technology |\n|---|---|\n| Framework | TanStack Start (SSR + Router + Query) |\n| Styling | Tailwind CSS v4 + Shadcn/UI |\n| API | Hono na Cloudflare Workers |\n| Database | Neon PostgreSQL (serverless) |\n| Image storage | Cloudflare Images (automatyczna konwersja HEIC, warianty) |\n| Push | Web Push VAPID |\n| Language | TypeScript strict, Polish UI |\n| License | AGPL-3.0-or-later |\n\n---\n\n## Dla członków rodziny\n\nDostałeś link od kogoś z rodziny? Oto jak zacząć:\n\n### 1. Otwórz link\n\nKliknij link, który dostałeś (np. przez SMS lub WhatsApp). Zostaniesz automatycznie zalogowany — bez hasła, bez rejestracji.\n\n### 2. Zainstaluj aplikację na telefonie\n\nWspólniak działa jako PWA (Progressive Web App) — możesz \"zainstalować\" go jak normalną aplikację, bez App Store.\n\n**Android (Chrome):**\n1. Pojawi się baner **\"Zainstaluj aplikację Wspólniak\"** na dole ekranu\n2. Kliknij **Instaluj**\n3. Gotowe — ikona pojawi się na ekranie głównym\n\n**iPhone (Safari):**\n1. Pojawi się baner z instrukcją na dole ekranu\n2. Naciśnij ikonę **Udostępnij** (kwadrat ze strzałką w górę)\n3. Wybierz **Dodaj do ekranu głównego**\n4. Potwierdź klikając **Dodaj**\n\n\u003e **Ważne:** Na iPhone musisz użyć Safari — Chrome/Firefox na iOS nie wspierają instalacji PWA.\n\n### 3. Włącz powiadomienia\n\nPo zainstalowaniu aplikacji pojawi się komunikat **\"Włącz powiadomienia o nowych zdjęciach\"**. Kliknij **Włącz** — dzięki temu dostaniesz powiadomienie na telefon za każdym razem, gdy ktoś wrzuci nowe zdjęcie lub skomentuje post.\n\n\u003e **iPhone:** Powiadomienia push wymagają iOS 16.4 lub nowszego i działają tylko po zainstalowaniu aplikacji na ekranie głównym.\n\n### 4. Gotowe\n\nOtwieraj Wspólniaka z ekranu głównego, przeglądaj zdjęcia, komentuj i wrzucaj swoje. Ostatnio załadowany feed jest dostępny nawet offline.\n\n---\n\n## Self-host\n\nWspólniak jest projektowany jako **self-hosted first**. Chcesz uruchomić własną instancję dla swojej rodziny? Potrzebujesz:\n\n### Wymagania\n\n- **Konto Cloudflare** (free tier wystarcza dla Workers)\n- **Baza danych Neon PostgreSQL** (free tier: 0.5 GiB storage, 190h compute)\n- **Subskrypcja Cloudflare Images** (~$5/mies, 100k obrazów + 100k delivery) — wymagana dla automatycznej konwersji HEIC i generacji wariantów (thumbnail/full/avif)\n- **Domena** — własna (custom domain w CF) albo darmowa `*.workers.dev`\n- **~10 minut** na pierwszy deploy\n\n### Quick start\n\n```bash\n# Klonuj repo\ngit clone https://github.com/CrystalGamesStudio/wspolniak.git\ncd wspolniak\n\n# Zainstaluj zależności\npnpm install\n\n# Skonfiguruj wrangler.jsonc (CF Images bindings, custom domain)\n# Zobacz docs/ dla szczegółów\n\n# Uruchom lokalnie\npnpm dev\n\n# Deploy na Cloudflare (dev)\npnpm deploy\n\n# Deploy na produkcję\npnpm deploy:production\n```\n\nPo pierwszym deploy wejdź na swoją domenę i kliknij `/setup` — pierwsza osoba która wejdzie zostanie adminem swojej instancji i dostanie magic link do skopiowania.\n\n### Scripts\n\n| Script | Purpose |\n|---|---|\n| `pnpm dev` | Dev server na porcie 3000 |\n| `pnpm build` | Production build |\n| `pnpm deploy` | Build + `wrangler deploy` (dev) |\n| `pnpm deploy:production` | Build + deploy na produkcję |\n| `pnpm test` / `test:watch` / `test:coverage` | Vitest |\n| `pnpm types` | Type-check (`tsc --noEmit`) |\n| `pnpm lint` / `lint:fix` | Biome |\n| `pnpm knip` | Detect unused files, deps, exports |\n| `pnpm admin:dev:regenerate` | Regeneruj magic link admina (dev) |\n| `pnpm admin:production:regenerate` | Regeneruj magic link admina (prod) |\n| `./sync-secrets.sh production` | Sync sekretów z `.production.vars` do CF |\n\nPełna lista scripts i dev workflow — zobacz [`.claude/CLAUDE.md`](.claude/CLAUDE.md).\n\n### Licencja i Twoje obowiązki\n\nWspólniak jest objęty licencją **AGPL-3.0-or-later**. To oznacza, że możesz:\n\n✅ Uruchomić instancję dla siebie i swojej rodziny\n✅ Modyfikować kod pod swoje potrzeby\n✅ Udostępniać zmodyfikowaną wersję innym\n\nAle **musisz**:\n\n- Udostępnić swoje modyfikacje na tej samej licencji, jeśli jakkolwiek publicznie serwujesz instancję (nawet bez komercjalizacji — AGPL pokrywa \"network use\")\n- Zachować nagłówki autorskie i SPDX\n\nPełny tekst licencji: [`LICENSE`](LICENSE).\n\n### Prywatność i RODO\n\nHostując Wspólniaka dla własnej rodziny, zazwyczaj mieścisz się w wyłączeniu \"wyłącznie osobistych/domowych celów\" (art. 2 ust. 2 lit. c RODO). Wspólniak jest zaprojektowany z myślą o prywatności:\n\n- Zero analytics, zero telemetry\n- Żadnych persistent identyfikatorów poza family session cookie\n- Zdjęcia są za auth wallem, widoczne tylko dla członków Twojej instancji\n- Soft delete (post-MVP: export + full delete)\n\n**Uwaga**: Jeśli planujesz hostować Wspólniaka dla kogoś spoza swojego gospodarstwa domowego, skonsultuj się z prawnikiem — wychodzisz wtedy poza wyłączenie \"domowe\" w RODO.\n\n---\n\n## Deploy to Cloudflare\n\n\u003e **Note:** \"Deploy to Cloudflare\" button wymaga publicznego repo i działającego `wrangler.jsonc` — będzie dodany w Phase 9 (Release Polish). Do tego czasu używaj manualnego quick startu powyżej.\n\n\u003c!--\n[![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/CrystalGamesStudio/wspolniak)\n--\u003e\n\nPlanowany flow dla self-hosterów:\n\n1. Klikasz **Deploy to Cloudflare** button (powyżej)\n2. Cloudflare fork'uje repo na Twoje konto GitHub, tworzy Worker i binding\n3. **Aktywujesz Cloudflare Images** w dashboard ($5/mies subscription)\n4. Ustawiasz custom domain (opcjonalnie) lub używasz `*.workers.dev`\n5. Wchodzisz na swoją domenę → `/setup` → tworzysz konto admina\n6. Dostajesz swój pierwszy magic link → instalujesz PWA → zapraszasz rodzinę\n\n---\n\n## Contributing\n\nWspólniak jest open-source i chętnie przyjmuje PR-y. Zanim zaczniesz pracę:\n\n1. Zajrzyj do [`plans/wspolniak-mvp.md`](plans/wspolniak-mvp.md) żeby zobaczyć phase plan\n2. Sprawdź [GitHub issues](https://github.com/CrystalGamesStudio/wspolniak/issues) — każda faza ma swoją issue z acceptance criteria\n3. Przeczytaj [`.claude/CLAUDE.md`](.claude/CLAUDE.md) i [`.claude/rules/`](.claude/rules/) — projekt ma formalne konwencje (deep modules, error handling, atomic imports)\n4. Quality gates przed PR: `pnpm types \u0026\u0026 pnpm lint \u0026\u0026 pnpm test`\n\n---\n\n## License\n\nCopyright © 2026 Crystal Games Studio\n\nWspólniak is free software: you can redistribute it and/or modify it under the terms of the **GNU Affero General Public License** as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but **WITHOUT ANY WARRANTY**; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU AGPL License](LICENSE) for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrystalgamesstudio%2Fwspolniak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrystalgamesstudio%2Fwspolniak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrystalgamesstudio%2Fwspolniak/lists"}