Files
sozial/SPEC.md

16 KiB
Raw Blame History

Sozial - Social Media & Casual Dating Platform

1. Concept & Vision

Sozial ist eine moderne Social-Media-Plattform für Casual Dating und Community-Meetups. Die Plattform kombiniert die soziale Interaktion klassischer sozialer Netzwerke mit einer lockeren, einladenden Atmosphäre für ungezwungene Begegnungen. Das Ziel: Menschen zusammenbringen, die sich persönlich treffen wollen ob für ein Café, einen Spaziergang oder einfach ein Gespräch.

Das Erlebnis soll sich anfühlen wie ein guter Abend in einer Bar unkompliziert, offen und natürlich.

2. Design Language

Aesthetic Direction

Inspiriert von modernen Dating-Apps (Tinder, Bumble) kombiniert mit der Funktionalität von Social Networks (Facebook, Instagram). Warme, einladende Farben mit sanften Gradienten und abgerundeten Formen.

Color Palette

Primary:        #6366F1 (Indigo - Vertrauen & Modernität)
Secondary:      #EC4899 (Pink - Romantik & Energie)
Accent:         #F59E0B (Amber - Wärme & Einladung)
Background:     #FAFAFA (Hellgrau)
Surface:        #FFFFFF (Weiß)
Text Primary:  #1F2937 (Dunkelgrau)
Text Secondary: #6B7280 (Mittelgrau)
Success:       #10B981 (Grün)
Error:         #EF4444 (Rot)
Online:        #22C55E (Grün - für Online-Status)

Typography

  • Headlines: Inter, 700 weight
  • Body: Inter, 400/500 weight
  • Monospace: JetBrains Mono (für Code/Tags)
  • Font sizes: 12px, 14px, 16px, 20px, 24px, 32px, 48px

Spatial System

  • Base unit: 4px
  • Spacing scale: 4, 8, 12, 16, 24, 32, 48, 64, 96
  • Border radius: 8px (small), 12px (medium), 16px (large), 9999px (pill)
  • Card shadows: 0 2px 8px rgba(0,0,0,0.08)

Motion Philosophy

  • Micro-interactions: 150ms ease-out
  • Page transitions: 300ms ease-in-out
  • Loading states: Skeleton screens mit shimmer
  • Haptic feedback bei Interaktionen (wo unterstützt)

3. Layout & Structure

Page Architecture

┌─────────────────────────────────────────────────────┐
│  Header (Sticky)                                     │
│  [Logo] [Search] [Nav: Feed|Explore|Messages] [⚙️] │
├─────────────────────────────────────────────────────┤
│  ┌──────────┐  ┌────────────────────┐  ┌──────────┐│
│  │ Sidebar │  │ Main Content        │  │ Right    ││
│  │          │  │                    │  │ Sidebar  ││
│  │ Profile  │  │ (Feed/Profile/     │  │          ││
│  │ Quick    │  │  Messages/         │  │ Friend   ││
│  │ Actions  │  │  Settings)         │  │ Requests ││
│  │          │  │                    │  │ Trends   ││
│  └──────────┘  └────────────────────┘  └──────────┘│
└─────────────────────────────────────────────────────┘

Responsive Strategy

  • Desktop (1200px+): 3-column layout
  • Tablet (768px-1199px): 2-column, collapsible sidebar
  • Mobile (<768px): Single column, bottom navigation

Subdomain Structure

www.sozial.shadow-land.de   → Frontend (Public pages, landing)
api.sozial.shadow-land.de   → REST API
chat.sozial.shadow-land.de  → WebSocket Chat Server

4. Features & Interactions

4.1 User Authentication

Registration:

  • Email + Password
  • OAuth (Google, Apple) - optional
  • Email verification required
  • Onboarding flow: Profile photo, bio, interests

Login:

  • Email + Password
  • "Remember me" functionality
  • Password reset via email

Session:

  • JWT tokens (access + refresh)
  • 24h access token, 30d refresh token
  • Automatic refresh

4.2 User Profiles

Profile Data:

{
  "id": "uuid",
  "username": "string (unique)",
  "display_name": "string",
  "bio": "string (max 500 chars)",
  "avatar_url": "string",
  "photos": ["url1", "url2", "url3", "url4", "url5", "url6"],
  "gender": "string",
  "interested_in": ["men", "women", "all"],
  "age": "number",
  "location": {
    "city": "string",
    "lat": "number",
    "lng": "number"
  },
  "interests": ["tag1", "tag2", "..."],
  "is_online": "boolean",
  "last_seen": "timestamp",
  "created_at": "timestamp",
  "settings": {
    "show_online_status": "boolean",
    "show_distance": "boolean",
    "show_age": "boolean",
    "receive_messages_from": "everyone|friends|all"
  }
}

Profile States:

  • Default view (limited info for non-friends)
  • Full profile (for friends)
  • Own profile (with edit functionality)
  • Preview mode (how others see you)

4.3 Social Feed

Post Types:

  • Text post (max 2000 chars)
  • Image post (1-4 images)
  • Location check-in

Post Structure:

{
  "id": "uuid",
  "author_id": "uuid",
  "type": "text|image|checkin",
  "content": "string",
  "media_urls": ["url1", "..."],
  "location": { "name": "string", "lat": "num", "lng": "num" },
  "likes_count": "number",
  "comments_count": "number",
  "shares_count": "number",
  "liked_by_me": "boolean",
  "created_at": "timestamp"
}

Interactions:

  • Like (toggle heart icon, +1 animation)
  • Comment (expandable section)
  • Share (copy link)
  • Save (bookmark for later)
  • Report (modal with reason selection)

Feed Algorithm:

  • Chronological by default
  • "For You" tab with algorithmic ranking
  • Filter by: All | Friends | Nearby | Interests

4.4 Friend & Follow System

Connection Types:

  • Friends: Mutual follow, can see full profile + message
  • Following: One-way follow, limited profile access
  • Followers: People following you

Actions:

  • Follow / Unfollow
  • Add Friend / Remove Friend
  • Block / Report

Friend Requests:

  • Pending requests badge
  • Accept / Decline
  • "Suggest Friends" based on mutual connections

4.5 Direct Messaging

Features:

  • 1:1 private messages
  • Text + emoji support
  • Read receipts (optional setting)
  • Typing indicators
  • Online/Offline status
  • Message search

Message Structure:

{
  "id": "uuid",
  "conversation_id": "uuid",
  "sender_id": "uuid",
  "content": "string",
  "type": "text|image",
  "media_url": "string|null",
  "read_at": "timestamp|null",
  "created_at": "timestamp"
}

Conversation:

{
  "id": "uuid",
  "type": "direct|group",
  "name": "string (for groups)",
  "participants": ["user_id1", "user_id2"],
  "last_message": { "...message object" },
  "updated_at": "timestamp"
}

Search:

  • User search by username/name
  • Filter by: location, age, interests, online status
  • Recent searches
  • Suggested users

Explore Tab:

  • Featured profiles
  • Nearby users (distance-based)
  • Users with similar interests
  • "Recently active" section

Discovery Cards:

  • Swipe-style cards (optional toggle)
  • Like / Pass / Super Like
  • Match notification when mutual like

4.7 Real-time Notifications

Notification Types:

  • New friend request
  • Friend request accepted
  • New follower
  • Post liked
  • Post commented
  • Message received
  • Profile viewed (optional, premium)

Delivery:

  • Real-time via WebSocket
  • Fallback polling every 30s
  • Push notifications (PWA + Mobile)

4.8 Privacy & Safety

Privacy Controls:

  • Profile visibility: Public | Friends Only | Private
  • Online status visibility
  • Read receipts toggle
  • Block list management
  • Two-factor authentication (optional)

Safety Features:

  • Report user/post
  • Block user (hides from both sides)
  • Content moderation (reported content reviewed)
  • Age verification (18+)
  • Anti-catfishing: Photo verification (future)

5. Component Inventory

