# ๐Ÿ’‹ sexy.pivoine.art
![sexy lips tongue mouth american apparel moist lip gloss ](https://i.gifer.com/1pYe.gif) _"Lust und Liebe gehรถren zusammen - wer das eine verteufelt, zerstรถrt auch das andere."_ โ€” **Beate Uhse**, Pionierin der sexuellen Befreiung โœˆ๏ธ --- ### ๐Ÿ† An Intimate Platform for Liberation & Pleasure ๐Ÿ† Built with passion, technology, and the fearless spirit of sexual empowerment [![Build Frontend](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdev.pivoine.art%2Fvalknar%2Fsexy.pivoine.art%2Factions%2Ftasks.json&query=%24.workflow_runs%5B0%5D.status&style=for-the-badge&logo=docker&logoColor=white&label=Frontend&color=FF69B4&labelColor=8B008B)](https://dev.pivoine.art/valknar/sexy.pivoine.art/actions) [![Build Backend](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdev.pivoine.art%2Fvalknar%2Fsexy.pivoine.art%2Factions%2Ftasks.json&query=%24.workflow_runs%5B0%5D.status&style=for-the-badge&logo=fastify&logoColor=white&label=Backend&color=DA70D6&labelColor=8B008B)](https://dev.pivoine.art/valknar/sexy.pivoine.art/actions) [![License](https://img.shields.io/badge/License-For_Pleasure-FF1493?style=for-the-badge&logo=heart&logoColor=white&labelColor=8B008B)](LICENSE) [![Made with Love](https://img.shields.io/badge/Made_with-๐Ÿ’œ_Love-FF69B4?style=for-the-badge&labelColor=8B008B)](https://sexy.pivoine.art)
--- ## ๐Ÿ‘… What Is This Delicious Creation? 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. 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 - โšก **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) - ๐ŸŽฎ **Hardware Integration** via Buttplug.io (yes, really!) - ๐Ÿ“ฑ **Responsive Design** that looks sexy on any device - ๐ŸŒ **Internationalization** โ€” pleasure speaks all languages - ๐Ÿ† **Gamification** โ€” achievements, leaderboards, and reward points - ๐Ÿ’ฌ **Comments & Social** โ€” build your community - ๐Ÿ“Š **Analytics Integration** (Umami) โ€” know your admirers - ๐Ÿณ **Self-hosted CI/CD** via Gitea Actions on `dev.pivoine.art`
### ๐Ÿ‘ Technology Stack ๐Ÿ‘
``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐Ÿ’‹ Frontend Layer โ”‚ โ”‚ โ”œโ”€ SvelteKit 2 โ†’ Smooth as silk โ”‚ โ”‚ โ”œโ”€ Tailwind CSS 4 โ†’ Styled to seduce โ”‚ โ”‚ โ”œโ”€ bits-ui Components โ†’ Building blocks of pleasure โ”‚ โ”‚ โ”œโ”€ graphql-request v7 โ†’ Whispering to the backend โ”‚ โ”‚ โ””โ”€ Vite โ†’ Fast and furious โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ๐Ÿท Backend Layer โ”‚ โ”‚ โ”œโ”€ 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 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ๐ŸŽ€ Hardware Layer โ”‚ โ”‚ โ”œโ”€ Buttplug.io โ†’ Real connections โ”‚ โ”‚ โ”œโ”€ TypeScript + Rust โ†’ Power and precision โ”‚ โ”‚ โ””โ”€ WebBluetooth API โ†’ Wireless intimacy โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ๐ŸŒธ DevOps Layer โ”‚ โ”‚ โ”œโ”€ Docker โ†’ Containerized ecstasy โ”‚ โ”‚ โ”œโ”€ Gitea Actions โ†’ Self-hosted seduction โ”‚ โ”‚ โ””โ”€ dev.pivoine.art โ†’ Our own pleasure palace โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿ”ฅ Quick Start โ€” Get Intimate Fast ### ๐Ÿ’• Option 1: Using Docker Compose (Recommended) ```bash # Clone the repository git clone https://dev.pivoine.art/valknar/sexy.pivoine.art.git cd sexy.pivoine.art # Configure your secrets cp .env.example .env # Edit .env with your intimate details # Awaken all services (postgres, redis, backend, frontend) docker compose up -d # Visit your creation at http://localhost:3000 ๐Ÿ’‹ ``` ### ๐Ÿ’œ Option 2: Local Development **Prerequisites:** 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_ **Start your pleasure journey:** ```bash # Awaken data services pnpm dev:data # Start the backend (port 4000) pnpm dev:backend # Start the frontend (port 3000, proxied to :4000) pnpm --filter @sexy.pivoine.art/frontend dev ``` Visit `http://localhost:3000` and let the experience begin... ๐Ÿ’‹ GraphQL playground is available at `http://localhost:4000/graphql` โ€” explore every query. --- ## ๐ŸŒน Project Structure This monorepo contains three packages, each serving its purpose: ``` sexy.pivoine.art/ โ”œโ”€ ๐Ÿ’„ packages/frontend/ โ†’ SvelteKit app (the seduction) โ”œโ”€ โšก packages/backend/ โ†’ Fastify + GraphQL API (the engine) โ””โ”€ ๐ŸŽฎ packages/buttplug/ โ†’ Hardware control (the connection) ``` ### ๐Ÿ’„ Frontend (`packages/frontend/`) 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=` โ€” no CDN, no Directus, just raw power. ### โšก Backend (`packages/backend/`) Purpose-built Fastify v5 + GraphQL Yoga server. All business logic lives here: auth, file uploads, video processing, comments, gamification, and analytics. Files stored as `//` with on-demand WebP transforms cached on disk. ### ๐ŸŽฎ Buttplug (`packages/buttplug/`) Hybrid TypeScript/Rust package for intimate hardware control via WebBluetooth. Compiled to WebAssembly for browser-based Bluetooth device communication. --- ## ๐Ÿ—ƒ๏ธ Database Schema Built with Drizzle ORM โ€” clean tables, no `directus_` prefix, full control: ``` 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 ``` --- ## ๐Ÿ” Authentication Flow ``` POST /graphql (login mutation) โ†’ verify argon2 password hash โ†’ nanoid(32) session token โ†’ SET session: EX 86400 in Redis โ†’ set httpOnly cookie: session_token โ†’ return CurrentUser Every request: โ†’ read session_token cookie โ†’ GET session: from Redis โ†’ inject currentUser into GraphQL context ``` --- ## ๐Ÿ–ผ๏ธ Image Transforms Assets are transformed on first request and cached as WebP: | 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 | --- ## ๐Ÿš€ Deployment ### Production with Docker Compose ```bash # Configure your secrets cp .env.example .env.production # Edit .env.production โ€” set DB credentials, SMTP, cookie secret, CORS origin # Deploy docker compose --env-file .env.production up -d ``` 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 ``` ### ๐ŸŽฌ CI/CD โ€” Self-Hosted Seduction Automated builds run on **[dev.pivoine.art](https://dev.pivoine.art/valknar/sexy.pivoine.art)** via Gitea Actions: - โœ… 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 Images are pulled on the production server via Watchtower or manual `docker compose pull && docker compose up -d`. --- ## ๐ŸŽญ Development Workflow ```mermaid graph LR A[๐Ÿ’ก Idea] --> B[๐Ÿ’ป Code] B --> C[๐Ÿงช Test Locally] C --> D[๐ŸŒฟ Feature Branch] D --> E[๐Ÿ“ค Push to dev.pivoine.art] E --> F{โœ… Build Pass?} F -->|Yes| G[๐Ÿ”€ Merge to Main] F -->|No| B G --> H[๐Ÿš€ Images Built & Pushed] H --> I[๐ŸŽ‰ Deploy to Production] ``` 1. Create โ†’ `git checkout -b feature/my-sexy-feature` 2. Develop โ†’ Write beautiful code 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 6. Release โ†’ `git tag v1.0.0 && git push origin v1.0.0` --- ## ๐ŸŒˆ Environment Variables ### Backend (required) | Variable | Description | | --------------- | ----------------------------- | | `DATABASE_URL` | PostgreSQL connection string | | `REDIS_URL` | Redis connection string | | `COOKIE_SECRET` | Session cookie signing secret | | `CORS_ORIGIN` | Allowed frontend origin | | `UPLOAD_DIR` | Path for uploaded files | ### Backend (optional) | 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) | ### Frontend | 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) | --- ## ๐Ÿ’Œ Credits & Acknowledgments
### ๐ŸŒธ Created with Love by ๐ŸŒธ **[Palina](https://sexy.pivoine.art) & [Valknar](https://sexy.pivoine.art)** _Fรผr die Mรคuse..._ ๐Ÿญ๐Ÿ’• --- ### ๐Ÿ™ Built With | 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 | --- ### ๐Ÿ’ Inspired by Beate Uhse Pioneer of sexual liberation (1919-2001) Pilot, Entrepreneur, Freedom Fighter _"Eine Frau, die ihre Sexualitรคt selbstbestimmt lebt, ist eine freie Frau."_ ![Beate Uhse Quote](https://img.shields.io/badge/Beate_Uhse-Sexual_Liberation_Pioneer-FF1493?style=for-the-badge&logo=heart&logoColor=white&labelColor=8B008B)
--- ## โš–๏ธ 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
[![Repository](https://img.shields.io/badge/๐Ÿ™_Repository-dev.pivoine.art-FF69B4?style=for-the-badge&labelColor=8B008B)](https://dev.pivoine.art/valknar/sexy.pivoine.art) [![Issues](https://img.shields.io/badge/๐Ÿ›_Issues-Report_Here-DA70D6?style=for-the-badge&labelColor=8B008B)](https://dev.pivoine.art/valknar/sexy.pivoine.art/issues) [![Website](https://img.shields.io/badge/๐ŸŒ_Website-Visit_Here-FF1493?style=for-the-badge&labelColor=8B008B)](https://sexy.pivoine.art)
---
### ๐Ÿ‘ Made with ๐Ÿ’œ for Freedom, Pleasure & Technology ๐Ÿ‘
 โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—
โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•
โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—   โ•šโ–ˆโ–ˆโ–ˆโ•”โ•  โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•
 โ•šโ•โ•โ•โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•โ•โ•   โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•—   โ•šโ–ˆโ–ˆโ•”โ•
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•‘
โ•šโ•โ•โ•โ•โ•โ•  โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•  โ•šโ•โ•   โ•šโ•โ•
_Pleasure is a human right. Technology is freedom. Together, they are power._ **[sexy.pivoine.art](https://sexy.pivoine.art)** | ยฉ 2025 Palina & Valknar