578 lines
16 KiB
Markdown
578 lines
16 KiB
Markdown
# 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:**
|
||
```json
|
||
{
|
||
"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:**
|
||
```json
|
||
{
|
||
"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:**
|
||
```json
|
||
{
|
||
"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:**
|
||
```json
|
||
{
|
||
"id": "uuid",
|
||
"type": "direct|group",
|
||
"name": "string (for groups)",
|
||
"participants": ["user_id1", "user_id2"],
|
||
"last_message": { "...message object" },
|
||
"updated_at": "timestamp"
|
||
}
|
||
```
|
||
|
||
### 4.6 Discovery & Search
|
||
|
||
**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:**
|
||
```sql
|
||
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:**
|
||
```sql
|
||
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:**
|
||
```sql
|
||
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:**
|
||
```sql
|
||
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
|
||
```
|