Skinso Poradnik Startowy
v202603141018_v1
📘 Poradnik startowy · Marzec 2026

Witaj w projekcie
Skinso

Ten poradnik to wszystko, czego potrzebujesz, żeby zrozumieć projekt od zera — strukturę kodu, logikę biznesową, design system i sposób pracy. Czytaj liniowo lub skacz między sekcjami za pomocą nawigacji po lewej.

Next.js 15 TypeScript Tailwind CSS Prisma PostgreSQL Skinso v2.0

Co to jest Skinso? #

Skinso to platforma społecznościowa dedykowana branży beauty. Jej cel jest prosty: połączyć klientów, modelki, właścicieli salonów i specjalistów beauty w jednym ekosystemie — zamiast rozsianych po social media i komunikatorach.

Hasło przewodnie: „Łączymy społeczność beauty w jednym miejscu."

Platforma rozwiązuje konkretny problem: branża beauty działa chaotycznie. Klient szuka polecenia na Facebooku. Modelka wysyła portfolio Instagramem. Salon rekrutuje przez formularz Google. Skinso konsoliduje to wszystko.

Dla kogo jest ten poradnik #

Ten dokument zakłada, że:

  • Wiesz, czym jest JavaScript i jak działa react/Next.js na podstawowym poziomie
  • Możliwe, że dopiero dołączyłeś/-aś do projektu lub wracasz po dłuższej przerwie
  • Chcesz zrozumieć dlaczego decyzje zostały podjęte, nie tylko jak coś działa

Jak czytać ten dokument #

Jeśli zaczynasz od zera — czytaj liniowo. Jeśli wracasz po przerwie lub masz konkretne pytanie — użyj nawigacji po lewej. Każda sekcja jest niezależna i możesz do niej wrócić w dowolnej chwili.

Skrót: Chcesz od razu uruchomić projekt lokalnie? Przejdź do sekcji Setup środowiska.

Trzy przestrzenie #

Skinso nie jest jedną aplikacją dla wszystkich. To trzy oddzielne doświadczenia pod jednym dachem, zbudowane wokół roli użytkownika. To najważniejszy koncept w projekcie — zrozum go jako pierwszy.

Klient Przestrzeń Klienta

Persona: Anna, 28 lat, szuka zaufanych usług beauty.

  • Odkrywa profile i portfolio specjalistów
  • Rezerwuje terminy (przyszłość: system bookingu)
  • Ocenia i poleca specjalistów
  • Szuka inspiracji w feedzie treści
  • Komunikuje się przez wiadomości bezpośrednie
Odkrywanie Filtry Booking Recenzje
Modelka / Twórca Przestrzeń Modelki / Kreatora

Persona: Karolina, 25 lat, freelancerka, buduje bazę klientów.

  • Buduje portfolio (zdjęcia, wideo, przed/po)
  • Aplikuje na zlecenia i oferty pracy
  • Ustawia dostępność i stawki
  • Otrzymuje propozycje współpracy
  • Tworzy treści dla marek (UGC)
Portfolio Zlecenia TFP UGC
Biznes Przestrzeń Biznesu (Salon / Marka)

Persona: Piotr, 35 lat, prowadzi 2 salony.

  • Zarządza profilem firmy z usługami i cennikiem
  • Publikuje oferty pracy i zlecenia
  • Rekrutuje specjalistów i modelki
  • Promuje salon i buduje markę
  • Dostęp do panelu analitycznego (roadmap)
Rekrutacja Promocja Oferty pracy CRM
Ważne: Kod routingu w onboardingu (/src/app/onboarding/) jest miejscem, gdzie przypisujemy użytkownikowi jego przestrzeń. Zmiana logiki routingu ma wpływ na całe doświadczenie — modyfikuj ostrożnie.

Persony użytkowników #

Każda decyzja projektowa powinna być weryfikowana przez pryzmat tych trzech person. Kiedy masz wątpliwość — zapytaj: „Co zrobi Anna/Karolina/Piotr?"

