Implemented complete infrastructure for recording, saving, and managing buttplug device patterns with precise event timing. **Phase 1: Backend & Infrastructure** - Added Directus schema for sexy_recordings collection with all fields (id, status, user_created, title, description, slug, duration, events, device_info, tags, linked_video, featured, public) - Created REST API endpoints in bundle extension: * GET /sexy/recordings - list user recordings with filtering * GET /sexy/recordings/:id - get single recording * POST /sexy/recordings - create new recording with validation * PATCH /sexy/recordings/:id - update recording (owner only) * DELETE /sexy/recordings/:id - soft delete by archiving - Added TypeScript types: RecordedEvent, DeviceInfo, Recording - Created frontend services: getRecordings(), deleteRecording() - Built RecordingCard component with stats, device info, and actions - Added Recordings tab to /me dashboard page with grid layout - Added i18n translations for recordings UI **Phase 2: Recording Capture** - Implemented recording state management in /play page - Added Start/Stop Recording buttons with visual indicators - Capture device events with precise timestamps during recording - Normalize actuator values (0-100) for cross-device compatibility - Created RecordingSaveDialog component with: * Recording stats display (duration, events, devices) * Form inputs (title, description, tags) * Device information preview - Integrated save recording API call from play page - Added success/error toast notifications - Automatic event filtering during recording **Technical Details** - Events stored as JSON array with timestamp, deviceIndex, deviceName, actuatorIndex, actuatorType, and normalized value - Device metadata includes name, index, and capability list - Slug auto-generated from title for SEO-friendly URLs - Status workflow: draft → published → archived - Permission checks: users can only access own recordings or public ones - Frontend uses performance.now() for millisecond precision timing **User Flow** 1. User scans and connects devices on /play page 2. Clicks "Start Recording" to begin capturing events 3. Manipulates device sliders - all changes are recorded 4. Clicks "Stop Recording" to end capture 5. Save dialog appears with recording preview and form 6. User enters title, description, tags and saves 7. Recording appears in dashboard /me Recordings tab 8. Can play back, edit, or delete recordings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
💋 sexy.pivoine.art
"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
👅 What Is This Delicious Creation?
Welcome, dear pleasure-seeker! This is sexy.pivoine.art — a modern, sensual platform combining the elegance of SvelteKit, the power of Directus CMS, and the intimate connection of Buttplug.io hardware integration.
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
- 🗄️ Headless CMS powered by Directus for content liberation
- 🎮 Hardware Integration via Buttplug.io (yes, really!)
- 🌐 Multi-Platform Support (AMD64 + ARM64) — pleasure everywhere
- 🔒 Session-Based Authentication — discretion guaranteed
- 📱 Responsive Design that looks sexy on any device
- 🌍 Internationalization — pleasure speaks all languages
- 📊 Analytics Integration (Umami) — know your admirers
- 📧 Newsletter Integration (Letterspace) — stay connected
🍑 Technology Stack 🍑
┌─────────────────────────────────────────────────────────────┐
│ 💋 Frontend Layer │
│ ├─ SvelteKit 2.0 → Smooth as silk │
│ ├─ Tailwind CSS 4 → Styled to seduce │
│ ├─ bits-ui Components → Building blocks of pleasure │
│ └─ Vite → Fast and furious │
├─────────────────────────────────────────────────────────────┤
│ 🍷 Backend Layer │
│ ├─ Directus CMS → Content with no limits │
│ ├─ Custom Extensions → Bespoke pleasures │
│ └─ PostgreSQL → Data deep and secure │
├─────────────────────────────────────────────────────────────┤
│ 🎀 Hardware Layer │
│ ├─ Buttplug.io → Real connections │
│ ├─ TypeScript + Rust → Power and precision │
│ └─ WebBluetooth API → Wireless intimacy │
├─────────────────────────────────────────────────────────────┤
│ 🌸 DevOps Layer │
│ ├─ Docker → Containerized ecstasy │
│ ├─ GitHub Actions → Automated seduction │
│ └─ GHCR → Images served hot │
└─────────────────────────────────────────────────────────────┘
🔥 Quick Start — Get Intimate Fast
💕 Option 1: Using Docker (Recommended)
# Pull the pleasure
docker pull ghcr.io/valknarxxx/sexy:latest
# Run with passion
docker run -d -p 3000:3000 \
-e PUBLIC_API_URL=https://api.your-domain.com \
-e PUBLIC_URL=https://your-domain.com \
ghcr.io/valknarxxx/sexy:latest
# Visit your creation at http://localhost:3000 💋
See QUICKSTART.md for the full seduction guide.
💜 Option 2: Local Development
Prerequisites:
- Node.js 20.19.1 — the foundation
corepack enable— unlock the toolspnpm install— gather your ingredients- Rust +
cargo install wasm-bindgen-cli— forge the connection
Start your pleasure journey:
# Awaken all services
pnpm dev
# Or tease them one by one
pnpm dev:data # The foundation
pnpm dev:directus # The content
pnpm --filter @sexy.pivoine.art/frontend dev # The face
Visit http://localhost:3000 and let the experience begin... 💋
🌹 Project Structure
This monorepo contains three packages, each serving its purpose:
sexy.pivoine.art/
├─ 💄 packages/frontend/ → SvelteKit app (the seduction)
├─ 🎭 packages/bundle/ → Directus extensions (the power)
└─ 🎮 packages/buttplug/ → Hardware control (the connection)
📚 Documentation — Your Guide to Pleasure
| Document | Purpose | Emoji |
|---|---|---|
| QUICKSTART.md | Get wet... I mean, get started! | 💦 |
| COMPOSE.md | Docker Compose setup guide | 🐳 |
| DOCKER.md | Standalone Docker deployment | 🐋 |
| CLAUDE.md | Architecture & development | 🤖 |
| .github/workflows/README.md | CI/CD workflows | ⚙️ |
🎨 Building — Craft Your Masterpiece
Build All Packages
# Prepare everything
pnpm install
# Build the WASM foundation
pnpm --filter @sexy.pivoine.art/buttplug build:wasm
# Build the packages
pnpm --filter @sexy.pivoine.art/buttplug build
pnpm --filter @sexy.pivoine.art/frontend build
pnpm --filter @sexy.pivoine.art/bundle build
Build Docker Image
# Quick build
./build.sh
# Manual control
docker build -t sexy.pivoine.art:latest .
# Multi-platform pleasure
docker buildx build --platform linux/amd64,linux/arm64 -t sexy.pivoine.art:latest .
🚀 Deployment — Share Your Creation
Production with Docker Compose
# Configure your secrets
cp .env.production.example .env.production
# Edit .env.production with your intimate details
# Deploy with grace (uses Traefik for routing)
docker-compose -f compose.production.yml --env-file .env.production up -d
Production without Docker
# Build everything
pnpm build:frontend
# Start serving
pnpm --filter @sexy.pivoine.art/frontend start
🌈 Environment Variables
💖 Required (The Essentials)
PUBLIC_API_URL— Your Directus backendPUBLIC_URL— Your frontend domain
💜 Optional (The Extras)
PUBLIC_UMAMI_ID— Analytics trackingLETTERSPACE_API_URL— Newsletter endpointLETTERSPACE_API_KEY— Newsletter keyLETTERSPACE_LIST_ID— Mailing list
See .env.production.example for the full configuration.
🎭 Development Workflow
graph LR
A[💡 Idea] --> B[💻 Code]
B --> C[🧪 Test Locally]
C --> D[🌿 Feature Branch]
D --> E[📤 Push & PR]
E --> F{✅ CI Pass?}
F -->|Yes| G[🔀 Merge to Main]
F -->|No| B
G --> H[🚀 Auto Deploy]
H --> I[🏷️ Tag Release]
I --> J[🎉 Celebrate]
- Create →
git checkout -b feature/my-sexy-feature - Develop → Write beautiful code
- Test →
pnpm dev - Push → Create PR (triggers CI build)
- Merge → Automatic deployment to production
- Release →
git tag v1.0.0 && git push origin v1.0.0
🔐 Security — Protected Pleasure
- 🛡️ Daily vulnerability scans with Trivy
- 🔒 Non-root Docker containers
- 📊 Security reports in GitHub Security tab
- 🤐 Confidential issue reporting available
Report security concerns privately via GitHub Security.
💝 Contributing — Join the Movement
Like Beate Uhse fought for sexual liberation, we welcome contributors who believe in freedom, pleasure, and quality code.
- Fork this repository
- Create your feature branch
- Commit your changes
- Push to your branch
- Submit a pull request
All contributors are bound by our code of conduct: Respect, Consent, and Quality.
🎯 CI/CD Pipeline — Automated Seduction
Our GitHub Actions workflows handle:
- ✅ Multi-platform Docker builds (AMD64 + ARM64)
- ✅ Automated publishing to GHCR
- ✅ Daily security vulnerability scans
- ✅ Weekly cleanup of old images
- ✅ Semantic versioning from git tags
Images available at: ghcr.io/valknarxxx/sexy
💌 Credits & Acknowledgments
🌸 Created with Love by 🌸
Für die Mäuse... 🐭💕
🙏 Built With
| Technology | Purpose |
|---|---|
| SvelteKit | Framework |
| Directus | CMS |
| Buttplug.io | Hardware |
| bits-ui | Components |
💐 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."
⚖️ License & Legal
- 📜 See 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
🍑 Made with 💜 for Freedom, Pleasure & Technology 🍑
██████╗ ███████╗██╗ ██╗██╗ ██╗ ██╔════╝ ██╔════╝╚██╗██╔╝╚██╗ ██╔╝ ╚█████╗ █████╗ ╚███╔╝ ╚████╔╝ ╚═══██╗ ██╔══╝ ██╔██╗ ╚██╔╝ ██████╔╝ ███████╗██╔╝╚██╗ ██║ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝
Pleasure is a human right. Technology is freedom. Together, they are power.
sexy.pivoine.art | © 2025 Palina & Valknar
