2025-10-26 09:35:35 +01:00
# 💋 sexy.pivoine.art
2025-10-25 22:04:41 +02:00
2025-10-26 09:35:35 +01:00
<div align="center">
2025-10-25 22:04:41 +02:00
2025-10-26 09:57:45 +01:00

2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
_"Lust und Liebe gehören zusammen - wer das eine verteufelt, zerstört auch das andere."_
2025-10-26 09:35:35 +01:00
— **Beate Uhse ** , Pionierin der sexuellen Befreiung ✈️
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
---
### 🍆 An Intimate Platform for Liberation & Pleasure 🍆
Built with passion, technology, and the fearless spirit of sexual empowerment
2026-03-05 12:57:47 +01:00
[](https://dev.pivoine.art/valknar/sexy/actions)
[](https://dev.pivoine.art/valknar/sexy/actions)
2025-10-26 09:35:35 +01:00
[](LICENSE)
2026-03-04 22:01:46 +01:00
[](https://sexy.pivoine.art)
2025-10-26 09:35:35 +01:00
</div>
---
## 👅 What Is This Delicious Creation?
2026-03-04 22:01:46 +01:00
Welcome, dear pleasure-seeker! This is **sexy.pivoine.art ** — a modern, sensual platform built from the ground up with full control over every intimate detail. A **SvelteKit ** frontend caresses a purpose-built **Fastify + GraphQL ** backend, while **Buttplug.io ** hardware integration brings the experience into the physical world.
2025-10-26 09:35:35 +01:00
Like Beate Uhse breaking barriers in post-war Germany, we believe in the freedom to explore, create, and celebrate sexuality without shame. This platform is built for **models ** , **creators ** , and **connoisseurs ** of adult content who deserve technology as sophisticated as their desires.
### ♉ Features That'll Make You Blush ♊
- 💖 **Sensual SvelteKit Frontend ** with Tailwind CSS 4 styling
2026-03-04 22:01:46 +01:00
- ⚡ **Purpose-built GraphQL Backend ** — lean, fast, no CMS overhead
- 🔐 **Session-based Auth ** with Redis & Argon2 — discretion guaranteed
- 🖼️ **Smart Image Transforms ** via Sharp (WebP, multiple presets, cached)
2025-10-26 09:35:35 +01:00
- 🎮 **Hardware Integration ** via Buttplug.io (yes, really!)
- 📱 **Responsive Design ** that looks sexy on any device
- 🌍 **Internationalization ** — pleasure speaks all languages
2026-03-04 22:01:46 +01:00
- 🏆 **Gamification ** — achievements, leaderboards, and reward points
- 💬 **Comments & Social ** — build your community
2025-10-26 09:35:35 +01:00
- 📊 **Analytics Integration ** (Umami) — know your admirers
2026-03-04 22:01:46 +01:00
- 🐳 **Self-hosted CI/CD ** via Gitea Actions on `dev.pivoine.art`
2025-10-26 09:35:35 +01:00
<div align="center">
### 🍑 Technology Stack 🍑
</div>
```
┌─────────────────────────────────────────────────────────────┐
│ 💋 Frontend Layer │
2026-03-04 22:01:46 +01:00
│ ├─ SvelteKit 2 → Smooth as silk │
2025-10-26 09:57:45 +01:00
│ ├─ Tailwind CSS 4 → Styled to seduce │
│ ├─ bits-ui Components → Building blocks of pleasure │
2026-03-04 22:01:46 +01:00
│ ├─ graphql-request v7 → Whispering to the backend │
2025-10-26 09:57:45 +01:00
│ └─ Vite → Fast and furious │
2025-10-26 09:35:35 +01:00
├─────────────────────────────────────────────────────────────┤
│ 🍷 Backend Layer │
2026-03-04 22:01:46 +01:00
│ ├─ Fastify v5 → The fastest penetration │
│ ├─ GraphQL Yoga v5 → Flexible positions │
│ ├─ Pothos (code-first) → Schema with intention │
│ ├─ Drizzle ORM → Data with grace │
│ ├─ PostgreSQL 16 → Deep and persistent │
│ ├─ Redis → Sessions that never forget │
│ ├─ Sharp → Images transformed beautifully │
│ └─ Argon2 → Passwords hashed with passion │
2025-10-26 09:35:35 +01:00
├─────────────────────────────────────────────────────────────┤
│ 🎀 Hardware Layer │
2025-10-26 09:57:45 +01:00
│ ├─ Buttplug.io → Real connections │
│ ├─ TypeScript + Rust → Power and precision │
│ └─ WebBluetooth API → Wireless intimacy │
2025-10-26 09:35:35 +01:00
├─────────────────────────────────────────────────────────────┤
│ 🌸 DevOps Layer │
2025-10-26 09:57:45 +01:00
│ ├─ Docker → Containerized ecstasy │
2026-03-04 22:01:46 +01:00
│ ├─ Gitea Actions → Self-hosted seduction │
│ └─ dev.pivoine.art → Our own pleasure palace │
2025-10-26 09:35:35 +01:00
└─────────────────────────────────────────────────────────────┘
```
---
## 🔥 Quick Start — Get Intimate Fast
2026-03-04 22:01:46 +01:00
### 💕 Option 1: Using Docker Compose (Recommended)
2025-10-25 22:29:06 +02:00
```bash
2026-03-04 22:01:46 +01:00
# Clone the repository
2026-03-05 12:57:47 +01:00
git clone https://dev.pivoine.art/valknar/sexy.git
2026-03-04 22:01:46 +01:00
cd sexy.pivoine.art
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
# Configure your secrets
cp .env.example .env
# Edit .env with your intimate details
# Awaken all services (postgres, redis, backend, frontend)
docker compose up -d
2025-10-26 09:35:35 +01:00
# Visit your creation at http://localhost:3000 💋
2025-10-25 22:29:06 +02:00
```
2025-10-26 09:35:35 +01:00
### 💜 Option 2: Local Development
2025-10-25 22:29:06 +02:00
**Prerequisites:**
2026-03-04 22:27:54 +01:00
1. Node.js 20.19.1 — _ the foundation _
2. `corepack enable` — _ unlock the tools _
3. `pnpm install` — _ gather your ingredients _
4. PostgreSQL 16 + Redis — _ the data lovers _
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
**Start your pleasure journey:**
2025-10-25 22:29:06 +02:00
```bash
2026-03-04 22:01:46 +01:00
# Awaken data services
pnpm dev:data
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
# Start the backend (port 4000)
pnpm dev:backend
# Start the frontend (port 3000, proxied to :4000)
pnpm --filter @sexy .pivoine.art/frontend dev
2025-10-25 22:29:06 +02:00
```
2025-10-26 09:35:35 +01:00
Visit `http://localhost:3000` and let the experience begin... 💋
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
GraphQL playground is available at `http://localhost:4000/graphql` — explore every query.
2025-10-26 09:35:35 +01:00
---
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
## 🌹 Project Structure
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
This monorepo contains three packages, each serving its purpose:
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
```
sexy.pivoine.art/
├─ 💄 packages/frontend/ → SvelteKit app (the seduction)
2026-03-04 22:01:46 +01:00
├─ ⚡ packages/backend/ → Fastify + GraphQL API (the engine)
2025-10-26 09:35:35 +01:00
└─ 🎮 packages/buttplug/ → Hardware control (the connection)
```
2026-03-04 22:01:46 +01:00
### 💄 Frontend (`packages/frontend/`)
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
SvelteKit 2 application with server-side rendering, i18n, and a clean component library.
Communicates with the backend exclusively via GraphQL using `graphql-request` .
Assets served via `/api/assets/:id?transform=<preset>` — no CDN, no Directus, just raw power.
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
### ⚡ Backend (`packages/backend/`)
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
Purpose-built Fastify v5 + GraphQL Yoga server. All business logic lives here:
auth, file uploads, video processing, comments, gamification, and analytics.
Files stored as `<UPLOAD_DIR>/<uuid>/<filename>` with on-demand WebP transforms cached on disk.
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
### 🎮 Buttplug (`packages/buttplug/`)
Hybrid TypeScript/Rust package for intimate hardware control via WebBluetooth.
Compiled to WebAssembly for browser-based Bluetooth device communication.
2025-10-26 09:35:35 +01:00
---
2026-03-04 22:01:46 +01:00
## 🗃️ Database Schema
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
Built with Drizzle ORM — clean tables, no `directus_` prefix, full control:
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
```
users → profiles, roles (model/viewer/admin), auth tokens
files → uploaded assets with metadata and duration
videos → content with model junctions, likes, plays
articles → magazine / editorial content
recordings → user-created content with play tracking
comments → threaded by collection + item_id
achievements → gamification goals
user_points → points ledger
user_stats → cached leaderboard data
```
---
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
## 🔐 Authentication Flow
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
```
POST /graphql (login mutation)
→ verify argon2 password hash
→ nanoid(32) session token
→ SET session:<token> <user JSON> EX 86400 in Redis
→ set httpOnly cookie: session_token
→ return CurrentUser
Every request:
→ read session_token cookie
→ GET session:<token> from Redis
→ inject currentUser into GraphQL context
2025-10-25 22:29:06 +02:00
```
2026-03-04 22:01:46 +01:00
---
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
## 🖼️ Image Transforms
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
Assets are transformed on first request and cached as WebP:
2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
| Preset | Size | Fit | Use |
| ----------- | ----------- | ------ | ---------------- |
| `mini` | 80× 80 | cover | Avatars in lists |
| `thumbnail` | 300× 300 | cover | Profile photos |
| `preview` | 800px wide | inside | Video teasers |
| `medium` | 1400px wide | inside | Full-size images |
| `banner` | 1600× 480 | cover | Profile banners |
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
---
2026-03-04 22:01:46 +01:00
## 🚀 Deployment
2025-10-25 22:29:06 +02:00
2025-10-26 14:48:30 +01:00
### Production with Docker Compose
2025-10-25 22:29:06 +02:00
```bash
2025-10-26 09:35:35 +01:00
# Configure your secrets
2026-03-04 22:01:46 +01:00
cp .env.example .env.production
# Edit .env.production — set DB credentials, SMTP, cookie secret, CORS origin
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
# Deploy
docker compose --env-file .env.production up -d
2025-10-25 22:29:06 +02:00
```
2026-03-04 22:01:46 +01:00
Key environment variables for the backend:
```env
DATABASE_URL=postgresql://sexy:sexy@postgres:5432/sexy
REDIS_URL=redis://redis:6379
COOKIE_SECRET=your-very-secret-key
CORS_ORIGIN=https://sexy.pivoine.art
UPLOAD_DIR=/data/uploads
SMTP_HOST=your.smtp.host
SMTP_PORT=587
EMAIL_FROM=noreply@sexy .pivoine.art
PUBLIC_URL=https://sexy.pivoine.art
2025-10-25 22:29:06 +02:00
```
2026-03-04 22:01:46 +01:00
### 🎬 CI/CD — Self-Hosted Seduction
2025-10-26 09:35:35 +01:00
2026-03-05 12:57:47 +01:00
Automated builds run on * * [dev.pivoine.art ](https://dev.pivoine.art/valknar/sexy )** via Gitea Actions:
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
- ✅ Frontend image → `dev.pivoine.art/valknar/sexy:latest`
- ✅ Backend image → `dev.pivoine.art/valknar/sexy-backend:latest`
- ✅ Triggers on push to `main` , `develop` , or version tags (`v*.*.*` )
- ✅ Build cache via registry for fast successive builds
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
Images are pulled on the production server via Watchtower or manual `docker compose pull && docker compose up -d` .
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
---
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
## 🎭 Development Workflow
```mermaid
graph LR
A[💡 Idea] --> B[💻 Code]
B --> C[🧪 Test Locally]
C --> D[🌿 Feature Branch]
2026-03-04 22:01:46 +01:00
D --> E[📤 Push to dev.pivoine.art]
E --> F{✅ Build Pass?}
2025-10-26 09:35:35 +01:00
F -->|Yes| G[🔀 Merge to Main]
F -->|No| B
2026-03-04 22:01:46 +01:00
G --> H[🚀 Images Built & Pushed]
H --> I[🎉 Deploy to Production]
2025-10-26 09:35:35 +01:00
```
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
1. Create → `git checkout -b feature/my-sexy-feature`
2. Develop → Write beautiful code
2026-03-04 22:01:46 +01:00
3. Test → `pnpm dev:data && pnpm dev:backend && pnpm dev`
4. Push → `git push` to `dev.pivoine.art` (triggers CI build)
5. Merge → Images published, deploy to production
2025-10-26 09:35:35 +01:00
6. Release → `git tag v1.0.0 && git push origin v1.0.0`
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
---
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
## 🌈 Environment Variables
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
### Backend (required)
2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
| Variable | Description |
| --------------- | ----------------------------- |
| `DATABASE_URL` | PostgreSQL connection string |
| `REDIS_URL` | Redis connection string |
2026-03-04 22:01:46 +01:00
| `COOKIE_SECRET` | Session cookie signing secret |
2026-03-04 22:27:54 +01:00
| `CORS_ORIGIN` | Allowed frontend origin |
| `UPLOAD_DIR` | Path for uploaded files |
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
### Backend (optional)
2025-10-26 09:35:35 +01:00
2026-03-04 22:27:54 +01:00
| Variable | Default | Description |
| ------------ | ------- | ------------------------------ |
| `PORT` | `4000` | Backend listen port |
| `LOG_LEVEL` | `info` | Fastify log level |
| `SMTP_HOST` | — | Email server for auth flows |
| `SMTP_PORT` | `587` | Email server port |
| `EMAIL_FROM` | — | Sender address |
| `PUBLIC_URL` | — | Frontend URL (for email links) |
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
### Frontend
2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
| Variable | Description |
| --------------------- | --------------------------------------------- |
| `PUBLIC_API_URL` | Backend URL (e.g. `http://sexy_backend:4000` ) |
| `PUBLIC_URL` | Frontend public URL |
| `PUBLIC_UMAMI_ID` | Umami analytics site ID (optional) |
| `PUBLIC_UMAMI_SCRIPT` | Umami script URL (optional) |
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
---
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
## 💌 Credits & Acknowledgments
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
<div align="center">
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
### 🌸 Created with Love by 🌸
2025-10-25 22:29:06 +02:00
2026-03-04 22:01:46 +01:00
**[Palina ](https://sexy.pivoine.art ) & [Valknar ](https://sexy.pivoine.art )**
2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
_Für die Mäuse..._ 🐭💕
2025-10-26 09:35:35 +01:00
---
### 🙏 Built With
2026-03-04 22:27:54 +01:00
| Technology | Purpose |
| --------------------------------------------------------- | -------------------- |
| [SvelteKit ](https://kit.svelte.dev/ ) | Frontend framework |
| [Fastify ](https://fastify.dev/ ) | HTTP server |
| [GraphQL Yoga ](https://the-guild.dev/graphql/yoga-server ) | GraphQL server |
| [Pothos ](https://pothos-graphql.dev/ ) | Code-first schema |
| [Drizzle ORM ](https://orm.drizzle.team/ ) | Database |
| [Sharp ](https://sharp.pixelplumbing.com/ ) | Image transforms |
| [Buttplug.io ](https://buttplug.io/ ) | Hardware |
| [bits-ui ](https://www.bits-ui.com/ ) | UI components |
| [Gitea ](https://dev.pivoine.art ) | Self-hosted VCS & CI |
2025-10-26 09:35:35 +01:00
---
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
### 💐 Inspired by Beate Uhse
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00
Pioneer of sexual liberation (1919-2001)
Pilot, Entrepreneur, Freedom Fighter
2025-10-25 22:29:06 +02:00
2026-03-04 22:27:54 +01:00
_"Eine Frau, die ihre Sexualität selbstbestimmt lebt, ist eine freie Frau."_
2025-10-25 22:29:06 +02:00
2025-10-26 09:35:35 +01:00

</div>
---
## ⚖️ License & Legal
- 📜 See [LICENSE ](LICENSE ) file for details
- 🔞 **18+ Only ** — This platform is for adults
- 🌍 Users must be of legal age in their jurisdiction
- ⚖️ We support equality, freedom, and consensual pleasure
---
## 💬 Support & Community
<div align="center">
2026-03-05 12:57:47 +01:00
[](https://dev.pivoine.art/valknar/sexy)
[](https://dev.pivoine.art/valknar/sexy/issues)
2026-03-04 22:01:46 +01:00
[](https://sexy.pivoine.art)
2025-10-26 09:35:35 +01:00
</div>
2025-10-25 22:29:06 +02:00
---
2025-10-26 09:35:35 +01:00
<div align="center">
### 🍑 Made with 💜 for Freedom, Pleasure & Technology 🍑
2025-10-26 09:57:45 +01:00
<pre>
2025-10-26 09:35:35 +01:00
██████╗ ███████╗██╗ ██╗██╗ ██╗
██╔════╝ ██╔════╝╚██╗██╔╝╚██╗ ██╔╝
╚█████╗ █████╗ ╚███╔╝ ╚████╔╝
╚═══██╗ ██╔══╝ ██╔██╗ ╚██╔╝
██████╔╝ ███████╗██╔╝╚██╗ ██║
╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝
2025-10-26 09:57:45 +01:00
</pre>
2025-10-26 09:35:35 +01:00
2026-03-04 22:27:54 +01:00
_Pleasure is a human right. Technology is freedom. Together, they are power._
2025-10-26 09:35:35 +01:00
2026-03-04 22:01:46 +01:00
**[sexy.pivoine.art ](https://sexy.pivoine.art )** | © 2025 Palina & Valknar
2025-10-26 09:35:35 +01:00
</div>