Persona Kim jest Główna motywacja Największy strach
Anna — Klientka 28 lat, pracownica biurowa Znaleźć zaufanego specjalistę blisko siebie Stracić czas i pieniądze na kogoś nieprofesjonalnego
Karolina — Modelka 25 lat, freelancerka beauty Zdobyć zlecenia i zbudować rozpoznawalność Ukryć swoje prace w tłumie konkurencji
Piotr — Salon 35 lat, właściciel 2 salonów Znaleźć nowych klientów i zatrudnić talenty Zapłacić za marketing, który nie działa

Zakres MVP #

MVP jest ograniczony celowo. Trzeba wiedzieć, co jest w grze, a co nie.

W MVP: Profile użytkowników + Portfolio + Wyszukiwanie + Wiadomości + Onboarding z routingiem do przestrzeni + Oferty pracy (podstawowe)
Poza MVP (roadmap): System płatności / Stripe, System bookingu, Panel analityczny, Grupy czatowe, Powiadomienia push, Raporty finansowe

Jeśli widzisz coś oznaczonego jako P2 lub // future w kodzie — to jest właśnie ta lista. Nie implementuj tego w MVP, chyba że właściciel produktu to potwierdzi.


Struktura projektu #

Repozytorium jest zorganizowane wielowersyjnie. Główna wersja produkcyjna to 03_skinso_final/ — tutaj trafia gotowy kod. Wersja robocza i prototypy żyją w 02_app_ver_2.0.0/.

Główne katalogi #

202601071309_skinso/
├── 01_plan/ # PRD, notatki, funkcje, domeny
├── 02_app_ver_2.0.0/ # Aktywna wersja dev
│ ├── community/ # HTML prototypy społeczności
│ ├── frontend/ # Komponenty UI (HTML/CSS)
│ ├── poradnik/ # Ten dokument i przyszłe wersje
│ └── pytania onboardingowe.md
├── 03_skinso_final/ # Produkcyjna aplikacja Next.js
│ ├── src/
│ │ ├── app/ # Next.js App Router
│ │ ├── components/ # Współdzielone komponenty
│ │ └── lib/ # Utilities, db, auth
│ ├── prisma/ # Schema bazy danych
│ └── package.json
├── 04_ui/ # Brandbook, design references
└── 41_autocoder/ # Agenty AI do automatyzacji

Ważne pliki — gdzie szukać #

Plik / KatalogCo tam znajdziesz
01_plan/PRD_PL.mdPełna specyfikacja wymagań po polsku. Czytaj przed każdą nową funkcją.
01_plan/notes.mdKrótki opis projektu i kluczowe założenia.
02_app_ver_2.0.0/pytania onboardingowe.mdLogika onboardingu — pytania i routing do przestrzeni.
03_skinso_final/prisma/schema.prismaModel danych — wszystkie tabele i relacje.
03_skinso_final/src/app/Routing Next.js. Każdy folder = route.
04_ui/brandbook_skinso.mdDesign guidelines, kolory, typografia.
02_app_ver_2.0.0/community/HTML prototypy — dobry odnośnik dla UI decyzji.

Stack technologiczny #

Next.js 15
App Router + Server Components. SSR dla odkrywania, CSR dla interakcji w czasie rzeczywistym.
🔷
TypeScript
Strict mode włączony. Żadnych any bez wyraźnego powodu.
🎨
Tailwind CSS
Custom config z tokenami kolorów Skinso. Nie używaj inline kolorów — używaj klas.
🗄️
Prisma + PostgreSQL
ORM do bazy danych. Schema jako jedyne źródło prawdy o modelu danych.
🔐
NextAuth.js
Autentykacja — email/hasło, Google, Facebook. Sesje JWT.
🚂
Railway
Hosting aplikacji i bazy danych. Config w railway.toml.
Dlaczego Next.js, nie Vite/CRA? Potrzebujemy SSR dla SEO (odkrywanie profili przez Google) i Server Actions dla bezpiecznych operacji. Next.js daje to out-of-the-box.