5.1 Navigation

  • TopNav: Logo, search input, nav links, user menu
    • States: default, search-focused, user-menu-open
  • BottomNav (mobile): Home, Search, Create (+), Messages, Profile
    • States: default, active tab highlighted

5.2 Cards

  • UserCard: Avatar, name, bio preview, age, distance, interests, action buttons
    • States: default, hover (shadow increase), loading (skeleton)
  • PostCard: Author header, content, media, action bar, comments preview
    • States: default, expanded (showing comments), loading
  • MatchCard: Two user avatars, "It's a Match!" banner, action buttons
    • States: default, new-match (with animation)

5.3 Forms

  • Input: Label, input field, helper text, error message
    • States: default, focused, filled, error, disabled
  • TextArea: Multi-line input with character count
    • States: same as Input
  • Select/Dropdown: Custom styled select
    • States: default, open, selected, disabled
  • Button: Primary, Secondary, Ghost, Danger variants
    • States: default, hover, active, loading, disabled
  • Checkbox/Radio: Custom styled with labels
    • States: unchecked, checked, disabled

5.4 Feedback

  • Toast: Success, Error, Warning, Info variants
    • Auto-dismiss after 4s, manual dismiss available
  • Modal: Centered overlay with header, content, actions
    • States: entering (fade+scale), visible, exiting
  • Skeleton: Placeholder shimmer for loading states
  • Spinner: Circular loading indicator
  • EmptyState: Illustration + text + action button

5.5 Media

  • Avatar: Circular image with fallback initials
    • Sizes: sm (32px), md (48px), lg (64px), xl (128px)
    • States: image, loading, error (shows initials)
  • ImageGrid: 1-4 images in responsive grid
    • Lightbox on click
  • VideoPlayer: Custom controls, autoplay mute on scroll

5.6 Chat

  • MessageBubble: Text content, timestamp, read receipt
    • Variants: sent (right, primary color), received (left, gray)
  • ChatListItem: Avatar, name, last message preview, timestamp, unread badge
    • States: default, unread (bold), selected
  • TypingIndicator: Three bouncing dots animation

6. Technical Approach

6.1 Tech Stack

Frontend:

  • React 18 + TypeScript
  • Vite (build tool)
  • Tailwind CSS (styling)
  • React Router v6 (routing)
  • TanStack Query (server state)
  • Zustand (client state)
  • Socket.io-client (real-time)

Backend:

  • PHP 8.2+ (Laravel-like structure)
  • SQLite database (per-user isolation via separate DBs)
  • JWT Authentication (firebase/php-jwt)
  • RESTful API
  • Socket.io for WebSocket (PHP with Swoole/Ratchet)

Infrastructure:

  • Caddy webserver
  • PHP-FPM
  • WebSocket server on separate port
  • S3-compatible storage for media (MinIO or local)

6.2 API Design

Base URL: https://api.sozial.shadow-land.de/v1

Authentication:

POST   /auth/register
POST   /auth/login
POST   /auth/refresh
POST   /auth/logout

Users:

GET    /users/:id
PATCH  /users/:id
DELETE /users/:id
GET    /users/search?q=query&filters=...
GET    /users/:id/posts
GET    /users/:id/friends
GET    /users/:id/followers
GET    /users/:id/following

Posts:

GET    /posts
POST   /posts
GET    /posts/:id
PATCH  /posts/:id
DELETE /posts/:id
POST   /posts/:id/like
DELETE /posts/:id/like
GET    /posts/:id/comments
POST   /posts/:id/comments

Relationships:

POST   /relationships/follow/:userId
DELETE /relationships/follow/:userId
POST   /relationships/friend-request/:userId
POST   /relationships/accept-friend/:userId
DELETE /relationships/reject-friend/:userId
GET    /relationships/friends
GET    /relationships/requests

Messages:

GET    /conversations
GET    /conversations/:id/messages
POST   /conversations/:id/messages
PATCH  /messages/:id/read

Media:

POST   /media/upload
DELETE /media/:id

6.3 Data Model

Users Table:

CREATE TABLE users (
  id TEXT PRIMARY KEY,
  email TEXT UNIQUE NOT NULL,
  password_hash TEXT NOT NULL,
  username TEXT UNIQUE NOT NULL,
  display_name TEXT,
  bio TEXT,
  avatar_url TEXT,
  photos TEXT, -- JSON array
  gender TEXT,
  interested_in TEXT, -- JSON array
  age INTEGER,
  location TEXT, -- JSON object
  interests TEXT, -- JSON array
  is_online INTEGER DEFAULT 0,
  last_seen INTEGER,
  settings TEXT, -- JSON object
  created_at INTEGER,
  updated_at INTEGER
);

Posts Table:

CREATE TABLE posts (
  id TEXT PRIMARY KEY,
  user_id TEXT NOT NULL,
  type TEXT NOT NULL, -- text|image|checkin
  content TEXT,
  media_urls TEXT, -- JSON array
  location TEXT, -- JSON object
  created_at INTEGER,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

Relationships Table:

CREATE TABLE relationships (
  id TEXT PRIMARY KEY,
  follower_id TEXT NOT NULL,
  following_id TEXT NOT NULL,
  type TEXT NOT NULL, -- follow|friend
  status TEXT DEFAULT 'active', -- active|blocked
  created_at INTEGER,
  FOREIGN KEY (follower_id) REFERENCES users(id),
  FOREIGN KEY (following_id) REFERENCES users(id)
);

Messages Table:

CREATE TABLE messages (
  id TEXT PRIMARY KEY,
  conversation_id TEXT NOT NULL,
  sender_id TEXT NOT NULL,
  content TEXT NOT NULL,
  type TEXT DEFAULT 'text',
  media_url TEXT,
  read_at INTEGER,
  created_at INTEGER,
  FOREIGN KEY (conversation_id) REFERENCES conversations(id),
  FOREIGN KEY (sender_id) REFERENCES users(id)
);

6.4 WebSocket Events

Client → Server:

  • join_conversation { conversationId }
  • leave_conversation { conversationId }
  • send_message { conversationId, content, type }
  • typing_start { conversationId }
  • typing_stop { conversationId }

Server → Client:

  • new_message { message }
  • user_typing { conversationId, userId }
  • user_online { userId }
  • user_offline { userId }
  • notification { type, data }

6.5 Security Considerations

  • All passwords hashed with bcrypt (cost factor 12)
  • JWT signed with HS256, secret from environment
  • CSRF protection via tokens
  • Rate limiting on auth endpoints (5/min)
  • Input sanitization and validation
  • SQL injection prevention via prepared statements
  • XSS prevention via output encoding
  • File upload validation (type, size, malware scan)
  • Secure headers (CSP, HSTS, X-Frame-Options)

7. Development Phases

Phase 1: Foundation

  • Project setup (repository, environments)
  • Authentication system
  • Basic user profiles
  • Database schema

Phase 2: Social Core

  • Post creation & feed
  • Like & comment system
  • Friend/Follow system
  • User search & discovery

Phase 3: Messaging

  • Conversation system
  • Direct messaging
  • Real-time updates (WebSocket)
  • Typing indicators

Phase 4: Polish

  • Notifications
  • Privacy settings
  • Profile customization
  • Media uploads

Phase 5: Discovery (Future)

  • Match algorithm
  • Location-based discovery
  • Advanced filtering
  • Premium features

8. File Structure

sozial/
├── www/
│   └── public/
│       └── index.php          # Frontend entry
├── api/
│   └── public/
│       └── index.php          # API entry
├── chat/
│   └── public/
│       └── index.php          # WebSocket entry
├── src/
│   ├── core/                  # Framework core
│   ├── modules/              # Feature modules
│   │   ├── auth/
│   │   ├── user/
│   │   ├── post/
│   │   ├── message/
│   │   └── relationship/
│   ├── services/             # Business logic
│   ├── utils/                # Helpers
│   └── config/               # Configuration
├── database/
│   └── schema.sql            # Database schema
├── tests/
│   └── unit/
├── SPEC.md
├── README.md
└── .env.example