Setup środowiska #

Wymagania #

  • Node.js ≥ 20.x (zalecane: 22.x LTS)
  • pnpm ≥ 9.x — szybszy od npm, używany w projekcie
  • PostgreSQL ≥ 15 lokalnie lub dostęp do Railway instance
  • Git — oczywiste, ale warto wspomnieć
bash — sprawdź wersje
node --version   # powinna być >= 20.x
pnpm --version   # powinna być >= 9.x
psql --version   # powinna być >= 15.x

Pierwsze kroki #

1
Sklonuj i zainstaluj zależności
bash
cd 03_skinso_final
pnpm install
2
Skonfiguruj zmienne środowiskowe

Skopiuj przykładowy plik i uzupełnij wartości:

bash
cp .env.example .env.local

Minimalne wymagane: DATABASE_URL, NEXTAUTH_SECRET, NEXTAUTH_URL

3
Utwórz schemat bazy danych
bash
pnpm prisma migrate dev --name init
pnpm prisma db seed   # opcjonalnie — seed z testowymi danymi
4
Uruchom serwer deweloperski
bash
pnpm dev
# Aplikacja dostępna na http://localhost:3000
Gotowe! Powinieneś widzieć stronę główną Skinso na localhost:3000. Jeśli widzisz błąd bazy danych — sprawdź DATABASE_URL w .env.local.

Zmienne środowiskowe #

Nigdy nie commituj .env.local do repozytorium. Plik jest w .gitignore — ale uważaj na inne pliki .env.*.

ZmiennaWymagana?Opis
DATABASE_URL✅ TakConnection string do PostgreSQL, np. postgresql://user:pass@localhost:5432/skinso
NEXTAUTH_SECRET✅ TakLosowy string do podpisywania sesji. Wygeneruj: openssl rand -base64 32
NEXTAUTH_URL✅ TakURL aplikacji. Lokalnie: http://localhost:3000
GOOGLE_CLIENT_ID⚠️ OpcjonalnaOAuth Google. Bez niej logowanie Googlem nie działa.
GOOGLE_CLIENT_SECRET⚠️ OpcjonalnaPara do Google Client ID.
UPLOADTHING_SECRET⚠️ OpcjonalnaUpload plików (zdjęcia portfolio). Bez niej upload nie działa.

Onboarding i routing przestrzeni #

Onboarding to moment, kiedy nowy użytkownik odpowiada na pytania i zostaje przypisany do jednej z trzech przestrzeni. To krytyczna ścieżka — błąd tutaj oznacza, że użytkownik trafia w złe miejsce.

Logika routingu

Pseudokod — routing na podstawie odpowiedzi
function determineSpace(answers) {
  // Q00 — bezpośredni wybór roli
  if (answers.Q00 === 'klient')   return 'KLIENT'
  if (answers.Q00 === 'modelka')  return 'MODELKA'
  if (answers.Q00 === 'salon')    return 'BIZNES'

  // Q00 === 'nie wiem' — routing pośredni
  if (answers.Q02 === 'tak')                     return 'BIZNES'
  if (answers.Q01.includes('rekrutować'))         return 'BIZNES'
  if (answers.Q01.includes('promować salon'))     return 'BIZNES'
  if (answers.Q01.includes('budować portfolio'))  return 'MODELKA'
  if (answers.Q01.includes('szukać współprac'))   return 'MODELKA'

  return 'KLIENT'  // domyślne
}
Zasada: Przestrzeń można zmienić po onboardingu w ustawieniach profilu — ale interfejs i feed będą zoptymalizowane pod tę wybraną przy rejestracji. Nie blokuj użytkownika całkowicie.

Pytania onboardingowe — skrót

IDPytanieTypPriorytet
Q00Kim jesteś?Single choiceP0
Q01Co chcesz robić w Skinso?Multi-selectP0
Q02Czy reprezentujesz firmę/salon?Yes/NoP0
Q03LokalizacjaTekst + promieńP0
Q04Widoczność profiluSingle choiceP0
Q05Preferencje powiadomieńMulti-selectP1
Q06Zgody (regulamin, wiek 18+)CheckboxyP0

Design system #

Skinso ma spójny design system oparty na ciepłej, beauty-themed palecie. Zawsze używaj zmiennych z konfiguracji Tailwind — nie wpisuj wartości hex bezpośrednio w kodzie.

Kolory #

TokenWartość LightWartość DarkZastosowanie
skinso.bronze #B6713E Główny akcent, CTA, linki, ikony aktywne
skinso.cream #ECDEC1 Tła kart, separatory, subtelne akcenty
skinso.bg #FCF7EE #0A0A08 Tło aplikacji
skinso.surface #FFFFFF #151513 Tło kart, modali, sidebara
skinso.charcoal #32373C Główny kolor tekstu, nagłówki
Zakaz: Nie używaj surowych wartości hex w komponentach. Zawsze używaj tokenów Tailwind: bg-skinso-bronze, text-skinso-charcoal itd. Inaczej dark mode przestaje działać.

Typografia #

FontZastosowanieKlasa Tailwind
PoppinsNagłówki, labele, przyciski, nawigacjafont-heading
LatoTekst ciągły, opisy, metadanefont-body

Przykład użycia:

<!-- Poprawnie -->
<h2 class="font-heading text-2xl font-semibold text-skinso-charcoal">
  Moje portfolio
</h2>
<p class="font-body text-sm text-skinso-charcoal/70">
  Opis portfolio...
</p>

<!-- ❌ Błędnie - nie rób tak -->
<h2 style="font-family: Poppins; color: #32373C">Moje portfolio</h2>

Kluczowe funkcje (MVP) #

To jest lista funkcji z priorytetem P0/P1 — rzeczy, które MUSZĄ działać przed pierwszym publicznym uruchomieniem.

FunkcjaPriorytetStatusŚcieżka w kodzie
Rejestracja i logowanieP0🔨 W budowie/src/app/(auth)/
Onboarding (pytania + routing)P0🔨 W budowie/src/app/onboarding/
Profil użytkownikaP0🔨 W budowie/src/app/profile/
Upload portfolio (zdjęcia)P0🔜 Planowane/src/components/portfolio/
Wyszukiwanie z filtramiP0🔜 Planowane/src/app/discover/
Wiadomości bezpośrednieP0🔜 Planowane/src/app/messages/
Oferty pracy (tworzenie)P0🔜 Planowane/src/app/jobs/
Aplikowanie na ofertyP0🔜 Planowane/src/app/jobs/[id]/apply/
Dark modeP1✅ DziałaTailwind config
Responsywność mobileP1🔨 W budowieWszystkie komponenty

Workflow developerski #

Kilka zasad, które pomogą utrzymać projekt w porządku:

Zanim zaczniesz kodować

Zawsze zacznij od przeczytania odpowiedniej części PRD (01_plan/PRD_PL.md). Zrozumiej wymagania biznesowe przed napisaniem pierwszej linii kodu. Oszczędzi ci to refactoru.

Złota zasada: Jeśli feature nie jest w PRD — zapytaj właściciela produktu, zanim go zaimplementujesz. Nie zakładaj.

Branches

konwencja nazewnictwa branchy
# Nowa funkcja
feature/onboarding-routing
feature/portfolio-upload

# Bugfix
fix/dark-mode-text-contrast
fix/profile-image-upload

# Refactor
refactor/auth-middleware

Jak testować UI

Wiele ekranów jest dostępnych jako statyczne HTML w 02_app_ver_2.0.0/community/. Otwórz je bezpośrednio w przeglądarce — są pełnoprawnymi prototypami:

Polecane pliki do podglądu
02_app_ver_2.0.0/community/
├── ai-assistant.html      # AI doradca pielęgnacji skóry
├── profile.html           # Profil użytkownika
├── jobs.html              # Lista ofert pracy
└── messages.html          # Wiadomości bezpośrednie

Commit messages

Używaj konwencji Conventional Commits:

# Format: type(scope): opis
feat(onboarding): add space routing logic
fix(profile): correct avatar upload validation
style(design-system): update bronze token to match brandbook
docs(readme): add setup instructions for Railway deployment

Kiedy pytać o pomoc

Jeśli utkniesz na więcej niż 30 minut — zapytaj. Projekt ma zaległy kontekst w 41_autocoder/ który może pomóc zrozumieć wcześniejsze decyzje. Sprawdź też CUSTOM_UPDATES.md w tym katalogu.


Częste błędy i antypateny #

Lista rzeczy, które zostały już zrobione źle i naprawione. Ucz się na naszych błędach.

❌ Hardkodowane kolory w CSS

Problem: color: #B6713E w komponentach łamie dark mode i utrudnia aktualizację brandbooku.

Rozwiązanie: Używaj wyłącznie klas Tailwind z customowej konfiguracji: text-skinso-bronze, bg-skinso-cream.

❌ Logika biznesowa w komponentach presentational

Problem: useState i fetch w komponentach, które powinny tylko renderować UI, tworzą chaos trudny do testowania.

Rozwiązanie: Przechowuj logikę w page-level componentach lub custom hookach. Komponenty w /components/ui/ powinny być czyste — tylko props IN, JSX OUT.

❌ Implementowanie P2 features przed MVP

Problem: Temptacja zaimplementowania czegoś "skoro już tu jestem" — np. panel analityczny albo grupy czatowe.

Rozwiązanie: Wszystko oznaczone P2 w PRD lub // future w kodzie jest poza zakresem. Zostaw to, dopóki właściciel produktu nie zmieni priorytetu.

❌ Mieszanie języków w UI

Problem: UI ma być po polsku. Nie ma wyjątków dla "bo angielski jest prostszy".

Rozwiązanie: Wszystkie texty w UI po polsku. Tylko kod, komentarze i nazwy zmiennych mogą być po angielsku.

❌ Brak weryfikacji wieku w ścieżkach Modelki/Biznesie

Problem: Wymaganie 18+ jest prawnym wymogiem dla tych ścieżek. Pominięcie go to poważny błąd compliance.

Rozwiązanie: Q06 w onboardingu musi zawierać checkbox 18+ i być walidowany przed ukończeniem rejestracji.

❌ Upload plików bez walidacji

Problem: Akceptowanie plików bez weryfikacji type/size prowadzi do ataków i przepełnienia storage.

Rozwiązanie: Portfolio: max 50 zdjęć, każde ≤ 10MB, tylko JPEG/PNG/WebP. Wideo: max 2 min, ≤ 100MB, tylko MP4/WebM.


Roadmap #

Co i kiedy planujemy zbudować. To żywy dokument — aktualizowany przy każdym sprincie.

FazaCelKluczowe funkcje
Faza 1 — MVP
Q1 2026
Pierwsze 1000 użytkowników Profile, Onboarding, Wyszukiwanie, Wiadomości, Portfolio, Oferty pracy
Faza 2 — Wzrost
Q2 2026
10 000 aktywnych użytkowników System płatności (Stripe), Booking, Opinie i recenzje, Powiadomienia push
Faza 3 — Premium
Q3 2026
Monetyzacja i ekspansja Subskrypcje premium, Panel analityczny, Grupy, Ekspansja UE
Cel długoterminowy: 10 000+ aktywnych użytkowników w ciągu 6 miesięcy od launchu. Polska jako rynek główny, z potencjałem ekspansji na UE.

Masz pytania? Sprawdź 01_plan/PRD_PL.md lub zapytaj właściciela projektu.
Ostatnia aktualizacja: 14 marca 2026 · v202603141018_v1