Add inverse_of tracking and admin question management

- Add inverse_of column support for question pair linking
- Enhance admin questions page with bulk operations
- Add DB migrations for inverse_of and FK indexes
- Update pack generator docs for inverse linking
- Improve Docker configs for admin app
This commit is contained in:
jjbrunton committed 2026-01-11 11:17:46 +00:00
1 parent efe93a3db4
commit df955812fe
22 files changed
+9924 -94

No files matched your search

+19 -5
View File
@@ -21,7 +21,9 @@ You are a content generation specialist for Sauci, a couples intimacy app. You c
3. **No time words**: Never tonight/now/today/right now
4. **Inverse requirement**: Every asymmetric question MUST have its inverse created
4. **Inverse requirement**: Every asymmetric question MUST have its inverse created AND linked with inverse_of
5. **Database linking**: Use the `inverse_of` column to link inverse pairs (inverse points to primary's UUID)
### Intensity Scale
@@ -39,20 +41,32 @@ You are a content generation specialist for Sauci, a couples intimacy app. You c
```
text: "Cook dinner together"
partner_text: NULL
inverse_of: NULL
```
**Use partner_text when roles differ:**
```
-- PRIMARY question (inverse_of = NULL)
id: uuid-1
text: "Give your partner oral"
partner_text: "Receive oral from your partner"
inverse_of: NULL
```
**CRITICAL - Always create the inverse:**
**CRITICAL - Always create the inverse AND link it:**
```
-- INVERSE question (inverse_of = primary's UUID)
id: uuid-2
text: "Receive oral from your partner"
partner_text: "Give your partner oral"
inverse_of: uuid-1
```
The `inverse_of` column ensures we can:
- Track which questions are pairs
- Calculate unique question count (not inflated by inverses)
- Display accurate pack sizes to users
### Avoid
- Cheesy language ("make love", "souls connecting")
@@ -70,9 +84,9 @@ partner_text: "Give your partner oral"
1. **Understand the brief**: Category, intensity range, pack position in progression
2. **Research existing content**: Check what packs exist, avoid overlap
3. **Brainstorm themes**: What specific activities fit this pack?
4. **Generate questions**: Mix symmetric and asymmetric, create all inverses
5. **Review**: Check all rules, remove duplicates, verify intensity
6. **Format**: Output as SQL or table format
4. **Generate questions**: Mix symmetric and asymmetric, create all inverses with inverse_of links
5. **Review**: Check all rules, remove duplicates, verify intensity, confirm inverse pairs are linked
6. **Format**: Output as SQL with inverse_of column properly set
## Output Format
+44 -5
View File
@@ -10,12 +10,13 @@ Fix questions in category: $ARGUMENTS
## Task Overview
Analyze questions across all packs in a category and apply fixes for issues across 5 dimensions:
Analyze questions across all packs in a category and apply fixes for issues across 6 dimensions:
1. **Text Phrasing** - Improve wording, remove wishy-washy language
2. **Audience Targeting** - Fix couple/initiator gender targeting
3. **Intensity Levels** - Correct misassigned intensity ratings
4. **Required Props** - Identify missing physical props/accessories
5. **Deletions** - Remove true duplicates, unsafe, or broken questions
5. **Inverse Linking** - Detect and link inverse question pairs using inverse_of column
6. **Deletions** - Remove true duplicates, unsafe, or broken questions
## Step 1: Parse Arguments
@@ -47,8 +48,8 @@ ORDER BY p.name;
```
```sql
-- Get questions for all packs in the category
SELECT q.id, q.text, q.partner_text, q.intensity, q.allowed_couple_genders, q.target_user_genders, q.required_props, p.name as pack_name
-- Get questions for all packs in the category (include inverse_of for pair detection)
SELECT q.id, q.text, q.partner_text, q.intensity, q.allowed_couple_genders, q.target_user_genders, q.required_props, q.inverse_of, p.name as pack_name
FROM questions q
JOIN question_packs p ON q.pack_id = p.id
WHERE p.category_id = '<category_id>' AND q.deleted_at IS NULL
@@ -138,10 +139,36 @@ Check if current intensity matches the activity:
**Rules:**
- Props are physical items/accessories, not body parts or acts
- Use lowercase, short, singular names (e.g., "blindfold", "remote vibrator")
- Try to avoid generics such as "toy" (unless the activity can be done with any toy)
- Reuse existing prop names from the catalog when possible
- If no props are required, set to null
### 3.5 Deletion Analysis
### 3.5 Inverse Linking Analysis
**Purpose:** Detect inverse question pairs and link them using the `inverse_of` database column.
**Detection Algorithm:**
1. For each asymmetric question (has partner_text), look for its inverse:
- Inverse exists if another question has: `text` = this question's `partner_text` AND `partner_text` = this question's `text`
2. Check if the `inverse_of` column is correctly set:
- One question in the pair should be the "primary" (inverse_of = NULL)
- The other should be the "inverse" (inverse_of = primary's UUID)
**Fixing Missing Links:**
- If inverse pair exists but neither has `inverse_of` set:
- Set the first one (by created_at) as primary (inverse_of = NULL)
- Set the second one's inverse_of = primary's UUID
- If inverse pair exists but both have `inverse_of = NULL`:
- Choose one as primary, link the other
- If a question has `inverse_of` pointing to a non-existent question:
- Find the actual inverse and fix the link, OR set to NULL if no inverse exists
**Important:**
- Only asymmetric questions (with partner_text) should have inverse pairs
- Symmetric questions (partner_text = NULL) should have inverse_of = NULL
- This fixes the database structure, NOT the question content
### 3.6 Deletion Analysis
**Deletion Categories:**
- `duplicate`: Same `text` AND same initiator as another question
@@ -188,6 +215,7 @@ Present findings grouped by fix type:
| Intensity fixes | X | X |
| Targeting fixes | X | X |
| Props fixes | X | X |
| Inverse linking fixes | X | X |
| Deletions | X | X |
| No changes needed | X | - |
@@ -198,11 +226,13 @@ For each question needing changes, show:
```
**Question ID:** <id>
**Current:** <text> / <partner_text or null>
**Current inverse_of:** <uuid or null>
**Issues:**
- Text: <issue description>
- Intensity: <current> -> <suggested> (<reason>)
- Targeting: <issue description>
- Props: <current> -> <suggested>
- Inverse Link: <missing/broken> - <inverse question id if found>
- DELETE: <category> - <reason>
**Fix:**
@@ -212,6 +242,7 @@ For each question needing changes, show:
- Couple Targets: <new allowed_couple_genders or null>
- Initiator Targets: <new target_user_genders or null>
- Required Props: <new required_props or null>
- inverse_of: <uuid or null>
```
## Step 5: Apply Fixes (if --apply flag)
@@ -237,6 +268,12 @@ UPDATE questions SET
required_props = ARRAY['...'] or NULL
WHERE id = '<question_id>';
-- Inverse linking fixes
-- Link inverse question to its primary
UPDATE questions SET inverse_of = '<primary_question_id>' WHERE id = '<inverse_question_id>';
-- Or clear a broken inverse_of link
UPDATE questions SET inverse_of = NULL WHERE id = '<question_id>';
-- Deletions (soft delete)
UPDATE questions SET deleted_at = NOW() WHERE id IN ('<id1>', '<id2>', ...);
```
@@ -265,7 +302,9 @@ If --apply is NOT set, output the SQL statements for manual review.
- DO prioritize safety issues (delete unsafe content first)
- DO preserve the core intent of questions when suggesting text fixes
- DO verify inverse pairs exist before flagging duplicates
- DO detect and link inverse pairs using the inverse_of column
- DON'T change questions that are already well-formed
- DON'T suggest overly restrictive targeting (prefer inclusive by default)
- DON'T create new prop names when existing ones match
- DON'T flag inverse pairs as duplicates (one's text = other's partner_text)
- DON'T forget to set inverse_of for detected inverse pairs - this ensures accurate unique question counts
+51 -13
View File
@@ -91,21 +91,33 @@ Follow these rules strictly:
- BAD: "Receive oral from your partner" (clinical)
- GOOD: "Let your partner pleasure you with their mouth" (enticing)
#### 3.4 Critical: Inverse Questions
#### 3.4 Critical: Inverse Questions and Database Linking
For EVERY asymmetric question, create its inverse:
For EVERY asymmetric question, create its inverse AND link them using the `inverse_of` column:
```
Original:
Original (PRIMARY - inverse_of = NULL):
id: <generated_uuid_1>
text: "Spank your partner"
partner_text: "Be spanked by your partner"
inverse_of: NULL
Inverse (MUST CREATE):
Inverse (SECONDARY - points to primary):
id: <generated_uuid_2>
text: "Be spanked by your partner"
partner_text: "Spank your partner"
inverse_of: <generated_uuid_1>
```
This ensures both partners are asked about both roles.
This ensures:
1. Both partners are asked about both roles
2. The database tracks which questions are inverses of each other
3. Accurate unique question counts (200 questions = 100 unique concepts with inverses)
**Database Schema:**
- `inverse_of` column: UUID referencing the primary question's ID
- Primary questions have `inverse_of = NULL`
- Inverse questions have `inverse_of = <primary_question_id>`
#### 3.5 Intensity Guidelines
@@ -195,15 +207,38 @@ VALUES (
)
RETURNING id;
-- Then insert questions (use returned pack_id)
INSERT INTO questions (pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props) VALUES
('[pack_id]', 'Question text', 'Partner text or NULL', intensity, NULL, NULL, NULL),
('[pack_id]', 'Blowjob question', 'Partner text', 3, ARRAY['male+male', 'female+male'], ARRAY['female'], NULL),
('[pack_id]', 'Toy question', 'Partner text', 4, NULL, NULL, ARRAY['remote vibrator']),
-- ... all questions
-- Then insert questions with inverse_of linking
-- For inverse pairs: insert primary first (inverse_of = NULL), then inverse pointing to primary
-- Generate UUIDs for inverse pairs upfront
-- Pair 1: Primary and its inverse
WITH pair1_primary AS (
INSERT INTO questions (pack_id, text, partner_text, intensity, inverse_of)
VALUES ('[pack_id]', 'Spank your partner', 'Be spanked by your partner', 3, NULL)
RETURNING id
)
INSERT INTO questions (pack_id, text, partner_text, intensity, inverse_of)
SELECT '[pack_id]', 'Be spanked by your partner', 'Spank your partner', 3, id
FROM pair1_primary;
-- Symmetric questions (no inverse_of needed)
INSERT INTO questions (pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props, inverse_of) VALUES
('[pack_id]', 'Symmetric question text', NULL, 2, NULL, NULL, NULL, NULL);
-- Or bulk insert with explicit UUIDs for pairs:
INSERT INTO questions (id, pack_id, text, partner_text, intensity, inverse_of) VALUES
-- Pair 1
('uuid-primary-1', '[pack_id]', 'Give your partner a massage', 'Receive a massage from your partner', 2, NULL),
('uuid-inverse-1', '[pack_id]', 'Receive a massage from your partner', 'Give your partner a massage', 2, 'uuid-primary-1'),
-- Pair 2
('uuid-primary-2', '[pack_id]', 'Blindfold your partner', 'Be blindfolded by your partner', 3, NULL),
('uuid-inverse-2', '[pack_id]', 'Be blindfolded by your partner', 'Blindfold your partner', 3, 'uuid-primary-2'),
-- Symmetric (no pair)
(gen_random_uuid(), '[pack_id]', 'Cook dinner together', NULL, 1, NULL);
```
**Field notes:**
- `inverse_of`: NULL for primary/symmetric questions, UUID of primary question for inverses
- `allowed_couple_genders`: NULL for all couples, or array like `ARRAY['male+male', 'female+male']`
- `target_user_genders`: NULL for any initiator, or array like `ARRAY['female']`
- `required_props`: NULL if no props needed, or array like `ARRAY['blindfold', 'ice cubes']`
@@ -213,13 +248,14 @@ Also provide a summary table:
| Metric | Value |
|--------|-------|
| Total questions | X |
| Unique question concepts | X (total - inverse count) |
| Intensity 1 | X |
| Intensity 2 | X |
| Intensity 3 | X |
| Intensity 4 | X |
| Intensity 5 | X |
| Symmetric (null partner_text) | X |
| Asymmetric (with inverses) | X pairs |
| Asymmetric pairs (with inverse_of links) | X pairs (X questions) |
| With couple targeting | X |
| With initiator targeting | X |
| With required props | X |
@@ -236,10 +272,12 @@ Also provide a summary table:
- DO ask clarifying questions if the pack concept is unclear
- DO check existing packs in the category first
- DO create inverse questions for ALL asymmetric content
- DO create inverse questions for ALL asymmetric content AND link them with inverse_of
- DO vary sentence structure and openers
- DO use the inverse_of column to link inverse pairs (inverse points to primary's UUID)
- DON'T use cheesy or cliche language
- DON'T assume heterosexual couples
- DON'T skip the inverse question requirement
- DON'T forget to set inverse_of - this is how we track unique question concepts
- DON'T use interview-style questions ("Would you like to...")
- DON'T treat inverse pairs as duplicates - they are REQUIRED (one's `text` = other's `partner_text`)
+34 -10
View File
@@ -10,12 +10,13 @@ Review and validate questions: $ARGUMENTS
## Task Overview
Analyze questions for issues and suggest fixes across 5 dimensions:
Analyze questions for issues and suggest fixes across 6 dimensions:
1. **Text Phrasing** - Improve wording, remove wishy-washy language
2. **Audience Targeting** - Fix couple/initiator gender targeting
3. **Intensity Levels** - Correct misassigned intensity ratings
4. **Required Props** - Identify missing physical props/accessories
5. **Deletions** - Flag duplicates, redundant, or broken questions
5. **Inverse Linking** - Detect and link inverse question pairs using inverse_of column
6. **Deletions** - Flag duplicates, redundant, or broken questions
## Step 1: Parse Arguments
@@ -29,18 +30,18 @@ Extract from $ARGUMENTS:
Query the database:
```sql
-- If pack name provided:
SELECT q.id, q.text, q.partner_text, q.intensity, q.allowed_couple_genders, q.target_user_genders, q.required_props
-- If pack name provided (include inverse_of for pair detection):
SELECT q.id, q.text, q.partner_text, q.intensity, q.allowed_couple_genders, q.target_user_genders, q.required_props, q.inverse_of
FROM questions q
JOIN question_packs p ON q.pack_id = p.id
WHERE p.name ILIKE '%<pack_name>%'
WHERE p.name ILIKE '%<pack_name>%' AND q.deleted_at IS NULL
ORDER BY q.created_at
LIMIT <limit>;
-- If pack ID provided:
SELECT id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props
SELECT id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props, inverse_of
FROM questions
WHERE pack_id = '<pack_id>'
WHERE pack_id = '<pack_id>' AND deleted_at IS NULL
ORDER BY created_at
LIMIT <limit>;
```
@@ -138,7 +139,20 @@ Check if current intensity matches the activity:
- Reuse existing prop names from the catalog when possible
- If no props are required, set to null
### 4.5 Deletion Analysis
### 4.5 Inverse Linking Analysis
**Purpose:** Detect inverse question pairs and link them using the `inverse_of` database column.
**Detection:**
1. For each asymmetric question (has partner_text), look for its inverse:
- Inverse exists if another question has: `text` = this question's `partner_text` AND `partner_text` = this question's `text`
2. Check if the `inverse_of` column is correctly set
**Fixes:**
- If pair exists but not linked: set inverse_of on the second question to point to the first
- Symmetric questions should have inverse_of = NULL
### 4.6 Deletion Analysis
**Deletion Categories:**
- `duplicate`: Same core action as another question
@@ -184,6 +198,7 @@ Present findings in a structured format:
| Intensity fixes | X |
| Targeting fixes | X |
| Props fixes | X |
| Inverse linking fixes | X |
| Deletions suggested | X |
| No changes needed | X |
@@ -196,12 +211,14 @@ For each question needing changes:
**Current Text:** <text>
**Current Partner Text:** <partner_text or null>
**Current Intensity:** <intensity>
**Current inverse_of:** <uuid or null>
Issues Found:
- [ ] Text: <description of issue>
- [ ] Intensity: <current> -> <suggested> (<reason>)
- [ ] Targeting: <description>
- [ ] Props: <current> -> <suggested>
- [ ] Inverse Link: <missing/broken> - <inverse question id if found>
- [ ] DELETE: <category> - <reason>
Suggested Fix:
@@ -211,6 +228,7 @@ Suggested Fix:
- Couple Targets: <new allowed_couple_genders or null>
- Initiator Targets: <new target_user_genders or null>
- Required Props: <new required_props or null>
- inverse_of: <uuid or null>
```
### SQL to Apply Fixes
@@ -236,8 +254,11 @@ UPDATE questions SET
required_props = ARRAY[<new_props>]
WHERE id = '<question_id>';
-- Deletions
DELETE FROM questions WHERE id IN ('<id1>', '<id2>', ...);
-- Inverse linking fixes
UPDATE questions SET inverse_of = '<primary_question_id>' WHERE id = '<inverse_question_id>';
-- Deletions (soft delete)
UPDATE questions SET deleted_at = NOW() WHERE id IN ('<id1>', '<id2>', ...);
```
## Example Usage
@@ -254,6 +275,9 @@ DELETE FROM questions WHERE id IN ('<id1>', '<id2>', ...);
- DO group similar issues together for batch fixes
- DO prioritize safety issues (delete unsafe content first)
- DO preserve the core intent of questions when suggesting text fixes
- DO detect and link inverse pairs using the inverse_of column
- DON'T change questions that are already well-formed
- DON'T suggest overly restrictive targeting (prefer inclusive by default)
- DON'T create new prop names when existing ones match
- DON'T flag inverse pairs as duplicates (one's text = other's partner_text)
- DON'T forget to set inverse_of for detected inverse pairs
+43 -19
View File
@@ -42,6 +42,7 @@ Each question has:
- `allowed_couple_genders` - Which couple types see this (NULL = all)
- `target_user_genders` - Which gender initiates (NULL = any)
- `required_props` - Physical items needed (NULL = none)
- `inverse_of` - UUID of primary question if this is an inverse (NULL for primary/symmetric)
### When to use partner_text
@@ -57,28 +58,36 @@ text: "Give your partner a massage"
partner_text: "Receive a massage from your partner"
```
### Critical: Inverse Questions for Asymmetric Activities
### Critical: Inverse Questions and Database Linking
For any asymmetric question, you MUST create TWO questions to cover both perspectives:
For any asymmetric question, you MUST create TWO questions AND link them using the `inverse_of` column:
**Question 1:**
**Question 1 (PRIMARY - inverse_of = NULL):**
```
id: uuid-1
text: "Spank your partner"
partner_text: "Be spanked by your partner"
inverse_of: NULL
```
**Question 2 (inverse):**
**Question 2 (INVERSE - inverse_of = primary's UUID):**
```
id: uuid-2
text: "Be spanked by your partner"
partner_text: "Spank your partner"
inverse_of: uuid-1
```
This ensures:
- Partner A gets asked if they want to give AND receive
- Partner B gets asked if they want to give AND receive
- All four combinations can be discovered through matching
- The database tracks which questions are pairs (for accurate unique counts)
**IMPORTANT: Inverse pairs are NOT duplicates.** When one question's `text` matches another's `partner_text`, they form a valid inverse pair. This is intentional and required - do not flag or remove these as duplicates.
**IMPORTANT:**
- Inverse pairs are NOT duplicates. When one question's `text` matches another's `partner_text`, they form a valid inverse pair. This is intentional and required - do not flag or remove these as duplicates.
- The `inverse_of` column links the pair: the inverse question points to the primary question's UUID
- This allows the app to display accurate unique question counts (100 concepts, not 200 questions)
---
@@ -277,7 +286,7 @@ When asked to create a pack:
## Output Format
When generating packs, output in this format:
When generating packs, output in this format (with inverse_of linking for pairs):
```sql
-- Pack: [Pack Name]
@@ -285,20 +294,25 @@ When generating packs, output in this format:
-- Description: [Pack description]
-- Intensity range: [X-Y]
INSERT INTO questions (pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props) VALUES
('[pack_id]', 'Question text here', 'Partner text or NULL', intensity, NULL, NULL, NULL),
('[pack_id]', 'Blowjob question', 'Partner text', 3, ARRAY['male+male', 'female+male'], ARRAY['female'], NULL),
('[pack_id]', 'Toy question', 'Partner text', 4, NULL, NULL, ARRAY['remote vibrator']),
-- ... etc
-- For inverse pairs, insert primary first (inverse_of = NULL), then inverse pointing to primary
INSERT INTO questions (id, pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props, inverse_of) VALUES
-- Pair 1
('uuid-primary-1', '[pack_id]', 'Spank your partner', 'Be spanked by your partner', 3, NULL, NULL, NULL, NULL),
('uuid-inverse-1', '[pack_id]', 'Be spanked by your partner', 'Spank your partner', 3, NULL, NULL, NULL, 'uuid-primary-1'),
-- Pair 2 (with targeting)
('uuid-primary-2', '[pack_id]', 'Give your partner a blowjob', 'Receive a blowjob from your partner', 3, ARRAY['male+male', 'female+male'], NULL, NULL, NULL),
('uuid-inverse-2', '[pack_id]', 'Receive a blowjob from your partner', 'Give your partner a blowjob', 3, ARRAY['male+male', 'female+male'], NULL, NULL, 'uuid-primary-2'),
-- Symmetric (no inverse needed)
(gen_random_uuid(), '[pack_id]', 'Cook dinner together', NULL, 1, NULL, NULL, NULL, NULL);
```
Or as a table:
Or as a table (include inverse_of column):
| Text | Partner Text | Intensity | Couple Targets | Initiator | Props |
|------|--------------|-----------|----------------|-----------|-------|
| Question here | Partner perspective or null | 4 | NULL | NULL | NULL |
| Blowjob | Partner text | 3 | M+M, F+M | female | NULL |
| Toy play | Partner text | 4 | NULL | NULL | remote vibrator |
| ID | Text | Partner Text | Intensity | Couple Targets | Initiator | Props | inverse_of |
|----|------|--------------|-----------|----------------|-----------|-------|------------|
| uuid-1 | Spank your partner | Be spanked | 3 | NULL | NULL | NULL | NULL |
| uuid-2 | Be spanked by partner | Spank your partner | 3 | NULL | NULL | NULL | uuid-1 |
| uuid-3 | Cook together | null | 1 | NULL | NULL | NULL | NULL |
---
@@ -324,23 +338,27 @@ target_user_genders: NULL
required_props: NULL
```
### Playful (Intensity 3) - With Props
### Playful (Intensity 3) - With Props and Inverse Linking
```
id: uuid-blindfold-primary
text: "Blindfold your partner and tease them with different sensations"
partner_text: "Be blindfolded while your partner teases you"
intensity: 3
allowed_couple_genders: NULL
target_user_genders: NULL
required_props: ["blindfold"]
inverse_of: NULL
```
AND its inverse:
AND its inverse (linked via inverse_of):
```
id: uuid-blindfold-inverse
text: "Be blindfolded while your partner teases you"
partner_text: "Blindfold your partner and tease them with different sensations"
intensity: 3
allowed_couple_genders: NULL
target_user_genders: NULL
required_props: ["blindfold"]
inverse_of: uuid-blindfold-primary
```
### Steamy (Intensity 4) - With Props and Targeting
@@ -417,10 +435,16 @@ required_props: NULL
**Structure:**
- [ ] All asymmetric questions have their inverse created (these are NOT duplicates - they're required pairs)
- [ ] All inverse pairs are linked via `inverse_of` column (inverse points to primary's UUID)
- [ ] Partner text is appealing (not clinical)
- [ ] Partner text frames responses as "allowing" not forced
- [ ] No actual duplicates (same `text` appearing twice)
**Database Linking:**
- [ ] Primary questions have `inverse_of = NULL`
- [ ] Inverse questions have `inverse_of = <primary_question_uuid>`
- [ ] Symmetric questions have `inverse_of = NULL`
**Accuracy:**
- [ ] Intensity levels match the activities
- [ ] Couple targeting is correct (NULL unless anatomy-specific)
+9 -4
View File
@@ -1,15 +1,20 @@
FROM node:20-alpine AS builder
FROM node:20-bookworm-slim AS builder
WORKDIR /app
# Enable pnpm via corepack (allow non-matching packageManager)
ENV COREPACK_ENABLE_STRICT=0
ENV PNPM_CONFIG_LINK_WORKSPACE_PACKAGES=true
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
# Copy everything first (workspaces need full structure)
COPY . .
# Install all dependencies
RUN npm install
RUN pnpm install --no-frozen-lockfile
# Build shared package first
RUN npx turbo run build --filter=@sauci/shared
RUN pnpm exec turbo run build --filter=@sauci/shared
# Build admin app with env vars
ARG VITE_SUPABASE_URL
@@ -36,7 +41,7 @@ ENV VITE_COUNCIL_ENABLED=$VITE_COUNCIL_ENABLED
ENV VITE_COUNCIL_GENERATOR_MODEL=$VITE_COUNCIL_GENERATOR_MODEL
ENV VITE_COUNCIL_REVIEWER_MODEL=$VITE_COUNCIL_REVIEWER_MODEL
RUN npx turbo run build --filter=@sauci/admin
RUN pnpm exec turbo run build --filter=@sauci/admin
FROM nginx:alpine
COPY --from=builder /app/apps/admin/dist /usr/share/nginx/html
+10 -4
View File
@@ -1,9 +1,15 @@
FROM node:20-alpine
FROM node:20-bookworm-slim
WORKDIR /app
# Enable pnpm via corepack (allow non-matching packageManager)
ENV COREPACK_ENABLE_STRICT=0
ENV PNPM_CONFIG_LINK_WORKSPACE_PACKAGES=true
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
# Copy root package files and workspace configs
COPY package*.json ./
COPY pnpm-workspace.yaml ./
COPY turbo.json ./
# Copy all workspace package.json files
@@ -14,16 +20,16 @@ COPY apps/web/package.json ./apps/web/
COPY packages/shared/package.json ./packages/shared/
# Install all dependencies at root level (workspaces)
RUN npm install
RUN pnpm install --no-frozen-lockfile
# Copy all source code
COPY . .
# Build shared package
RUN npx turbo run build --filter=@sauci/shared
RUN pnpm exec turbo run build --filter=@sauci/shared
WORKDIR /app/apps/admin
EXPOSE 3001
CMD ["npm", "run", "dev"]
CMD ["pnpm", "run", "dev"]
+1 -1
View File
@@ -25,7 +25,7 @@
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tabs": "^1.0.4",
"@radix-ui/react-tooltip": "^1.0.7",
"@sauci/shared": "*",
"@sauci/shared": "workspace:*",
"@supabase/supabase-js": "^2.39.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
+24 -2
View File
@@ -108,17 +108,38 @@ The card reader is the DOER. Their partner is "your partner".
</examples>
<question_types>
1. SYMMETRIC Activities (partner_text = null):
1. SYMMETRIC Activities (partner_text = null, no inverse_pair_id):
- Both partners do the same thing together
- ${symmetricExamples}
2. ASYMMETRIC Actions (requires partner_text):
2. ASYMMETRIC Actions (requires partner_text AND inverse pair):
- One partner does something TO/FOR the other, or roles differ
- text = what the INITIATOR does
- partner_text = what the RECEIVER does/experiences
- ${asymmetricExamples}
- CRITICAL: Every asymmetric question MUST have its inverse created as a separate question
</question_types>
<inverse_pairs>
For EVERY asymmetric question, you MUST create its inverse as a separate question.
Both questions in a pair should have the SAME inverse_pair_id (a unique string per pair).
Example pair (same inverse_pair_id "pair_1"):
Question 1 (primary):
text: "Spank your partner"
partner_text: "Be spanked by your partner"
inverse_pair_id: "pair_1"
Question 2 (inverse):
text: "Be spanked by your partner"
partner_text: "Spank your partner"
inverse_pair_id: "pair_1"
The first question in each pair (lower array index) becomes the "primary" and the second gets linked as its inverse.
Use simple pair IDs like "pair_1", "pair_2", etc.
Symmetric questions should have inverse_pair_id: null.
</inverse_pairs>
<output_format>
Return a JSON object with this exact structure:
{
@@ -128,6 +149,7 @@ Return a JSON object with this exact structure:
"partner_text": string|null, // REQUIRED for asymmetric, null for symmetric
"intensity": 1-5, // REQUIRED: must match the intensity level guidelines
"requires_props": string[]|null, // Optional: items needed (e.g., ["blindfold", "massage oil"])
"inverse_pair_id": string|null, // REQUIRED for asymmetric pairs, null for symmetric
"location_type": "home"|"public"|"outdoors"|"travel"|"anywhere", // Optional
"effort_level": "spontaneous"|"low"|"medium"|"planned" // Optional
}
+3
View File
@@ -43,6 +43,9 @@ export interface GeneratedQuestion {
requires_props?: string[] | null;
location_type?: 'home' | 'public' | 'outdoors' | 'travel' | 'anywhere';
effort_level?: 'spontaneous' | 'low' | 'medium' | 'planned';
// Inverse pair tracking - questions with the same inverse_pair_id are inverses of each other
// First question in pair (lower array index) is primary, second gets inverse_of set
inverse_pair_id?: string | null;
// Cherry-pick provenance (only set in cherry-pick mode)
sourceGeneratorIndex?: number;
sourceGeneratorModel?: string;
@@ -12,6 +12,7 @@ interface QuestionRow {
pack_id: string;
intensity: number | null;
partner_text: string | null;
inverse_of?: string | null;
}
interface PackRow {
@@ -124,7 +125,7 @@ export function QuestionAnalyticsPage() {
const to = from + pageSize - 1;
const { data, error } = await supabase
.from('questions')
.select('id, pack_id, intensity, partner_text')
.select('id, pack_id, intensity, partner_text, inverse_of')
.range(from, to);
if (error) throw error;
@@ -224,7 +225,9 @@ export function QuestionAnalyticsPage() {
let freeCount = 0;
let taggedCount = 0;
questions.forEach((question) => {
const primaryQuestions = questions.filter((question) => question.inverse_of == null);
primaryQuestions.forEach((question) => {
const pack = packById.get(question.pack_id);
const isPremium = pack?.is_premium ?? false;
const segmentKey: SegmentKey = isPremium ? 'premium' : 'free';
@@ -294,7 +297,7 @@ export function QuestionAnalyticsPage() {
}
});
const totalQuestions = questions.length;
const totalQuestions = primaryQuestions.length;
const premiumData: ChartDatum[] = [
{ name: 'Premium', value: premiumCount, color: '#f59e0b' },
{ name: 'Free', value: freeCount, color: '#22c55e' },
+258 -26
View File
@@ -1,4 +1,4 @@
import { useState, useEffect, useCallback } from 'react';
import { useState, useEffect, useCallback, useMemo } from 'react';
import { useParams } from 'react-router-dom';
import { supabase } from '@/config';
import { auditedSupabase } from '@/hooks/useAuditedSupabase';
@@ -29,7 +29,14 @@ import {
DialogTrigger,
} from '@/components/ui/dialog';
import { Card } from '@/components/ui/card';
import { Plus, Pencil, Trash2, Sparkles, Loader2, Users } from 'lucide-react';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { Plus, Pencil, Trash2, Sparkles, Loader2, Users, Link2, Eye } from 'lucide-react';
import { Checkbox } from '@/components/ui/checkbox';
import { toast } from 'sonner';
import { AiGeneratorDialog } from '@/components/ai/AiGeneratorDialog';
@@ -53,6 +60,7 @@ interface Question {
allowed_couple_genders: string[] | null;
target_user_genders: string[] | null;
required_props?: string[] | null;
inverse_of?: string | null;
created_at: string | null;
}
@@ -75,6 +83,9 @@ export function QuestionsPage() {
const [saving, setSaving] = useState(false);
const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
const [bulkDeleting, setBulkDeleting] = useState(false);
const [peekOpen, setPeekOpen] = useState(false);
const [peekPrimary, setPeekPrimary] = useState<Question | null>(null);
const [peekInverse, setPeekInverse] = useState<Question | null>(null);
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(25);
const [totalCount, setTotalCount] = useState(0);
@@ -87,6 +98,7 @@ export function QuestionsPage() {
allowed_couple_genders: string[];
target_user_genders: string[];
required_props: string;
inverse_of: string;
}>({
text: '',
partner_text: '',
@@ -94,36 +106,55 @@ export function QuestionsPage() {
allowed_couple_genders: [],
target_user_genders: [],
required_props: '',
inverse_of: '',
});
// All questions in pack for inverse_of dropdown (loaded once)
const [allPackQuestions, setAllPackQuestions] = useState<Question[]>([]);
const fetchData = useCallback(async () => {
if (!packId) return;
setLoading(true);
try {
// Fetch pack info
const { data: packData } = await supabase
const from = (page - 1) * pageSize;
const to = from + pageSize - 1;
const packPromise = supabase
.from('question_packs')
.select('id, name, description, icon, is_explicit')
.eq('id', packId)
.single();
setPack(packData);
const from = (page - 1) * pageSize;
const to = from + pageSize - 1;
// Fetch questions
const { data: questionData, error, count } = await supabase
const questionsPromise = supabase
.from('questions')
.select('*', { count: 'exact' })
.eq('pack_id', packId)
.order('created_at', { ascending: true })
.range(from, to);
const allPackPromise = supabase
.from('questions')
.select('id, text, inverse_of')
.eq('pack_id', packId)
.is('deleted_at', null)
.order('created_at', { ascending: true });
const [
{ data: packData, error: packError },
{ data: questionData, error, count },
{ data: allPackData, error: allPackError },
] = await Promise.all([packPromise, questionsPromise, allPackPromise]);
if (packError) throw packError;
if (error) throw error;
setTotalCount(count || 0);
setQuestions(questionData || []);
setPack(packData);
if (allPackError) {
toast.error('Failed to load inverse peek data');
console.error(allPackError);
} else {
setAllPackQuestions((allPackData as Question[]) || []);
}
} catch (error) {
toast.error('Failed to load questions');
console.error(error);
@@ -175,7 +206,23 @@ export function QuestionsPage() {
setSelectedIds(new Set());
}, [page, pageSize]);
const openCreateDialog = () => {
// Fetch all questions in pack for inverse_of dropdown
const fetchAllPackQuestions = useCallback(async () => {
if (!packId) return;
const { data } = await supabase
.from('questions')
.select('id, text, inverse_of')
.eq('pack_id', packId)
.is('deleted_at', null)
.order('created_at', { ascending: true });
setAllPackQuestions((data as Question[]) || []);
}, [packId]);
const primaryQuestionById = useMemo(() => {
return new Map(allPackQuestions.map(question => [question.id, question]));
}, [allPackQuestions]);
const openCreateDialog = async () => {
setEditingQuestion(null);
setFormData({
text: '',
@@ -184,11 +231,13 @@ export function QuestionsPage() {
allowed_couple_genders: [],
target_user_genders: [],
required_props: '',
inverse_of: '',
});
await fetchAllPackQuestions();
setDialogOpen(true);
};
const openEditDialog = (question: Question) => {
const openEditDialog = async (question: Question) => {
setEditingQuestion(question);
setFormData({
text: question.text,
@@ -197,7 +246,9 @@ export function QuestionsPage() {
allowed_couple_genders: question.allowed_couple_genders || [],
target_user_genders: question.target_user_genders || [],
required_props: question.required_props?.join(', ') ?? '',
inverse_of: question.inverse_of || '',
});
await fetchAllPackQuestions();
setDialogOpen(true);
};
@@ -223,6 +274,7 @@ export function QuestionsPage() {
allowed_couple_genders: formData.allowed_couple_genders.length > 0 ? formData.allowed_couple_genders : null,
target_user_genders: formData.target_user_genders.length > 0 ? formData.target_user_genders : null,
required_props: requiredPropsValue,
inverse_of: formData.inverse_of || null,
});
if (error) throw error;
@@ -236,6 +288,7 @@ export function QuestionsPage() {
allowed_couple_genders: formData.allowed_couple_genders.length > 0 ? formData.allowed_couple_genders : null,
target_user_genders: formData.target_user_genders.length > 0 ? formData.target_user_genders : null,
required_props: requiredPropsValue,
inverse_of: formData.inverse_of || null,
});
if (error) throw error;
@@ -269,21 +322,104 @@ export function QuestionsPage() {
}
};
const handleAiGenerated = (generatedQuestions: Array<{ text: string; partner_text?: string; intensity: number }>) => {
// Bulk insert AI-generated questions
const handleAiGenerated = (generatedQuestions: Array<{ text: string; partner_text?: string; intensity: number; inverse_pair_id?: string | null }>) => {
// Bulk insert AI-generated questions with inverse_of linking
const insertQuestions = async () => {
try {
const { error } = await auditedSupabase.insert(
'questions',
generatedQuestions.map(q => ({
pack_id: packId,
text: q.text,
partner_text: q.partner_text || null,
intensity: q.intensity,
}))
);
// Group questions by inverse_pair_id
const pairMap = new Map<string, typeof generatedQuestions>();
const standaloneQuestions: typeof generatedQuestions = [];
for (const q of generatedQuestions) {
if (q.inverse_pair_id) {
const existing = pairMap.get(q.inverse_pair_id) || [];
existing.push(q);
pairMap.set(q.inverse_pair_id, existing);
} else {
standaloneQuestions.push(q);
}
}
// Insert standalone questions first (no inverse_of)
if (standaloneQuestions.length > 0) {
const { error: standaloneError } = await auditedSupabase.insert(
'questions',
standaloneQuestions.map(q => ({
pack_id: packId,
text: q.text,
partner_text: q.partner_text || null,
intensity: q.intensity,
inverse_of: null,
}))
);
if (standaloneError) throw standaloneError;
}
// Insert paired questions: primary first, then inverse with inverse_of link
for (const [, pair] of pairMap) {
if (pair.length >= 2) {
// First question is primary (inverse_of = NULL)
const primary = pair[0];
const { data: primaryData, error: primaryError } = await auditedSupabase.insert(
'questions',
[{
pack_id: packId,
text: primary.text,
partner_text: primary.partner_text || null,
intensity: primary.intensity,
inverse_of: null,
}]
);
if (primaryError) throw primaryError;
// Second question is inverse (inverse_of = primary's id)
const primaryId = primaryData?.[0]?.id;
if (primaryId) {
const inverse = pair[1];
const { error: inverseError } = await auditedSupabase.insert(
'questions',
[{
pack_id: packId,
text: inverse.text,
partner_text: inverse.partner_text || null,
intensity: inverse.intensity,
inverse_of: primaryId,
}]
);
if (inverseError) throw inverseError;
}
// Handle any additional questions in the pair (shouldn't happen, but just in case)
for (let i = 2; i < pair.length; i++) {
const extra = pair[i];
const { error: extraError } = await auditedSupabase.insert(
'questions',
[{
pack_id: packId,
text: extra.text,
partner_text: extra.partner_text || null,
intensity: extra.intensity,
inverse_of: null,
}]
);
if (extraError) throw extraError;
}
} else if (pair.length === 1) {
// Single question with pair_id but no pair - treat as standalone
const { error } = await auditedSupabase.insert(
'questions',
[{
pack_id: packId,
text: pair[0].text,
partner_text: pair[0].partner_text || null,
intensity: pair[0].intensity,
inverse_of: null,
}]
);
if (error) throw error;
}
}
if (error) throw error;
toast.success(`${generatedQuestions.length} questions added`);
fetchData();
} catch (error) {
@@ -361,6 +497,13 @@ export function QuestionsPage() {
}
};
const handlePeekPrimary = (question: Question) => {
if (!question.inverse_of) return;
setPeekPrimary(primaryQuestionById.get(question.inverse_of) ?? null);
setPeekInverse(question);
setPeekOpen(true);
};
if (loading) {
return (
<div className="space-y-6">
@@ -505,6 +648,40 @@ export function QuestionsPage() {
</p>
</div>
<div className="space-y-2">
<div className="flex items-center gap-2">
<Label htmlFor="inverse_of">Inverse Of (optional)</Label>
<Badge variant="outline" className="text-xs">
<Link2 className="h-3 w-3 mr-1" />
Paired
</Badge>
</div>
<Select
value={formData.inverse_of || 'none'}
onValueChange={(value) => setFormData(d => ({ ...d, inverse_of: value === 'none' ? '' : value }))}
>
<SelectTrigger>
<SelectValue placeholder="Select primary question..." />
</SelectTrigger>
<SelectContent className="max-h-60">
<SelectItem value="none">
<span className="text-muted-foreground">None (this is a standalone question)</span>
</SelectItem>
{allPackQuestions
.filter(q => q.id !== editingQuestion?.id && !q.inverse_of)
.map(q => (
<SelectItem key={q.id} value={q.id}>
<span className="line-clamp-1">{q.text}</span>
</SelectItem>
))}
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
Link this question to its inverse (e.g., "give X" → "receive X"). The selected question is the primary; this one becomes its inverse.
Only standalone questions can be selected as primaries.
</p>
</div>
<div className="space-y-2">
<Label>Target Couples (optional)</Label>
<div className="flex flex-wrap gap-2">
@@ -647,6 +824,33 @@ export function QuestionsPage() {
onUpdated={fetchData}
/>
<Dialog open={peekOpen} onOpenChange={setPeekOpen}>
<DialogContent className="max-w-xl">
<DialogHeader>
<DialogTitle>Primary Question</DialogTitle>
<DialogDescription>
Quick peek for the inverse question link.
</DialogDescription>
</DialogHeader>
<div className="space-y-4">
<div className="space-y-1">
<p className="text-sm font-medium">Primary</p>
<p className="text-sm text-muted-foreground whitespace-pre-wrap">
{peekPrimary?.text || 'Primary question not found.'}
</p>
</div>
{peekInverse && (
<div className="space-y-1">
<p className="text-sm font-medium">Inverse</p>
<p className="text-sm text-muted-foreground whitespace-pre-wrap">
{peekInverse.text}
</p>
</div>
)}
</div>
</DialogContent>
</Dialog>
{/* Questions Table */}
{
questions.length === 0 ? (
@@ -681,6 +885,7 @@ export function QuestionsPage() {
</TableHead>
<TableHead className="w-12">#</TableHead>
<TableHead>Question</TableHead>
<TableHead className="w-20">Inverse</TableHead>
<TableHead className="w-32">Partner Text</TableHead>
<TableHead className="w-24">Couples</TableHead>
<TableHead className="w-24">Initiator</TableHead>
@@ -707,6 +912,33 @@ export function QuestionsPage() {
<TableCell>
<span className="line-clamp-2">{question.text}</span>
</TableCell>
<TableCell>
{question.inverse_of ? (
<div className="flex items-center gap-2">
<Badge variant="outline" className="text-xs border-blue-500 text-blue-500" title="This is an inverse of another question">
<Link2 className="h-3 w-3 mr-1" />
Inverse
</Badge>
<Button
variant="ghost"
size="icon"
className="h-6 w-6"
onClick={() => handlePeekPrimary(question)}
aria-label="Peek primary question"
title="Peek primary question"
>
<Eye className="h-3 w-3" />
</Button>
</div>
) : questions.some(q => q.inverse_of === question.id) ? (
<Badge variant="outline" className="text-xs border-green-500 text-green-500" title="This question has an inverse">
<Link2 className="h-3 w-3 mr-1" />
Primary
</Badge>
) : (
<span className="text-muted-foreground text-xs">—</span>
)}
</TableCell>
<TableCell>
{question.partner_text ? (
<Badge variant="secondary" className="text-xs">
+77 -1
View File
@@ -145,24 +145,100 @@ export async function restoreQuestion(id: string): Promise<void> {
/**
* Bulk create questions (for AI generation)
* Handles inverse_pair_id by grouping pairs and setting inverse_of links
*/
export async function bulkCreateQuestions(
packId: string,
questions: Array<{ text: string; partner_text?: string; intensity: number }>
questions: Array<{ text: string; partner_text?: string; intensity: number; inverse_pair_id?: string | null }>
): Promise<Question[]> {
const results: Question[] = [];
// Group questions by inverse_pair_id
const pairMap = new Map<string, typeof questions>();
const standaloneQuestions: typeof questions = [];
for (const q of questions) {
if (q.inverse_pair_id) {
const existing = pairMap.get(q.inverse_pair_id) || [];
existing.push(q);
pairMap.set(q.inverse_pair_id, existing);
} else {
standaloneQuestions.push(q);
}
}
// Insert standalone questions first
for (const q of standaloneQuestions) {
const { data, error } = await auditedSupabase.insert('questions', {
pack_id: packId,
text: q.text,
partner_text: q.partner_text || null,
intensity: q.intensity,
inverse_of: null,
});
if (error) throw error;
if (data && data.length > 0) results.push(data[0] as Question);
}
// Insert paired questions: primary first, then inverse with inverse_of link
for (const [, pair] of pairMap) {
if (pair.length >= 2) {
// First question is primary
const primary = pair[0];
const { data: primaryData, error: primaryError } = await auditedSupabase.insert('questions', {
pack_id: packId,
text: primary.text,
partner_text: primary.partner_text || null,
intensity: primary.intensity,
inverse_of: null,
});
if (primaryError) throw primaryError;
if (primaryData && primaryData.length > 0) {
results.push(primaryData[0] as Question);
const primaryId = primaryData[0].id;
// Second question is inverse
const inverse = pair[1];
const { data: inverseData, error: inverseError } = await auditedSupabase.insert('questions', {
pack_id: packId,
text: inverse.text,
partner_text: inverse.partner_text || null,
intensity: inverse.intensity,
inverse_of: primaryId,
});
if (inverseError) throw inverseError;
if (inverseData && inverseData.length > 0) results.push(inverseData[0] as Question);
}
// Handle any additional questions in the pair
for (let i = 2; i < pair.length; i++) {
const extra = pair[i];
const { data, error } = await auditedSupabase.insert('questions', {
pack_id: packId,
text: extra.text,
partner_text: extra.partner_text || null,
intensity: extra.intensity,
inverse_of: null,
});
if (error) throw error;
if (data && data.length > 0) results.push(data[0] as Question);
}
} else if (pair.length === 1) {
// Single question with pair_id but no pair
const { data, error } = await auditedSupabase.insert('questions', {
pack_id: packId,
text: pair[0].text,
partner_text: pair[0].partner_text || null,
intensity: pair[0].intensity,
inverse_of: null,
});
if (error) throw error;
if (data && data.length > 0) results.push(data[0] as Question);
}
}
return results;
}
+2
View File
@@ -67,6 +67,8 @@ export interface Question {
intensity: 1 | 2 | 3 | 4 | 5;
allowed_couple_genders?: string[] | null;
target_user_genders?: string[] | null;
/** References the primary question that this is an inverse of (e.g., give vs receive). NULL means this is a primary/standalone question. */
inverse_of?: string | null;
created_at: string;
}
@@ -0,0 +1,45 @@
-- Add inverse_of column to questions table
-- This allows tracking when questions are inverses of each other
-- (e.g., "Do you want to give X?" and "Do you want to receive X?")
-- The "primary" question has inverse_of = NULL
-- The "secondary" (inverse) question points to its primary
-- Add the column
ALTER TABLE questions
ADD COLUMN inverse_of UUID REFERENCES questions(id) ON DELETE SET NULL;
-- Add a comment to document the column
COMMENT ON COLUMN questions.inverse_of IS 'References the primary question that this question is an inverse of. Used to track question pairs (e.g., give/receive). Primary questions have inverse_of = NULL, secondary questions point to their primary.';
-- Create an index for efficient lookups
CREATE INDEX idx_questions_inverse_of ON questions(inverse_of) WHERE inverse_of IS NOT NULL;
-- Create a function to get unique question count for a pack
-- Unique count = questions that are NOT inverses of another question (i.e., inverse_of IS NULL)
CREATE OR REPLACE FUNCTION get_pack_unique_question_count(pack_uuid UUID)
RETURNS INTEGER
LANGUAGE SQL
STABLE
AS $$
SELECT COUNT(*)::INTEGER
FROM questions
WHERE pack_id = pack_uuid
AND inverse_of IS NULL
AND deleted_at IS NULL;
$$;
-- Grant execute permission to authenticated users
GRANT EXECUTE ON FUNCTION get_pack_unique_question_count(UUID) TO authenticated;
-- Create a view to get pack stats including both total and unique counts
CREATE OR REPLACE VIEW pack_question_stats AS
SELECT
pack_id,
COUNT(*) FILTER (WHERE deleted_at IS NULL) AS total_questions,
COUNT(*) FILTER (WHERE inverse_of IS NULL AND deleted_at IS NULL) AS unique_questions,
COUNT(*) FILTER (WHERE inverse_of IS NOT NULL AND deleted_at IS NULL) AS inverse_questions
FROM questions
GROUP BY pack_id;
-- Grant select on the view
GRANT SELECT ON pack_question_stats TO authenticated;
@@ -0,0 +1,42 @@
-- Add indexes for unindexed foreign keys
-- These improve JOIN and DELETE performance
CREATE INDEX IF NOT EXISTS idx_admin_users_created_by ON public.admin_users(created_by);
CREATE INDEX IF NOT EXISTS idx_ai_config_updated_by ON public.ai_config(updated_by);
CREATE INDEX IF NOT EXISTS idx_app_config_updated_by ON public.app_config(updated_by);
CREATE INDEX IF NOT EXISTS idx_code_redemptions_user_id ON public.code_redemptions(user_id);
CREATE INDEX IF NOT EXISTS idx_couple_packs_pack_id ON public.couple_packs(pack_id);
CREATE INDEX IF NOT EXISTS idx_dare_messages_sender_id ON public.dare_messages(sender_id);
CREATE INDEX IF NOT EXISTS idx_matches_question_id ON public.matches(question_id);
CREATE INDEX IF NOT EXISTS idx_message_reports_reporter_id ON public.message_reports(reporter_id);
CREATE INDEX IF NOT EXISTS idx_message_reports_reviewed_by ON public.message_reports(reviewed_by);
CREATE INDEX IF NOT EXISTS idx_messages_match_id ON public.messages(match_id);
CREATE INDEX IF NOT EXISTS idx_messages_user_id ON public.messages(user_id);
CREATE INDEX IF NOT EXISTS idx_redemption_codes_created_by ON public.redemption_codes(created_by);
CREATE INDEX IF NOT EXISTS idx_responses_question_id ON public.responses(question_id);
CREATE INDEX IF NOT EXISTS idx_sent_dares_dare_id ON public.sent_dares(dare_id);
-- Drop unused indexes (identified by Supabase advisor as never used)
-- These are just consuming storage with no benefit
DROP INDEX IF EXISTS public.idx_feedback_type;
DROP INDEX IF EXISTS public.idx_feedback_status;
DROP INDEX IF EXISTS public.idx_subscriptions_expires_at;
DROP INDEX IF EXISTS public.idx_webhook_events_event_id;
DROP INDEX IF EXISTS public.idx_audit_logs_record_id;
DROP INDEX IF EXISTS public.idx_audit_logs_action;
DROP INDEX IF EXISTS public.idx_pack_topics_topic_id;
DROP INDEX IF EXISTS public.idx_feature_interests_feature_name;
DROP INDEX IF EXISTS public.idx_profiles_couple_id_public_key;
DROP INDEX IF EXISTS public.idx_messages_deleted_at;
DROP INDEX IF EXISTS public.idx_message_reports_created;
DROP INDEX IF EXISTS public.idx_dare_packs_visibility;
DROP INDEX IF EXISTS public.idx_dares_pack_id;
DROP INDEX IF EXISTS public.idx_dares_intensity;
DROP INDEX IF EXISTS public.idx_sent_dares_sender_id;
DROP INDEX IF EXISTS public.idx_sent_dares_recipient_id;
DROP INDEX IF EXISTS public.idx_sent_dares_status;
DROP INDEX IF EXISTS public.idx_sent_dares_expires_at;
DROP INDEX IF EXISTS public.idx_dare_messages_sent_dare_id;
DROP INDEX IF EXISTS public.idx_dare_messages_created_at;
DROP INDEX IF EXISTS public.idx_questions_deleted_at;
File diff suppressed because it is too large. Load diff
+796
View File
@@ -0,0 +1,796 @@
# Missing Inverse Pairs - Review Document
This document lists all asymmetric questions that are missing their inverse pair.
For each question, the **inverse** would swap the `text` and `partner_text` fields,
allowing both partners to experience both roles.
## Summary
- **Total missing inverses:** 607
- **Categories affected:** 10
- **Packs affected:** 28
## How Inverse Pairs Work
For an asymmetric question like:
```
text: "Spank your partner"
partner_text: "Be spanked by your partner"
```
The inverse would be:
```
text: "Be spanked by your partner"
partner_text: "Spank your partner"
```
This ensures both partners get asked about both roles.
---
# Adventure & Travel (1 missing)
## ✨ Food & Culture (1 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Cook a traditional dish from your partner's heritage | Teach your partner to cook a dish from your heritage | 1 | text: "Teach your partner to cook a dish from your heritage" / partner: "Cook a traditional dish from your partner's heritage" |
# Bedroom Adventures (40 missing)
## 🔞 Intimate Games (3 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Take turns being the 'sex instructor' giving commands | Follow your partner's commands as they instruct | 4 | text: "Follow your partner's commands as they instruct" / partner: "Take turns being the 'sex instructor' giving commands" |
| 2 | Blindfold your partner and have them guess what you're doing | Be blindfolded and guess what your partner is doing | 4 | text: "Be blindfolded and guess what your partner is doing" / partner: "Blindfold your partner and have them guess what you're doing" |
| 3 | Use a timer and give your partner pleasure for exactly 5 minutes | Receive exactly 5 minutes of pleasure from your partner | 4 | text: "Receive exactly 5 minutes of pleasure from your partner" / partner: "Use a timer and give your partner pleasure for exactly 5 minutes" |
## 🔞 Position Exploration (10 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Have sex in missionary with a pillow under your partner's hips | Have sex in missionary with a pillow under your hips | 4 | text: "Have sex in missionary with a pillow under your hips" / partner: "Have sex in missionary with a pillow under your partner's hips" |
| 2 | Let your partner choose three sex positions for tonight | Choose three sex positions for tonight | 3 | text: "Choose three sex positions for tonight" / partner: "Let your partner choose three sex positions for tonight" |
| 3 | Have sex with your partner bent over furniture | Be bent over furniture while your partner has sex with you | 4 | text: "Be bent over furniture while your partner has sex with you" / partner: "Have sex with your partner bent over furniture" |
| 4 | Lift your partner while having sex | Be lifted by your partner while having sex | 4 | text: "Be lifted by your partner while having sex" / partner: "Lift your partner while having sex" |
| 5 | Have sex with your partner on top facing you | Ride your partner facing them | 5 | text: "Ride your partner facing them" / partner: "Have sex with your partner on top facing you" |
| 6 | Have sex with your partner's legs on your shoulders | Have sex with your legs on your partner's shoulders | 4 | text: "Have sex with your legs on your partner's shoulders" / partner: "Have sex with your partner's legs on your shoulders" |
| 7 | Have sex with your partner's ankles by their ears | Have sex with your ankles by your ears | 4 | text: "Have sex with your ankles by your ears" / partner: "Have sex with your partner's ankles by their ears" |
| 8 | Have your partner wrap their legs around you during sex | Wrap your legs around your partner during sex | 4 | text: "Wrap your legs around your partner during sex" / partner: "Have your partner wrap their legs around you during sex" |
| 9 | Perform oral while your partner is seated | Receive oral while seated | 3 | text: "Receive oral while seated" / partner: "Perform oral while your partner is seated" |
| 10 | Have sex in a chair with your partner in your lap | Have sex in your partner's lap while sitting in a chair | 4 | text: "Have sex in your partner's lap while sitting in a chair" / partner: "Have sex in a chair with your partner in your lap" |
## 🔞 Sensory Play (27 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Apply menthol or tingling lube to sensitive areas | Have tingling lube applied to sensitive areas | 4 | text: "Have tingling lube applied to sensitive areas" / partner: "Apply menthol or tingling lube to sensitive areas" |
| 2 | Use noise-canceling headphones and surprise your partner | Wear headphones and be surprised | 4 | text: "Wear headphones and be surprised" / partner: "Use noise-canceling headphones and surprise your partner" |
| 3 | Kiss your partner everywhere while they keep their eyes closed | Keep your eyes closed while being kissed everywhere | 4 | text: "Keep your eyes closed while being kissed everywhere" / partner: "Kiss your partner everywhere while they keep their eyes closed" |
| 4 | Trace words or patterns on your partner's back and have them guess | Guess what your partner is tracing on your back | 3 | text: "Guess what your partner is tracing on your back" / partner: "Trace words or patterns on your partner's back and have them guess" |
| 5 | Use a pinwheel or scratchy texture on your partner's skin | Feel a pinwheel or scratchy texture on your skin | 4 | text: "Feel a pinwheel or scratchy texture on your skin" / partner: "Use a pinwheel or scratchy texture on your partner's skin" |
| 6 | Blindfold your partner and use only your tongue | Be blindfolded while your partner uses only their tongue | 4 | text: "Be blindfolded while your partner uses only their tongue" / partner: "Blindfold your partner and use only your tongue" |
| 7 | Cover your partner's body in whipped cream and lick it off | Have whipped cream licked off your body | 4 | text: "Have whipped cream licked off your body" / partner: "Cover your partner's body in whipped cream and lick it off" |
| 8 | Use your hair to tickle and tease your partner | Be tickled and teased with your partner's hair | 3 | text: "Be tickled and teased with your partner's hair" / partner: "Use your hair to tickle and tease your partner" |
| 9 | Apply ice to your lips before kissing your partner everywhere | Be kissed everywhere with cold lips | 4 | text: "Be kissed everywhere with cold lips" / partner: "Apply ice to your lips before kissing your partner everywhere" |
| 10 | Use a vibrator on your partner while they're blindfolded | Experience a vibrator while blindfolded | 4 | text: "Experience a vibrator while blindfolded" / partner: "Use a vibrator on your partner while they're blindfolded" |
| 11 | Cover your partner's eyes and whisper dirty talk | Have your eyes covered while hearing dirty talk | 4 | text: "Have your eyes covered while hearing dirty talk" / partner: "Cover your partner's eyes and whisper dirty talk" |
| 12 | Use different textures on your partner's skin during foreplay | Experience different textures during foreplay | 4 | text: "Experience different textures during foreplay" / partner: "Use different textures on your partner's skin during foreplay" |
| 13 | Drip candle wax on your partner (massage candle) | Have massage candle wax dripped on you | 4 | text: "Have massage candle wax dripped on you" / partner: "Drip candle wax on your partner (massage candle)" |
| 14 | Use a blindfold and have your partner guess what toy you're using | Guess what toy is being used on you while blindfolded | 4 | text: "Guess what toy is being used on you while blindfolded" / partner: "Use a blindfold and have your partner guess what toy you're using" |
| 15 | Use silk scarves to restrain your partner lightly | Be lightly restrained with silk scarves | 5 | text: "Be lightly restrained with silk scarves" / partner: "Use silk scarves to restrain your partner lightly" |
| 16 | Blindfold your partner and feed them aphrodisiacs | Be blindfolded and fed aphrodisiacs | 3 | text: "Be blindfolded and fed aphrodisiacs" / partner: "Blindfold your partner and feed them aphrodisiacs" |
| 17 | Use a wartenberg wheel on your partner's skin | Have a wartenberg wheel used on your skin | 4 | text: "Have a wartenberg wheel used on your skin" / partner: "Use a wartenberg wheel on your partner's skin" |
| 18 | Use flavored lube and let your partner guess the flavor | Guess the flavor of lube your partner is using | 4 | text: "Guess the flavor of lube your partner is using" / partner: "Use flavored lube and let your partner guess the flavor" |
| 19 | Put earplugs in your partner and surprise them with touch | Wear earplugs and be surprised by touch | 4 | text: "Wear earplugs and be surprised by touch" / partner: "Put earplugs in your partner and surprise them with touch" |
| 20 | Use a feather to tease your partner's most sensitive areas | Be teased with a feather on your sensitive areas | 4 | text: "Be teased with a feather on your sensitive areas" / partner: "Use a feather to tease your partner's most sensitive areas" |
| 21 | Drip warm massage oil on your partner | Have warm oil dripped on your body | 4 | text: "Have warm oil dripped on your body" / partner: "Drip warm massage oil on your partner" |
| 22 | Use ice on your partner's body during foreplay | Have ice used on your body during foreplay | 4 | text: "Have ice used on your body during foreplay" / partner: "Use ice on your partner's body during foreplay" |
| 23 | Blindfold your partner during sex | Be blindfolded during sex | 5 | text: "Be blindfolded during sex" / partner: "Blindfold your partner during sex" |
| 24 | Use a fur mitt or soft glove during foreplay | Experience fur or soft glove during foreplay | 3 | text: "Experience fur or soft glove during foreplay" / partner: "Use a fur mitt or soft glove during foreplay" |
| 25 | Blindfold your partner in the shower and wash them sensually | Be blindfolded in the shower and washed sensually | 4 | text: "Be blindfolded in the shower and washed sensually" / partner: "Blindfold your partner in the shower and wash them sensually" |
| 26 | Tie your partner's hands loosely and tease them | Have your hands tied loosely and be teased | 5 | text: "Have your hands tied loosely and be teased" / partner: "Tie your partner's hands loosely and tease them" |
| 27 | Use your breath to create sensations on your partner's body | Feel your partner's breath creating sensations | 4 | text: "Feel your partner's breath creating sensations" / partner: "Use your breath to create sensations on your partner's body" |
# Fantasy Exploration (46 missing)
## 🔞 Dream Scenarios (4 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Share a fantasy about your partner surprising you sexually | Share a fantasy about surprising your partner sexually | 4 | text: "Share a fantasy about surprising your partner sexually" / partner: "Share a fantasy about your partner surprising you sexually" |
| 2 | Share your biggest sexual fantasy with your partner | Hear your partner's biggest sexual fantasy | 4 | text: "Hear your partner's biggest sexual fantasy" / partner: "Share your biggest sexual fantasy with your partner" |
| 3 | Share a fantasy about seducing your partner | Share a fantasy about being seduced | 3 | text: "Share a fantasy about being seduced" / partner: "Share a fantasy about seducing your partner" |
| 4 | Describe a scenario where you worship your partner's body | Describe a scenario where your body is worshipped | 4 | text: "Describe a scenario where your body is worshipped" / partner: "Describe a scenario where you worship your partner's body" |
## 🔞 Language Exploration (14 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Degrade your partner with dirty talk | Be sexually degraded by your partner's dirty talk | 5 | text: "Be sexually degraded by your partner's dirty talk" / partner: "Degrade your partner with dirty talk" |
| 2 | Use praise like 'good girl' or 'good boy' on your partner | Be praised as a 'good girl' or 'good boy' by your partner | 3 | text: "Be praised as a 'good girl' or 'good boy' by your partner" / partner: "Use praise like 'good girl' or 'good boy' on your partner" |
| 3 | Make your partner call you 'Daddy' | Let your partner make you call them 'Daddy' | 5 | text: "Let your partner make you call them 'Daddy'" / partner: "Make your partner call you 'Daddy'" |
| 4 | Dictate captions for your partner's nude poses | Pose for nudes while your partner dictates the captions | 4 | text: "Pose for nudes while your partner dictates the captions" / partner: "Dictate captions for your partner's nude poses" |
| 5 | Narrate graphic fantasies while edging your partner | Be edged while listening to your partner's graphic fantasies | 5 | text: "Be edged while listening to your partner's graphic fantasies" / partner: "Narrate graphic fantasies while edging your partner" |
| 6 | Make your partner beg for release | Beg your partner for permission to cum | 5 | text: "Beg your partner for permission to cum" / partner: "Make your partner beg for release" |
| 7 | Whisper vivid descriptions of your partner’s physical submission | Listen to your partner describe your body's total surrender | 4 | text: "Listen to your partner describe your body's total surrender" / partner: "Whisper vivid descriptions of your partner’s physical submission" |
| 8 | Whisper forbidden fantasies into your partner's ear | Listen to your partner's darkest desires | 3 | text: "Listen to your partner's darkest desires" / partner: "Whisper forbidden fantasies into your partner's ear" |
| 9 | Describe your partner's body in explicit detail | Have your body described in explicit detail by your partner | 3 | text: "Have your body described in explicit detail by your partner" / partner: "Describe your partner's body in explicit detail" |
| 10 | Correct your partner’s language using physical discipline | Receive physical correction for using the wrong words | 5 | text: "Receive physical correction for using the wrong words" / partner: "Correct your partner’s language using physical discipline" |
| 11 | Use a ball gag to silence your partner's protests | Experience being silenced and controlled with a ball gag | 5 | text: "Experience being silenced and controlled with a ball gag" / partner: "Use a ball gag to silence your partner's protests" |
| 12 | Narrate exactly how you will fuck your partner | Listen to your partner's detailed fucking plan | 4 | text: "Listen to your partner's detailed fucking plan" / partner: "Narrate exactly how you will fuck your partner" |
| 13 | Record a dirty voice memo of your explicit plans for your partner | Receive a dirty voice memo detailing your partner's explicit plans | 3 | text: "Receive a dirty voice memo detailing your partner's explicit plans" / partner: "Record a dirty voice memo of your explicit plans for your partner" |
| 14 | Describe your partner's taste in graphic detail | Listen to your partner describe your taste | 4 | text: "Listen to your partner describe your taste" / partner: "Describe your partner's taste in graphic detail" |
## 🔞 Role Play Ideas (3 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Act out being seduced by a mysterious stranger | Act out seducing someone as a mysterious stranger | 4 | text: "Act out seducing someone as a mysterious stranger" / partner: "Act out being seduced by a mysterious stranger" |
| 2 | Role play as a stripper giving a private dance | Role play as someone receiving a private dance | 4 | text: "Role play as someone receiving a private dance" / partner: "Role play as a stripper giving a private dance" |
| 3 | Role play as a doctor giving an examination | Role play as a patient getting an examination | 5 | text: "Role play as a patient getting an examination" / partner: "Role play as a doctor giving an examination" |
## 🔞 Secret Desires (25 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Tell your partner what you want them to do more often | Hear what your partner wants you to do more often | 2 | text: "Hear what your partner wants you to do more often" / partner: "Tell your partner what you want them to do more often" |
| 2 | Confess a desire you've been too shy to mention | Hear a desire your partner has been too shy to mention | 3 | text: "Hear a desire your partner has been too shy to mention" / partner: "Confess a desire you've been too shy to mention" |
| 3 | Share a sexual 'bucket list' experience you want to have | Hear a sexual 'bucket list' experience your partner wants | 3 | text: "Hear a sexual 'bucket list' experience your partner wants" / partner: "Share a sexual 'bucket list' experience you want to have" |
| 4 | Reveal what you secretly want to hear during sex | Learn what your partner wants to hear during sex | 3 | text: "Learn what your partner wants to hear during sex" / partner: "Reveal what you secretly want to hear during sex" |
| 5 | Share a fantasy involving voyeurism | Hear your partner's fantasy about being watched or watching | 3 | text: "Hear your partner's fantasy about being watched or watching" / partner: "Share a fantasy involving voyeurism" |
| 6 | Describe what you want to say or hear during dirty talk | Hear what your partner wants to say or hear during dirty talk | 3 | text: "Hear what your partner wants to say or hear during dirty talk" / partner: "Describe what you want to say or hear during dirty talk" |
| 7 | Describe a specific fantasy involving oral sex | Hear your partner's fantasy about giving or receiving oral | 3 | text: "Hear your partner's fantasy about giving or receiving oral" / partner: "Describe a specific fantasy involving oral sex" |
| 8 | Describe your desire for slow, gentle lovemaking | Hear your partner's desire for slow, gentle lovemaking | 2 | text: "Hear your partner's desire for slow, gentle lovemaking" / partner: "Describe your desire for slow, gentle lovemaking" |
| 9 | Share a fantasy involving exhibitionism | Hear your partner's fantasy about being seen | 3 | text: "Hear your partner's fantasy about being seen" / partner: "Share a fantasy involving exhibitionism" |
| 10 | Share what you fantasize about while masturbating | Hear what your partner fantasizes about while masturbating | 3 | text: "Hear what your partner fantasizes about while masturbating" / partner: "Share what you fantasize about while masturbating" |
| 11 | Describe your desire for rougher sex | Hear your partner's desire for rougher sex | 3 | text: "Hear your partner's desire for rougher sex" / partner: "Describe your desire for rougher sex" |
| 12 | Describe your hottest sexual fantasy involving your partner | Hear your partner's hottest sexual fantasy about you | 3 | text: "Hear your partner's hottest sexual fantasy about you" / partner: "Describe your hottest sexual fantasy involving your partner" |
| 13 | Share a desire about how you want to be touched | Learn how your partner wants to be touched | 4 | text: "Learn how your partner wants to be touched" / partner: "Share a desire about how you want to be touched" |
| 14 | Share a secret turn-on that might surprise your partner | Learn a secret turn-on from your partner | 4 | text: "Learn a secret turn-on from your partner" / partner: "Share a secret turn-on that might surprise your partner" |
| 15 | Tell your partner the one thing that would make sex perfect | Hear what would make sex perfect for your partner | 4 | text: "Hear what would make sex perfect for your partner" / partner: "Tell your partner the one thing that would make sex perfect" |
| 16 | Explain your desire to be the submissive one | Hear about your partner's desire to be submissive | 3 | text: "Hear about your partner's desire to be submissive" / partner: "Explain your desire to be the submissive one" |
| 17 | Describe the type of porn that turns you on | Hear about the porn that turns your partner on | 3 | text: "Hear about the porn that turns your partner on" / partner: "Describe the type of porn that turns you on" |
| 18 | Describe a taboo fantasy that excites you | Hear about a taboo fantasy that excites your partner | 3 | text: "Hear about a taboo fantasy that excites your partner" / partner: "Describe a taboo fantasy that excites you" |
| 19 | Reveal a kink you're curious about exploring | Hear about a kink your partner wants to explore | 3 | text: "Hear about a kink your partner wants to explore" / partner: "Reveal a kink you're curious about exploring" |
| 20 | Describe your desire to be worshipped in bed | Hear about your partner's desire to be worshipped | 3 | text: "Hear about your partner's desire to be worshipped" / partner: "Describe your desire to be worshipped in bed" |
| 21 | Reveal a location where you want to have sex | Hear where your partner secretly wants to have sex | 3 | text: "Hear where your partner secretly wants to have sex" / partner: "Reveal a location where you want to have sex" |
| 22 | Explain your desire to be the dominant one | Hear about your partner's desire to be dominant | 3 | text: "Hear about your partner's desire to be dominant" / partner: "Explain your desire to be the dominant one" |
| 23 | Share a desire to have sex multiple times in one day | Hear your partner's desire for multiple rounds of sex | 3 | text: "Hear your partner's desire for multiple rounds of sex" / partner: "Share a desire to have sex multiple times in one day" |
| 24 | Describe your ultimate sexual fantasy | Hear your partner's ultimate sexual fantasy in detail | 3 | text: "Hear your partner's ultimate sexual fantasy in detail" / partner: "Describe your ultimate sexual fantasy" |
| 25 | Describe a fantasy involving teasing and denial | Hear your partner's fantasy about teasing and denial | 3 | text: "Hear your partner's fantasy about teasing and denial" / partner: "Describe a fantasy involving teasing and denial" |
# Getting Started (5 missing)
## 🔞 Know Your Limits (5 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Wear a butt plug during sex | Have your partner wear a butt plug during sex | 4 | text: "Have your partner wear a butt plug during sex" / partner: "Wear a butt plug during sex" |
| 2 | Swallow when giving your partner oral | Have your partner swallow | 4 | text: "Have your partner swallow" / partner: "Swallow when giving your partner oral" |
| 3 | Deep throat your partner | Have your partner deep throat you | 4 | text: "Have your partner deep throat you" / partner: "Deep throat your partner" |
| 4 | Have your partner cum inside you | Cum inside your partner | 4 | text: "Cum inside your partner" / partner: "Have your partner cum inside you" |
| 5 | Have your partner cum on your body | Cum on your partner's body | 4 | text: "Cum on your partner's body" / partner: "Have your partner cum on your body" |
# Long Distance (106 missing)
## ✨ Missing You (30 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Send a photo of your hand and say you wish you were holding theirs | Receive a sweet reminder of how much your partner wants to hold you | 1 | text: "Receive a sweet reminder of how much your partner wants to hold you" / partner: "Send a photo of your hand and say you wish you were holding theirs" |
| 2 | Tell your partner you saw someone who reminded you of them | Hear how often your partner has you on their mind | 1 | text: "Hear how often your partner has you on their mind" / partner: "Tell your partner you saw someone who reminded you of them" |
| 3 | Tell your partner what you'd be doing right now if they were there | Hear what your partner wishes you were doing together | 2 | text: "Hear what your partner wishes you were doing together" / partner: "Tell your partner what you'd be doing right now if they were there" |
| 4 | Send a tipsy voice note telling them you miss them | Get a slightly drunk "I miss you" message | 2 | text: "Get a slightly drunk "I miss you" message" / partner: "Send a tipsy voice note telling them you miss them" |
| 5 | Send a photo of your bed and say it feels empty without them | Receive a sweet photo of your partner's bed and a message that you're missed | 2 | text: "Receive a sweet photo of your partner's bed and a message that you're missed" / partner: "Send a photo of your bed and say it feels empty without them" |
| 6 | Send a photo of an empty seat and say you saved it for them | Receive a photo of a seat saved just for you | 1 | text: "Receive a photo of a seat saved just for you" / partner: "Send a photo of an empty seat and say you saved it for them" |
| 7 | Send a lazy selfie and say you wish you were doing nothing together | Receive a lazy selfie and an invitation to do nothing together | 1 | text: "Receive a lazy selfie and an invitation to do nothing together" / partner: "Send a lazy selfie and say you wish you were doing nothing together" |
| 8 | Text your partner from an event that it would be better with them | Know your partner wishes you were there | 2 | text: "Know your partner wishes you were there" / partner: "Text your partner from an event that it would be better with them" |
| 9 | Tell your partner something small they do that you miss unexpectedly | Hear what little thing your partner misses about you | 2 | text: "Hear what little thing your partner misses about you" / partner: "Tell your partner something small they do that you miss unexpectedly" |
| 10 | FaceTime your partner just to see their face for a few minutes | Get an "I just needed to see you" call | 2 | text: "Get an "I just needed to see you" call" / partner: "FaceTime your partner just to see their face for a few minutes" |
| 11 | Tell your partner what you're counting down to about seeing them | Build excitement for the reunion | 2 | text: "Build excitement for the reunion" / partner: "Tell your partner what you're counting down to about seeing them" |
| 12 | Voice note your partner something you've been meaning to tell them | Hear something meaningful from your partner | 2 | text: "Hear something meaningful from your partner" / partner: "Voice note your partner something you've been meaning to tell them" |
| 13 | Send a voice note from bed saying you miss sleeping next to them | Hear a sleepy voice note about how much you are missed in bed | 2 | text: "Hear a sleepy voice note about how much you are missed in bed" / partner: "Send a voice note from bed saying you miss sleeping next to them" |
| 14 | Tell your partner one thing you'll do to them when you're alone | Hear exactly what your partner has planned for your next reunion | 3 | text: "Hear exactly what your partner has planned for your next reunion" / partner: "Tell your partner one thing you'll do to them when you're alone" |
| 15 | Send a mirror selfie when you are dressed up to go out | Receive a photo of your partner looking their best | 2 | text: "Receive a photo of your partner looking their best" / partner: "Send a mirror selfie when you are dressed up to go out" |
| 16 | Tell your partner what random thing reminded you of them today | Hear that random things trigger memories of you | 2 | text: "Hear that random things trigger memories of you" / partner: "Tell your partner what random thing reminded you of them today" |
| 17 | Text your partner that you caught yourself smiling at your phone because of them | Know you made your partner smile | 2 | text: "Know you made your partner smile" / partner: "Text your partner that you caught yourself smiling at your phone because of them" |
| 18 | Describe the exact way you want them to hold you when you reunite | Feel the anticipation build for their touch | 2 | text: "Feel the anticipation build for their touch" / partner: "Describe the exact way you want them to hold you when you reunite" |
| 19 | Send a sleepy morning selfie, messy hair and all | See your partner's unfiltered morning face | 2 | text: "See your partner's unfiltered morning face" / partner: "Send a sleepy morning selfie, messy hair and all" |
| 20 | Tell your partner what outfit of theirs you can't stop thinking about | Hear what look of yours drives them crazy | 2 | text: "Hear what look of yours drives them crazy" / partner: "Tell your partner what outfit of theirs you can't stop thinking about" |
| 21 | Text your partner at a party that you'd rather be home calling them | Feel chosen over a social event | 2 | text: "Feel chosen over a social event" / partner: "Text your partner at a party that you'd rather be home calling them" |
| 22 | Text your partner first thing in the morning that they were your first thought | Wake up knowing you're on their mind | 2 | text: "Wake up knowing you're on their mind" / partner: "Text your partner first thing in the morning that they were your first thought" |
| 23 | Send a photo of you wearing something of theirs | See your partner in your hoodie | 2 | text: "See your partner in your hoodie" / partner: "Send a photo of you wearing something of theirs" |
| 24 | Tell your partner about a dream you had about them | Hear you were in your partner's dreams | 2 | text: "Hear you were in your partner's dreams" / partner: "Tell your partner about a dream you had about them" |
| 25 | Send a getting-ready selfie and ask if they approve | Give your partner's outfit the seal of approval | 2 | text: "Give your partner's outfit the seal of approval" / partner: "Send a getting-ready selfie and ask if they approve" |
| 26 | Send a voice note when you're half asleep saying goodnight | Hear your partner's sleepy voice | 2 | text: "Hear your partner's sleepy voice" / partner: "Send a voice note when you're half asleep saying goodnight" |
| 27 | Tell your partner something specific about their body you've been thinking about | Hear what physical thing your partner misses | 2 | text: "Hear what physical thing your partner misses" / partner: "Tell your partner something specific about their body you've been thinking about" |
| 28 | Describe exactly how you'd greet them at the airport | Build anticipation for the reunion | 2 | text: "Build anticipation for the reunion" / partner: "Describe exactly how you'd greet them at the airport" |
| 29 | Text your partner during a boring meeting that you're thinking about them | Get a random "thinking of you" during work | 2 | text: "Get a random "thinking of you" during work" / partner: "Text your partner during a boring meeting that you're thinking about them" |
| 30 | Text your partner "wish you were here" from somewhere fun | Hear that your partner wishes you were by their side | 1 | text: "Hear that your partner wishes you were by their side" / partner: "Text your partner "wish you were here" from somewhere fun" |
## 🔞 Private Line (27 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Text your partner what you're wearing, then what you're taking off | Get a strip tease via text | 3 | text: "Get a strip tease via text" / partner: "Text your partner what you're wearing, then what you're taking off" |
| 2 | Send a post-climax photo to your partner | See your partner's glow in a post-climax photo | 4 | text: "See your partner's glow in a post-climax photo" / partner: "Send a post-climax photo to your partner" |
| 3 | Text your partner a play-by-play while you pleasure yourself | Read a play-by-play as your partner pleasures themselves | 3 | text: "Read a play-by-play as your partner pleasures themselves" / partner: "Text your partner a play-by-play while you pleasure yourself" |
| 4 | Voice note your partner while touching yourself - no words, just sounds | Hear your partner pleasure themselves | 4 | text: "Hear your partner pleasure themselves" / partner: "Voice note your partner while touching yourself - no words, just sounds" |
| 5 | Send a voice note of your release while saying their name | Hear your partner's release as they say your name | 4 | text: "Hear your partner's release as they say your name" / partner: "Send a voice note of your release while saying their name" |
| 6 | Share a secret fantasy with your partner in detail | Listen to your partner share a secret fantasy in detail | 2 | text: "Listen to your partner share a secret fantasy in detail" / partner: "Share a secret fantasy with your partner in detail" |
| 7 | Talk your partner through how to touch themselves over the phone | Let your partner guide your touch over the phone | 4 | text: "Let your partner guide your touch over the phone" / partner: "Talk your partner through how to touch themselves over the phone" |
| 8 | Send a photo from the shower thinking about your partner | See your partner wet and thinking of you | 3 | text: "See your partner wet and thinking of you" / partner: "Send a photo from the shower thinking about your partner" |
| 9 | Ask your partner for a specific photo you've been craving | Send your partner a specific photo they've been craving | 4 | text: "Send your partner a specific photo they've been craving" / partner: "Ask your partner for a specific photo you've been craving" |
| 10 | Send your partner a short video of your hand where you wish theirs was | Watch your partner touch themselves for you | 4 | text: "Watch your partner touch themselves for you" / partner: "Send your partner a short video of your hand where you wish theirs was" |
| 11 | Send your partner a video of you getting undressed | Watch your partner undress for you | 3 | text: "Watch your partner undress for you" / partner: "Send your partner a video of you getting undressed" |
| 12 | Send a photo in bed after finishing and tell them it should've been them | See your partner satisfied but wishing you were there | 4 | text: "See your partner satisfied but wishing you were there" / partner: "Send a photo in bed after finishing and tell them it should've been them" |
| 13 | Tell your partner step-by-step what you're going to do when you reunite | Hear your partner's detailed plan for your body | 3 | text: "Hear your partner's detailed plan for your body" / partner: "Tell your partner step-by-step what you're going to do when you reunite" |
| 14 | Video call and make your partner watch without touching until you say so | Be made to watch without touching yourself | 4 | text: "Be made to watch without touching yourself" / partner: "Video call and make your partner watch without touching until you say so" |
| 15 | Send a video of you in their favorite position, waiting | See your partner ready and waiting for you | 4 | text: "See your partner ready and waiting for you" / partner: "Send a video of you in their favorite position, waiting" |
| 16 | Record yourself saying exactly what you'd whisper in their ear in bed | Hear your partner's voice like they're right next to you | 3 | text: "Hear your partner's voice like they're right next to you" / partner: "Record yourself saying exactly what you'd whisper in their ear in bed" |
| 17 | Send your partner a video of you in the mirror, showing off for them | Watch your partner show off their body for you | 3 | text: "Watch your partner show off their body for you" / partner: "Send your partner a video of you in the mirror, showing off for them" |
| 18 | Describe what you're imagining while you touch yourself over text | Read your partner's thoughts while they get off to you | 4 | text: "Read your partner's thoughts while they get off to you" / partner: "Describe what you're imagining while you touch yourself over text" |
| 19 | Send a voice note telling your partner to touch themselves right now | Follow your partner's command from afar | 4 | text: "Follow your partner's command from afar" / partner: "Send a voice note telling your partner to touch themselves right now" |
| 20 | Watch the same video together over FaceTime and see who breaks first | Get turned on together from miles away | 4 | text: "Get turned on together from miles away" / partner: "Watch the same video together over FaceTime and see who breaks first" |
| 21 | Describe what position you want them in the moment you're alone together | Hear how your partner wants to have you | 3 | text: "Hear how your partner wants to have you" / partner: "Describe what position you want them in the moment you're alone together" |
| 22 | Sext your partner discreetly while you are both busy | Exchange discreet, sensual texts while you are both busy | 3 | text: "Exchange discreet, sensual texts while you are both busy" / partner: "Sext your partner discreetly while you are both busy" |
| 23 | Send a voice note describing what you'd do to your partner | Hear your partner describe what they want to do to you | 3 | text: "Hear your partner describe what they want to do to you" / partner: "Send a voice note describing what you'd do to your partner" |
| 24 | Send your partner a sensual morning text | Wake up to a sensual text from your partner | 2 | text: "Wake up to a sensual text from your partner" / partner: "Send your partner a sensual morning text" |
| 25 | Send a teasing text to build anticipation for a later call | Receive a teasing text that builds anticipation for a call | 2 | text: "Receive a teasing text that builds anticipation for a call" / partner: "Send a teasing text to build anticipation for a later call" |
| 26 | Send your partner a teasing, private photo | Receive a teasing, private photo from your partner | 3 | text: "Receive a teasing, private photo from your partner" / partner: "Send your partner a teasing, private photo" |
| 27 | Tell your partner exactly where you want their mouth when you see them | Hear where your partner wants to taste you | 2 | text: "Hear where your partner wants to taste you" / partner: "Tell your partner exactly where you want their mouth when you see them" |
## ✨ Staying Close (19 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Challenge your partner to an online board game | Be challenged to an online board game by your partner | 1 | text: "Be challenged to an online board game by your partner" / partner: "Challenge your partner to an online board game" |
| 2 | Send your partner a voice note on your commute | Get a voice note from your partner during their day | 1 | text: "Get a voice note from your partner during their day" / partner: "Send your partner a voice note on your commute" |
| 3 | Send a random photo of your current view | Receive a candid snapshot of your partner's day | 1 | text: "Receive a candid snapshot of your partner's day" / partner: "Send a random photo of your current view" |
| 4 | Send your partner a care package of their favorite snacks | Receive a snack-filled care package from your partner | 1 | text: "Receive a snack-filled care package from your partner" / partner: "Send your partner a care package of their favorite snacks" |
| 5 | Text your partner updates from a social event they'd hate | Live vicariously through your partner's obligations | 1 | text: "Live vicariously through your partner's obligations" / partner: "Text your partner updates from a social event they'd hate" |
| 6 | Make a shared note of restaurants to try when you're together | Build a list for your next visit | 1 | text: "Build a list for your next visit" / partner: "Make a shared note of restaurants to try when you're together" |
| 7 | Share your coffee order for your next visit | Learn your partner's go-to coffee order | 1 | text: "Learn your partner's go-to coffee order" / partner: "Share your coffee order for your next visit" |
| 8 | Send your partner a meme that only they would understand | Receive an inside joke from your partner | 1 | text: "Receive an inside joke from your partner" / partner: "Send your partner a meme that only they would understand" |
| 9 | Watch a live sports game or event together while texting reactions | React to something live with your partner | 1 | text: "React to something live with your partner" / partner: "Watch a live sports game or event together while texting reactions" |
| 10 | Do the same Wordle and compare results | Compete on a daily puzzle with your partner | 1 | text: "Compete on a daily puzzle with your partner" / partner: "Do the same Wordle and compare results" |
| 11 | Send your partner a song you heard that made you think of them | Get a track that reminded your partner of you | 1 | text: "Get a track that reminded your partner of you" / partner: "Send your partner a song you heard that made you think of them" |
| 12 | Screenshot something funny from your day and send it with no context | Get a random screenshot from your partner | 1 | text: "Get a random screenshot from your partner" / partner: "Screenshot something funny from your day and send it with no context" |
| 13 | Surprise your partner by ordering delivery to their house | Be surprised with a delivery meal from your partner | 1 | text: "Be surprised with a delivery meal from your partner" / partner: "Surprise your partner by ordering delivery to their house" |
| 14 | Share your location with your partner for safety | See your partner's location to know they're safe | 1 | text: "See your partner's location to know they're safe" / partner: "Share your location with your partner for safety" |
| 15 | Send a voice note venting about your day | Listen to your partner vent about their day | 1 | text: "Listen to your partner vent about their day" / partner: "Send a voice note venting about your day" |
| 16 | Video call your partner while you grocery shop | Go grocery shopping virtually with your partner | 1 | text: "Go grocery shopping virtually with your partner" / partner: "Video call your partner while you grocery shop" |
| 17 | Call your partner while you're on a walk just to chat | Take a walk with your partner over the phone | 1 | text: "Take a walk with your partner over the phone" / partner: "Call your partner while you're on a walk just to chat" |
| 18 | Send a photo of something that reminded you of an inside joke | Get a reference only you two would understand | 1 | text: "Get a reference only you two would understand" / partner: "Send a photo of something that reminded you of an inside joke" |
| 19 | Video call your partner during your lunch break | Enjoy a quick lunch date over video call | 1 | text: "Enjoy a quick lunch date over video call" / partner: "Video call your partner during your lunch break" |
## 🔞 Total Control (30 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Set rules your partner must follow until you see each other again | Follow your partner's rules until your next reunion | 5 | text: "Follow your partner's rules until your next reunion" / partner: "Set rules your partner must follow until you see each other again" |
| 2 | Make your partner edge for you on video every night for a week | Edge for your partner on camera every night until they let you finish | 5 | text: "Edge for your partner on camera every night until they let you finish" / partner: "Make your partner edge for you on video every night for a week" |
| 3 | Build a reunion list of everything you'll do when you're finally together | Add to the list of what your partner will do to you when you meet | 4 | text: "Add to the list of what your partner will do to you when you meet" / partner: "Build a reunion list of everything you'll do when you're finally together" |
| 4 | Control your partner's toy on maximum until they use your safe word | Take as much as you can until you have to tap out | 5 | text: "Take as much as you can until you have to tap out" / partner: "Control your partner's toy on maximum until they use your safe word" |
| 5 | Make your partner sleep with a plug in and send proof in the morning | Sleep with a plug and send your partner a photo when you wake up | 5 | text: "Sleep with a plug and send your partner a photo when you wake up" / partner: "Make your partner sleep with a plug in and send proof in the morning" |
| 6 | Have a session where your partner can't make a sound no matter what you do | Stay completely silent while your partner controls your toy | 5 | text: "Stay completely silent while your partner controls your toy" / partner: "Have a session where your partner can't make a sound no matter what you do" |
| 7 | Tell your partner exactly when they're allowed to finish - down to the minute | Wait until the exact moment your partner gives you permission | 5 | text: "Wait until the exact moment your partner gives you permission" / partner: "Tell your partner exactly when they're allowed to finish - down to the minute" |
| 8 | Make your partner keep a toy in while doing something mundane on video | Do a normal activity on camera while wearing a toy inside you | 4 | text: "Do a normal activity on camera while wearing a toy inside you" / partner: "Make your partner keep a toy in while doing something mundane on video" |
| 9 | Give your partner an assignment to edge a specific number of times before bed | Edge the exact number of times your partner told you to | 5 | text: "Edge the exact number of times your partner told you to" / partner: "Give your partner an assignment to edge a specific number of times before bed" |
| 10 | Control your partner's toy while they try to have a normal phone conversation with you | Try to talk normally while your partner controls your toy | 4 | text: "Try to talk normally while your partner controls your toy" / partner: "Control your partner's toy while they try to have a normal phone conversation with you" |
| 11 | Make your partner beg over text before you'll let them touch themselves | Beg your partner for permission to touch yourself | 5 | text: "Beg your partner for permission to touch yourself" / partner: "Make your partner beg over text before you'll let them touch themselves" |
| 12 | Set a time your partner must be ready and waiting on video | Be ready and waiting at the exact time your partner specified | 4 | text: "Be ready and waiting at the exact time your partner specified" / partner: "Set a time your partner must be ready and waiting on video" |
| 13 | Make your partner wear a remote toy during dinner with friends | Wear a toy at dinner while your partner teases you from afar | 5 | text: "Wear a toy at dinner while your partner teases you from afar" / partner: "Make your partner wear a remote toy during dinner with friends" |
| 14 | Have your partner send a video proving they followed your instructions | Send video evidence that you did what your partner asked | 5 | text: "Send video evidence that you did what your partner asked" / partner: "Have your partner send a video proving they followed your instructions" |
| 15 | Control your partner's toy and stop right before they finish - repeatedly | Be brought to the edge over and over without release | 5 | text: "Be brought to the edge over and over without release" / partner: "Control your partner's toy and stop right before they finish - repeatedly" |
| 16 | Make your partner use a toy on themselves while you watch and give commands | Use a toy on yourself while following your partner's instructions | 4 | text: "Use a toy on yourself while following your partner's instructions" / partner: "Make your partner use a toy on themselves while you watch and give commands" |
| 17 | Surprise your partner with a remote toy buzz during a work call | Try to keep composure while your partner surprises you mid-meeting | 4 | text: "Try to keep composure while your partner surprises you mid-meeting" / partner: "Surprise your partner with a remote toy buzz during a work call" |
| 18 | Make your partner edge themselves daily and report back to you | Edge yourself each day and send proof to your partner | 5 | text: "Edge yourself each day and send proof to your partner" / partner: "Make your partner edge themselves daily and report back to you" |
| 19 | Deny your partner for an entire day, building anticipation for the call | Go a full day without touching yourself before your partner lets you | 5 | text: "Go a full day without touching yourself before your partner lets you" / partner: "Deny your partner for an entire day, building anticipation for the call" |
| 20 | Make your partner describe every sensation while you control their toy | Narrate what you're feeling while your partner controls your toy | 4 | text: "Narrate what you're feeling while your partner controls your toy" / partner: "Make your partner describe every sensation while you control their toy" |
| 21 | Control all of your partner's pleasure for an entire video session | Give up all control and let your partner run the session | 5 | text: "Give up all control and let your partner run the session" / partner: "Control all of your partner's pleasure for an entire video session" |
| 22 | Tell your partner what to wear under their clothes for the day | Wear what your partner chose for you under your clothes | 4 | text: "Wear what your partner chose for you under your clothes" / partner: "Tell your partner what to wear under their clothes for the day" |
| 23 | Make your partner record themselves following your explicit instructions | Record yourself doing exactly what your partner tells you | 5 | text: "Record yourself doing exactly what your partner tells you" / partner: "Make your partner record themselves following your explicit instructions" |
| 24 | Count your partner's edges on video and decide when they've earned release | Count your edges out loud while your partner decides when you're done | 5 | text: "Count your edges out loud while your partner decides when you're done" / partner: "Count your partner's edges on video and decide when they've earned release" |
| 25 | Make your partner wear a plug they chose for you throughout the day | Wear a plug all day that your partner picked out | 5 | text: "Wear a plug all day that your partner picked out" / partner: "Make your partner wear a plug they chose for you throughout the day" |
| 26 | Give your partner a list of tasks to complete before your next video call | Complete tasks your partner assigns before you can call them | 5 | text: "Complete tasks your partner assigns before you can call them" / partner: "Give your partner a list of tasks to complete before your next video call" |
| 27 | Make your partner ask permission via text before they're allowed to orgasm | Ask your partner for permission before you're allowed to come | 5 | text: "Ask your partner for permission before you're allowed to come" / partner: "Make your partner ask permission via text before they're allowed to orgasm" |
| 28 | Edge your partner with a remote toy three times before letting them finish | Be edged remotely three times before your partner allows release | 5 | text: "Be edged remotely three times before your partner allows release" / partner: "Edge your partner with a remote toy three times before letting them finish" |
| 29 | Make your partner wear a remote toy while they run errands | Wear a toy in public while your partner teases you randomly | 4 | text: "Wear a toy in public while your partner teases you randomly" / partner: "Make your partner wear a remote toy while they run errands" |
| 30 | Control your partner's remote vibrator while on a video call | Wear a remote toy while your partner watches and controls it | 4 | text: "Wear a remote toy while your partner watches and controls it" / partner: "Control your partner's remote vibrator while on a video call" |
# Public Thrills (88 missing)
## 🔞 All Eyes On Us (28 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Have sex with your partner in the ocean or a lake | Have sex in the water with your partner | 5 | text: "Have sex in the water with your partner" / partner: "Have sex with your partner in the ocean or a lake" |
| 2 | Have sex on your apartment balcony | Get taken on a balcony in view of other buildings | 5 | text: "Get taken on a balcony in view of other buildings" / partner: "Have sex on your apartment balcony" |
| 3 | Have sex in a private room at a club or lounge | Sneak off to a back room and fuck at a venue | 4 | text: "Sneak off to a back room and fuck at a venue" / partner: "Have sex in a private room at a club or lounge" |
| 4 | Make your partner finish while other people are in the next room | Try not to make a sound while finishing with people nearby | 4 | text: "Try not to make a sound while finishing with people nearby" / partner: "Make your partner finish while other people are in the next room" |
| 5 | Make your partner beg for it quietly while in a public place | Beg your partner to fuck you while trying to stay quiet | 5 | text: "Beg your partner to fuck you while trying to stay quiet" / partner: "Make your partner beg for it quietly while in a public place" |
| 6 | Have sex at a beach at night when no one is around | Have sex on the sand under the stars | 5 | text: "Have sex on the sand under the stars" / partner: "Have sex at a beach at night when no one is around" |
| 7 | Have sex with your partner in front of a mirror in a semi-public place | Watch yourself have sex in a risky location | 5 | text: "Watch yourself have sex in a risky location" / partner: "Have sex with your partner in front of a mirror in a semi-public place" |
| 8 | Have sex with your partner in an Airbnb with thin walls | Have loud sex knowing the neighbors can hear | 4 | text: "Have loud sex knowing the neighbors can hear" / partner: "Have sex with your partner in an Airbnb with thin walls" |
| 9 | Have sex with your partner in a secluded part of a hiking trail | Have sex on a trail where a hiker could walk by | 5 | text: "Have sex on a trail where a hiker could walk by" / partner: "Have sex with your partner in a secluded part of a hiking trail" |
| 10 | Give your partner a handjob under a blanket on a flight | Get jerked off on a plane under a blanket | 5 | text: "Get jerked off on a plane under a blanket" / partner: "Give your partner a handjob under a blanket on a flight" |
| 11 | Have your partner go down on you in a parked car | Give road head while parked somewhere semi-private | 5 | text: "Give road head while parked somewhere semi-private" / partner: "Have your partner go down on you in a parked car" |
| 12 | Have your partner finish while sitting at a bar with a remote toy | Cum at a bar while your partner controls your toy | 5 | text: "Cum at a bar while your partner controls your toy" / partner: "Have your partner finish while sitting at a bar with a remote toy" |
| 13 | Have your partner wear a vibrator while meeting your friends | Wear a vibrator around your partner's friends while they control it | 5 | text: "Wear a vibrator around your partner's friends while they control it" / partner: "Have your partner wear a vibrator while meeting your friends" |
| 14 | Have sex in a hotel room with the curtains open at night | Get fucked with the curtains open for anyone to see | 5 | text: "Get fucked with the curtains open for anyone to see" / partner: "Have sex in a hotel room with the curtains open at night" |
| 15 | Have sex with your partner in a bathroom at a house party | Disappear at a party and come back looking suspicious | 4 | text: "Disappear at a party and come back looking suspicious" / partner: "Have sex with your partner in a bathroom at a house party" |
| 16 | Have sex with your partner in a parked car in a secluded spot | Have car sex somewhere you might get caught | 4 | text: "Have car sex somewhere you might get caught" / partner: "Have sex with your partner in a parked car in a secluded spot" |
| 17 | Make your partner moan loudly in a hotel knowing the walls are thin | Let the neighbors hear you while your partner makes you moan | 5 | text: "Let the neighbors hear you while your partner makes you moan" / partner: "Make your partner moan loudly in a hotel knowing the walls are thin" |
| 18 | Go down on your partner on a balcony at night | Receive oral on a balcony where someone could look up | 5 | text: "Receive oral on a balcony where someone could look up" / partner: "Go down on your partner on a balcony at night" |
| 19 | Make your partner finish in a semi-public bathroom | Get off in a public restroom with your partner | 4 | text: "Get off in a public restroom with your partner" / partner: "Make your partner finish in a semi-public bathroom" |
| 20 | Have sex with your partner in a hotel pool or hot tub late at night | Fool around in a hotel pool when no one else is around | 5 | text: "Fool around in a hotel pool when no one else is around" / partner: "Have sex with your partner in a hotel pool or hot tub late at night" |
| 21 | Bend your partner over in a dressing room | Get bent over in a fitting room by your partner | 5 | text: "Get bent over in a fitting room by your partner" / partner: "Bend your partner over in a dressing room" |
| 22 | Have sex with your partner against a window at night | Be taken against a window where someone could see | 5 | text: "Be taken against a window where someone could see" / partner: "Have sex with your partner against a window at night" |
| 23 | Get your partner off in the back row of an empty theater | Finish in a movie theater while your partner helps | 4 | text: "Finish in a movie theater while your partner helps" / partner: "Get your partner off in the back row of an empty theater" |
| 24 | Have your partner ride you in the driver's seat in a parking garage | Ride your partner in a parked car | 5 | text: "Ride your partner in a parked car" / partner: "Have your partner ride you in the driver's seat in a parking garage" |
| 25 | Have sex on a rooftop at night | Get fucked on a rooftop under the sky | 5 | text: "Get fucked on a rooftop under the sky" / partner: "Have sex on a rooftop at night" |
| 26 | Go down on your partner while they're on a phone call | Take a call while your partner goes down on you | 4 | text: "Take a call while your partner goes down on you" / partner: "Go down on your partner while they're on a phone call" |
| 27 | Have sex in a tent at a campsite where others might hear | Try to stay quiet while your partner fucks you in a tent | 5 | text: "Try to stay quiet while your partner fucks you in a tent" / partner: "Have sex in a tent at a campsite where others might hear" |
| 28 | Have sex in your childhood bedroom while visiting family | Fool around in your partner's family home | 4 | text: "Fool around in your partner's family home" / partner: "Have sex in your childhood bedroom while visiting family" |
## 🔞 Pushing Limits (30 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Unbutton one too many buttons on your shirt for your partner at an event | Catch your partner showing extra skin just for you | 3 | text: "Catch your partner showing extra skin just for you" / partner: "Unbutton one too many buttons on your shirt for your partner at an event" |
| 2 | Control your partner's remote toy while they order at a counter | Try to order food while your partner buzzes you | 4 | text: "Try to order food while your partner buzzes you" / partner: "Control your partner's remote toy while they order at a counter" |
| 3 | Have a quickie makeout in a hotel hallway | Make out with your partner before you even get to the room | 2 | text: "Make out with your partner before you even get to the room" / partner: "Have a quickie makeout in a hotel hallway" |
| 4 | Give your partner oral in a locked bathroom at a party | Receive oral while trying to stay quiet at an event | 5 | text: "Receive oral while trying to stay quiet at an event" / partner: "Give your partner oral in a locked bathroom at a party" |
| 5 | Make your partner wear a remote vibrator while out to dinner | Wear a vibrator at a restaurant while your partner controls it | 4 | text: "Wear a vibrator at a restaurant while your partner controls it" / partner: "Make your partner wear a remote vibrator while out to dinner" |
| 6 | Have your partner sit across from you at a bar while you describe what you'd do if you were alone | Listen to your partner describe exactly what's about to happen | 3 | text: "Listen to your partner describe exactly what's about to happen" / partner: "Have your partner sit across from you at a bar while you describe what you'd do if you were alone" |
| 7 | Press your partner against a car and kiss them before getting in | Get kissed against the car before you even leave | 3 | text: "Get kissed against the car before you even leave" / partner: "Press your partner against a car and kiss them before getting in" |
| 8 | Take your partner to a secluded spot at a park and make out | Find a hidden spot with your partner for some privacy | 3 | text: "Find a hidden spot with your partner for some privacy" / partner: "Take your partner to a secluded spot at a park and make out" |
| 9 | Kiss your partner's neck in the back of a dark venue | Feel your partner's mouth on your neck in public | 3 | text: "Feel your partner's mouth on your neck in public" / partner: "Kiss your partner's neck in the back of a dark venue" |
| 10 | Get your partner worked up in a booth at a dimly lit restaurant | Get teased in a booth where no one can see | 4 | text: "Get teased in a booth where no one can see" / partner: "Get your partner worked up in a booth at a dimly lit restaurant" |
| 11 | Make your partner sit on your lap at a bar and feel what they do to you | Sit on your partner's lap and feel their reaction | 3 | text: "Sit on your partner's lap and feel their reaction" / partner: "Make your partner sit on your lap at a bar and feel what they do to you" |
| 12 | Pull your partner into a coat closet at a party | Get pulled into a closet by your partner at an event | 4 | text: "Get pulled into a closet by your partner at an event" / partner: "Pull your partner into a coat closet at a party" |
| 13 | Touch your partner while you're both in a pool or hot tub with others nearby | Feel your partner's hands on you under the water | 4 | text: "Feel your partner's hands on you under the water" / partner: "Touch your partner while you're both in a pool or hot tub with others nearby" |
| 14 | Sneak off with your partner at a wedding for a private moment | Disappear with your partner during an event | 3 | text: "Disappear with your partner during an event" / partner: "Sneak off with your partner at a wedding for a private moment" |
| 15 | Whisper to your partner exactly what you want them to do to you once you leave | Hear in detail what's coming the moment you get home | 3 | text: "Hear in detail what's coming the moment you get home" / partner: "Whisper to your partner exactly what you want them to do to you once you leave" |
| 16 | Touch your partner through their clothes in a parked car | Get felt up in your car before going inside | 4 | text: "Get felt up in your car before going inside" / partner: "Touch your partner through their clothes in a parked car" |
| 17 | Touch your partner under the table at a dinner party until they squirm | Try not to react while your partner's hand is between your legs | 4 | text: "Try not to react while your partner's hand is between your legs" / partner: "Touch your partner under the table at a dinner party until they squirm" |
| 18 | Grind on your partner on a crowded dance floor | Feel your partner grind against you surrounded by people | 3 | text: "Feel your partner grind against you surrounded by people" / partner: "Grind on your partner on a crowded dance floor" |
| 19 | Tease your partner in the back of a cab until you get home | Get worked up in a cab knowing you can't do anything yet | 3 | text: "Get worked up in a cab knowing you can't do anything yet" / partner: "Tease your partner in the back of a cab until you get home" |
| 20 | Make out with your partner in a stairwell | Hook up with your partner in a quiet stairwell | 3 | text: "Hook up with your partner in a quiet stairwell" / partner: "Make out with your partner in a stairwell" |
| 21 | Touch your partner under a blanket at a friend's movie night | Get touched under a blanket while others are in the room | 4 | text: "Get touched under a blanket while others are in the room" / partner: "Touch your partner under a blanket at a friend's movie night" |
| 22 | Give your partner a hickey somewhere that will be hidden by clothes | Get marked by your partner in a semi-public place | 3 | text: "Get marked by your partner in a semi-public place" / partner: "Give your partner a hickey somewhere that will be hidden by clothes" |
| 23 | Slip your hand into your partner's pants briefly in a dark corner | Feel your partner's hand slide into your pants somewhere risky | 4 | text: "Feel your partner's hand slide into your pants somewhere risky" / partner: "Slip your hand into your partner's pants briefly in a dark corner" |
| 24 | Kiss your partner against a wall in an alley | Get pressed against a wall and kissed outside | 3 | text: "Get pressed against a wall and kissed outside" / partner: "Kiss your partner against a wall in an alley" |
| 25 | Touch your partner over their clothes at a house party when no one's looking | Get touched at a party while trying to act normal | 3 | text: "Get touched at a party while trying to act normal" / partner: "Touch your partner over their clothes at a house party when no one's looking" |
| 26 | Pull your partner into a dressing room for a heated makeout | Get dragged into a fitting room by your partner | 4 | text: "Get dragged into a fitting room by your partner" / partner: "Pull your partner into a dressing room for a heated makeout" |
| 27 | Get handsy with your partner in the back seat of an Uber | Fool around with your partner while someone else drives | 4 | text: "Fool around with your partner while someone else drives" / partner: "Get handsy with your partner in the back seat of an Uber" |
| 28 | Have your partner go commando on a date and tease them about it all night | Go without underwear while your partner reminds you constantly | 3 | text: "Go without underwear while your partner reminds you constantly" / partner: "Have your partner go commando on a date and tease them about it all night" |
| 29 | Touch your partner under their clothes in a dark movie theater | Feel your partner's hands under your clothes at the movies | 4 | text: "Feel your partner's hands under your clothes at the movies" / partner: "Touch your partner under their clothes in a dark movie theater" |
| 30 | Make out with your partner in a bar or club bathroom | Get pulled into a bathroom for a makeout session | 3 | text: "Get pulled into a bathroom for a makeout session" / partner: "Make out with your partner in a bar or club bathroom" |
## 🔞 Testing the Waters (30 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Graze your partner's back under their shirt while walking together | Feel your partner's fingers on your bare skin in public | 2 | text: "Feel your partner's fingers on your bare skin in public" / partner: "Graze your partner's back under their shirt while walking together" |
| 2 | Brush against your partner suggestively while passing them in a crowd | Feel your partner brush against you on purpose | 2 | text: "Feel your partner brush against you on purpose" / partner: "Brush against your partner suggestively while passing them in a crowd" |
| 3 | Leave your hand on your partner's inner thigh during a movie | Feel your partner's hand resting dangerously high during a film | 3 | text: "Feel your partner's hand resting dangerously high during a film" / partner: "Leave your hand on your partner's inner thigh during a movie" |
| 4 | Tell your partner exactly what you're going to do to them later while at a party | Hear your partner's plans for you while surrounded by people | 2 | text: "Hear your partner's plans for you while surrounded by people" / partner: "Tell your partner exactly what you're going to do to them later while at a party" |
| 5 | Make prolonged eye contact with your partner across a room until one of you breaks | Hold eye contact with your partner from across the room | 2 | text: "Hold eye contact with your partner from across the room" / partner: "Make prolonged eye contact with your partner across a room until one of you breaks" |
| 6 | Give your partner a look that tells them exactly what you're thinking | Catch your partner giving you that look in public | 2 | text: "Catch your partner giving you that look in public" / partner: "Give your partner a look that tells them exactly what you're thinking" |
| 7 | Whisper something sensual to your partner in a crowded place | Hear something sensual whispered in your ear in public | 2 | text: "Hear something sensual whispered in your ear in public" / partner: "Whisper something sensual to your partner in a crowded place" |
| 8 | Steal a long kiss with your partner in an elevator before the doors open | Make out in an elevator and stop just before it opens | 3 | text: "Make out in an elevator and stop just before it opens" / partner: "Steal a long kiss with your partner in an elevator before the doors open" |
| 9 | Run your fingers along your partner's neck while standing behind them | Feel your partner's touch on your neck in public | 2 | text: "Feel your partner's touch on your neck in public" / partner: "Run your fingers along your partner's neck while standing behind them" |
| 10 | Press against your partner from behind while waiting in line | Feel your partner pressed against you in a queue | 3 | text: "Feel your partner pressed against you in a queue" / partner: "Press against your partner from behind while waiting in line" |
| 11 | Kiss your partner's neck briefly while hugging them goodbye in front of others | Feel your partner's lips on your neck in a public goodbye | 2 | text: "Feel your partner's lips on your neck in a public goodbye" / partner: "Kiss your partner's neck briefly while hugging them goodbye in front of others" |
| 12 | Flirt with your partner like you just met them at a bar | Play along while your partner hits on you like a stranger | 2 | text: "Play along while your partner hits on you like a stranger" / partner: "Flirt with your partner like you just met them at a bar" |
| 13 | Bite your lip while looking at your partner across a table full of people | Catch your partner biting their lip at you in front of others | 2 | text: "Catch your partner biting their lip at you in front of others" / partner: "Bite your lip while looking at your partner across a table full of people" |
| 14 | Slip your hand into your partner's back pocket while walking | Feel your partner's hand slide into your pocket | 2 | text: "Feel your partner's hand slide into your pocket" / partner: "Slip your hand into your partner's back pocket while walking" |
| 15 | Tell your partner to meet you somewhere private in five minutes | Get a message to meet your partner somewhere right now | 3 | text: "Get a message to meet your partner somewhere right now" / partner: "Tell your partner to meet you somewhere private in five minutes" |
| 16 | Drag your nails lightly down your partner's arm while talking to friends | Feel your partner's nails on your skin while acting normal | 2 | text: "Feel your partner's nails on your skin while acting normal" / partner: "Drag your nails lightly down your partner's arm while talking to friends" |
| 17 | Lean in and smell your partner while complimenting them in public | Have your partner lean in close and breathe you in | 2 | text: "Have your partner lean in close and breathe you in" / partner: "Lean in and smell your partner while complimenting them in public" |
| 18 | Dance closely with your partner at a club like no one else exists | Get lost in your partner on the dance floor | 3 | text: "Get lost in your partner on the dance floor" / partner: "Dance closely with your partner at a club like no one else exists" |
| 19 | Pin your partner against a wall for a quick kiss when no one's watching | Get pinned and kissed somewhere semi-public | 3 | text: "Get pinned and kissed somewhere semi-public" / partner: "Pin your partner against a wall for a quick kiss when no one's watching" |
| 20 | Trace shapes on your partner's palm under the table | Feel your partner's fingers drawing on your hand secretly | 2 | text: "Feel your partner's fingers drawing on your hand secretly" / partner: "Trace shapes on your partner's palm under the table" |
| 21 | Whisper to your partner that you're skipping underwear today | Discover your partner is skipping underwear while you're out | 3 | text: "Discover your partner is skipping underwear while you're out" / partner: "Whisper to your partner that you're skipping underwear today" |
| 22 | Send your partner a suggestive photo while at an event | Receive a suggestive photo from your partner in public | 3 | text: "Receive a suggestive photo from your partner in public" / partner: "Send your partner a suggestive photo while at an event" |
| 23 | Give your partner's backside a playful squeeze | Have your partner playfully squeeze your backside | 2 | text: "Have your partner playfully squeeze your backside" / partner: "Give your partner's backside a playful squeeze" |
| 24 | Whisper a romantic fantasy to your partner at a gathering | Hear a romantic fantasy whispered to you in a crowd | 2 | text: "Hear a romantic fantasy whispered to you in a crowd" / partner: "Whisper a romantic fantasy to your partner at a gathering" |
| 25 | Play footsie with your partner under the table | Feel your partner's foot teasing yours under the table | 2 | text: "Feel your partner's foot teasing yours under the table" / partner: "Play footsie with your partner under the table" |
| 26 | Text your partner your desires while sitting across from them | Receive a suggestive text from your partner while looking at them | 2 | text: "Receive a suggestive text from your partner while looking at them" / partner: "Text your partner your desires while sitting across from them" |
| 27 | Kiss your partner somewhere unexpected while out running errands | Get kissed by your partner when you least expect it in public | 2 | text: "Get kissed by your partner when you least expect it in public" / partner: "Kiss your partner somewhere unexpected while out running errands" |
| 28 | Rest your hand on your partner's upper thigh at dinner | Feel your partner's hand creep up your thigh at a restaurant | 2 | text: "Feel your partner's hand creep up your thigh at a restaurant" / partner: "Rest your hand on your partner's upper thigh at dinner" |
| 29 | Hold your partner's hand under the table while making intense eye contact | Lock eyes with your partner while they hold your hand secretly | 2 | text: "Lock eyes with your partner while they hold your hand secretly" / partner: "Hold your partner's hand under the table while making intense eye contact" |
| 30 | Pull your partner into a quick hidden kiss in a store aisle | Get pulled into a secret kiss while shopping | 2 | text: "Get pulled into a secret kiss while shopping" / partner: "Pull your partner into a quick hidden kiss in a store aisle" |
# Romance & Sensuality (103 missing)
## 🔞 Date Night Sparks (7 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Give your partner a sensual massage that leads to more | Receive a sensual massage that leads to more | 3 | text: "Receive a sensual massage that leads to more" / partner: "Give your partner a sensual massage that leads to more" |
| 2 | Give your partner a lap dance | Receive a lap dance from your partner | 3 | text: "Receive a lap dance from your partner" / partner: "Give your partner a lap dance" |
| 3 | Go to dinner and whisper what you want to do later | Hear what your partner wants to do to you later | 3 | text: "Hear what your partner wants to do to you later" / partner: "Go to dinner and whisper what you want to do later" |
| 4 | Give your partner a foot massage that travels up their leg | Receive a foot massage that travels up your leg | 3 | text: "Receive a foot massage that travels up your leg" / partner: "Give your partner a foot massage that travels up their leg" |
| 5 | Wear something your partner picks out for date night | Pick out what your partner wears for date night | 2 | text: "Pick out what your partner wears for date night" / partner: "Wear something your partner picks out for date night" |
| 6 | Give your partner a striptease | Watch your partner do a striptease for you | 3 | text: "Watch your partner do a striptease for you" / partner: "Give your partner a striptease" |
| 7 | Plan a surprise date night ending with intimacy | Be surprised with a date night ending in intimacy | 3 | text: "Be surprised with a date night ending in intimacy" / partner: "Plan a surprise date night ending with intimacy" |
## 🔞 Love Notes (34 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Send a 'thinking about you' text describing exactly what you're thinking | Receive a detailed 'thinking about you' text | 3 | text: "Receive a detailed 'thinking about you' text" / partner: "Send a 'thinking about you' text describing exactly what you're thinking" |
| 2 | Write your partner a note about the first time you wanted them | Read about when your partner first wanted you | 2 | text: "Read about when your partner first wanted you" / partner: "Write your partner a note about the first time you wanted them" |
| 3 | Send a flirty emoji-only message and have them guess what it means | Decode a flirty emoji message from your partner | 2 | text: "Decode a flirty emoji message from your partner" / partner: "Send a flirty emoji-only message and have them guess what it means" |
| 4 | Create a scavenger hunt of notes leading to the bedroom | Follow a scavenger hunt of notes to the bedroom | 3 | text: "Follow a scavenger hunt of notes to the bedroom" / partner: "Create a scavenger hunt of notes leading to the bedroom" |
| 5 | Text your partner during work about the lingerie you're wearing | Receive a text about what your partner is wearing underneath | 3 | text: "Receive a text about what your partner is wearing underneath" / partner: "Text your partner during work about the lingerie you're wearing" |
| 6 | Write down what you want your partner to do to you and leave it on their pillow | Find instructions on your pillow from your partner | 4 | text: "Find instructions on your pillow from your partner" / partner: "Write down what you want your partner to do to you and leave it on their pillow" |
| 7 | Send your partner a playlist of songs that make you think of them sexually | Listen to a sexy playlist your partner made for you | 2 | text: "Listen to a sexy playlist your partner made for you" / partner: "Send your partner a playlist of songs that make you think of them sexually" |
| 8 | Leave a note in your partner's pocket or bag with tonight's plans | Find a surprise note about tonight's plans | 2 | text: "Find a surprise note about tonight's plans" / partner: "Leave a note in your partner's pocket or bag with tonight's plans" |
| 9 | Write a poem about your physical attraction to your partner | Receive a poem about your partner's attraction to you | 2 | text: "Receive a poem about your partner's attraction to you" / partner: "Write a poem about your physical attraction to your partner" |
| 10 | Send dirty talk messages throughout the day to build anticipation | Receive dirty talk messages all day | 4 | text: "Receive dirty talk messages all day" / partner: "Send dirty talk messages throughout the day to build anticipation" |
| 11 | Create a 'sexy coupon book' for your partner | Receive a sexy coupon book from your partner | 3 | text: "Receive a sexy coupon book from your partner" / partner: "Create a 'sexy coupon book' for your partner" |
| 12 | Write down a secret fantasy and give it to your partner | Receive and read your partner's secret fantasy | 3 | text: "Receive and read your partner's secret fantasy" / partner: "Write down a secret fantasy and give it to your partner" |
| 13 | Send your partner voice messages describing your desires | Receive voice messages describing your partner's desires | 3 | text: "Receive voice messages describing your partner's desires" / partner: "Send your partner voice messages describing your desires" |
| 14 | Write a list of places you want to have sex and share it | Receive a list of places your partner wants to have sex | 4 | text: "Receive a list of places your partner wants to have sex" / partner: "Write a list of places you want to have sex and share it" |
| 15 | Send your partner a countdown of sexy things you'll do when you see them | Receive a sexy countdown from your partner | 3 | text: "Receive a sexy countdown from your partner" / partner: "Send your partner a countdown of sexy things you'll do when you see them" |
| 16 | Leave a note on the bathroom mirror describing your favorite intimate moment | Find a note about your partner's favorite intimate moment | 2 | text: "Find a note about your partner's favorite intimate moment" / partner: "Leave a note on the bathroom mirror describing your favorite intimate moment" |
| 17 | Write a steamy story starring you and your partner | Read a steamy story your partner wrote about you both | 3 | text: "Read a steamy story your partner wrote about you both" / partner: "Write a steamy story starring you and your partner" |
| 18 | Send your partner a suggestive photo during the day | Receive a suggestive photo from your partner | 3 | text: "Receive a suggestive photo from your partner" / partner: "Send your partner a suggestive photo during the day" |
| 19 | Write down three things you love about your partner's body | Read three things your partner loves about your body | 2 | text: "Read three things your partner loves about your body" / partner: "Write down three things you love about your partner's body" |
| 20 | Text your partner a fantasy you want to try | Receive a fantasy text from your partner | 3 | text: "Receive a fantasy text from your partner" / partner: "Text your partner a fantasy you want to try" |
| 21 | Leave a flirty note hidden for your partner to find | Find a flirty hidden note from your partner | 2 | text: "Find a flirty hidden note from your partner" / partner: "Leave a flirty note hidden for your partner to find" |
| 22 | Send your partner a sexy text describing what you want to do tonight | Receive a sexy text about tonight | 3 | text: "Receive a sexy text about tonight" / partner: "Send your partner a sexy text describing what you want to do tonight" |
| 23 | Write your partner a love letter describing what turns you on about them | Receive a love letter about what turns your partner on | 2 | text: "Receive a love letter about what turns your partner on" / partner: "Write your partner a love letter describing what turns you on about them" |
| 24 | Write down a new position you want to try and slip it to your partner | Receive a suggestion for a new position to try | 4 | text: "Receive a suggestion for a new position to try" / partner: "Write down a new position you want to try and slip it to your partner" |
| 25 | Send your partner a teasing text and make them wait for the follow-up | Receive a teasing text with anticipation | 3 | text: "Receive a teasing text with anticipation" / partner: "Send your partner a teasing text and make them wait for the follow-up" |
| 26 | Write your partner a note about what you'd do if they walked in right now | Find a note about what would happen if you walked in | 3 | text: "Find a note about what would happen if you walked in" / partner: "Write your partner a note about what you'd do if they walked in right now" |
| 27 | Send a 'can't wait to see you' text with explicit details | Receive an explicit 'can't wait' text | 4 | text: "Receive an explicit 'can't wait' text" / partner: "Send a 'can't wait to see you' text with explicit details" |
| 28 | Write down your top 5 favorite things your partner does in bed | Read your partner's top 5 favorite things you do in bed | 3 | text: "Read your partner's top 5 favorite things you do in bed" / partner: "Write down your top 5 favorite things your partner does in bed" |
| 29 | Send your partner a gif or meme that expresses how much you want them | Receive a flirty gif from your partner | 2 | text: "Receive a flirty gif from your partner" / partner: "Send your partner a gif or meme that expresses how much you want them" |
| 30 | Write a note thanking your partner for an amazing sexual experience | Receive a thank-you note for an amazing experience | 2 | text: "Receive a thank-you note for an amazing experience" / partner: "Write a note thanking your partner for an amazing sexual experience" |
| 31 | Send your partner a 'remember when we...' text about a hot memory | Reminisce about a hot memory via text | 3 | text: "Reminisce about a hot memory via text" / partner: "Send your partner a 'remember when we...' text about a hot memory" |
| 32 | Leave a note with one word describing what you want tonight | Find a one-word hint about tonight | 3 | text: "Find a one-word hint about tonight" / partner: "Leave a note with one word describing what you want tonight" |
| 33 | Write a letter about how your partner makes you feel desired | Receive a letter about how you make your partner feel desired | 2 | text: "Receive a letter about how you make your partner feel desired" / partner: "Write a letter about how your partner makes you feel desired" |
| 34 | Send your partner a 'this made me think of you' message with something sexy | Receive a sexy 'this made me think of you' message | 2 | text: "Receive a sexy 'this made me think of you' message" / partner: "Send your partner a 'this made me think of you' message with something sexy" |
## ✨ Romantic Gestures (28 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Wash your partner in a warm bath | Be washed by your partner in a warm bath | 2 | text: "Be washed by your partner in a warm bath" / partner: "Wash your partner in a warm bath" |
| 2 | Greet your partner wearing only their favorite outfit or nothing | Be greeted by your partner wearing only your favorite outfit or nothing | 3 | text: "Be greeted by your partner wearing only your favorite outfit or nothing" / partner: "Greet your partner wearing only their favorite outfit or nothing" |
| 3 | Trace your fingers along your partner's body | Let your partner trace their fingers along your body | 2 | text: "Let your partner trace their fingers along your body" / partner: "Trace your fingers along your partner's body" |
| 4 | Surprise your partner with a passionate kiss | Be surprised with a passionate kiss | 2 | text: "Be surprised with a passionate kiss" / partner: "Surprise your partner with a passionate kiss" |
| 5 | Carry your partner to bed and worship their body | Be carried to bed and have your body worshipped | 3 | text: "Be carried to bed and have your body worshipped" / partner: "Carry your partner to bed and worship their body" |
| 6 | Slowly kiss from your partner's lips down to their collarbone | Be kissed from your lips down to your collarbone | 3 | text: "Be kissed from your lips down to your collarbone" / partner: "Slowly kiss from your partner's lips down to their collarbone" |
| 7 | Kiss your partner's forehead and tell them they're safe with you | Be kissed on the forehead and told you're safe | 2 | text: "Be kissed on the forehead and told you're safe" / partner: "Kiss your partner's forehead and tell them they're safe with you" |
| 8 | Pull your partner onto your lap and kiss them | Be pulled onto your partner's lap | 3 | text: "Be pulled onto your partner's lap" / partner: "Pull your partner onto your lap and kiss them" |
| 9 | Tell your partner you find them sexy while doing something mundane | Be told you're sexy during something mundane | 2 | text: "Be told you're sexy during something mundane" / partner: "Tell your partner you find them sexy while doing something mundane" |
| 10 | Cup your partner's face and kiss them deeply before saying goodbye | Be kissed deeply before your partner leaves | 2 | text: "Be kissed deeply before your partner leaves" / partner: "Cup your partner's face and kiss them deeply before saying goodbye" |
| 11 | Take your partner's hand and lead them to bed wordlessly | Be led to bed wordlessly | 3 | text: "Be led to bed wordlessly" / partner: "Take your partner's hand and lead them to bed wordlessly" |
| 12 | Hold your partner from behind and kiss their neck while they do something | Be held from behind and kissed on the neck | 3 | text: "Be held from behind and kissed on the neck" / partner: "Hold your partner from behind and kiss their neck while they do something" |
| 13 | Watch your partner get dressed and tell them how attractive they are | Be watched getting dressed and complimented | 2 | text: "Be watched getting dressed and complimented" / partner: "Watch your partner get dressed and tell them how attractive they are" |
| 14 | Give your partner a full body massage ending wherever they want | Receive a full body massage that ends wherever you want | 3 | text: "Receive a full body massage that ends wherever you want" / partner: "Give your partner a full body massage ending wherever they want" |
| 15 | Brush your partner's hair and tell them how beautiful they are | Have your partner brush your hair and compliment you | 2 | text: "Have your partner brush your hair and compliment you" / partner: "Brush your partner's hair and tell them how beautiful they are" |
| 16 | Slowly apply lotion to your partner's whole body | Have lotion applied slowly to your whole body | 3 | text: "Have lotion applied slowly to your whole body" / partner: "Slowly apply lotion to your partner's whole body" |
| 17 | Run a warm washcloth over your partner after intimacy | Be cared for after intimacy with a warm washcloth | 2 | text: "Be cared for after intimacy with a warm washcloth" / partner: "Run a warm washcloth over your partner after intimacy" |
| 18 | Seduce your partner in a dimly lit room | Be seduced in a dimly lit room | 3 | text: "Be seduced in a dimly lit room" / partner: "Seduce your partner in a dimly lit room" |
| 19 | Serve your partner breakfast in bed while naked | Be served breakfast in bed by your naked partner | 3 | text: "Be served breakfast in bed by your naked partner" / partner: "Serve your partner breakfast in bed while naked" |
| 20 | Lead your partner to the bedroom for a surprise | Be led to the bedroom for a surprise | 2 | text: "Be led to the bedroom for a surprise" / partner: "Lead your partner to the bedroom for a surprise" |
| 21 | Pull your partner close unexpectedly and tell them you want them | Be pulled close and told you're wanted | 3 | text: "Be pulled close and told you're wanted" / partner: "Pull your partner close unexpectedly and tell them you want them" |
| 22 | Give your partner a lingering kiss on the neck | Receive a lingering kiss on your neck | 3 | text: "Receive a lingering kiss on your neck" / partner: "Give your partner a lingering kiss on the neck" |
| 23 | Run your fingers through your partner's hair while they rest on you | Have your hair played with while resting on your partner | 2 | text: "Have your hair played with while resting on your partner" / partner: "Run your fingers through your partner's hair while they rest on you" |
| 24 | Hold your partner's face and tell them what you love about them before kissing | Have your partner hold your face and shower you with love | 2 | text: "Have your partner hold your face and shower you with love" / partner: "Hold your partner's face and tell them what you love about them before kissing" |
| 25 | Wake your partner up with kisses all over their body | Be woken up with kisses all over your body | 3 | text: "Be woken up with kisses all over your body" / partner: "Wake your partner up with kisses all over their body" |
| 26 | Kiss every part of your partner's body | Have every part of your body kissed | 3 | text: "Have every part of your body kissed" / partner: "Kiss every part of your partner's body" |
| 27 | Undress your partner slowly while maintaining eye contact | Be slowly undressed while looking into your partner's eyes | 3 | text: "Be slowly undressed while looking into your partner's eyes" / partner: "Undress your partner slowly while maintaining eye contact" |
| 28 | Whisper something sexy in your partner's ear in public | Have your partner whisper something sexy in your ear | 3 | text: "Have your partner whisper something sexy in your ear" / partner: "Whisper something sexy in your partner's ear in public" |
## 🔞 Sensual Touch (34 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Breathe warmly on your partner's neck before kissing it | Feel warm breath on your neck before being kissed | 3 | text: "Feel warm breath on your neck before being kissed" / partner: "Breathe warmly on your partner's neck before kissing it" |
| 2 | Use silk or satin fabric to touch your partner's skin | Be touched with silk or satin on your skin | 3 | text: "Be touched with silk or satin on your skin" / partner: "Use silk or satin fabric to touch your partner's skin" |
| 3 | Give your partner a foot massage with intention | Receive an intentional foot massage | 2 | text: "Receive an intentional foot massage" / partner: "Give your partner a foot massage with intention" |
| 4 | Lightly scratch your partner's back during intimacy | Have your back scratched during intimacy | 3 | text: "Have your back scratched during intimacy" / partner: "Lightly scratch your partner's back during intimacy" |
| 5 | Use your lips to explore your partner's body without using hands | Be explored with only your partner's lips | 3 | text: "Be explored with only your partner's lips" / partner: "Use your lips to explore your partner's body without using hands" |
| 6 | Trace your fingernails lightly down your partner's back | Have fingernails traced lightly down your back | 3 | text: "Have fingernails traced lightly down your back" / partner: "Trace your fingernails lightly down your partner's back" |
| 7 | Tease your partner everywhere except where they want it most | Be teased everywhere except where you want it most | 4 | text: "Be teased everywhere except where you want it most" / partner: "Tease your partner everywhere except where they want it most" |
| 8 | Massage your partner's inner thighs without going further | Have your inner thighs massaged without going further | 3 | text: "Have your inner thighs massaged without going further" / partner: "Massage your partner's inner thighs without going further" |
| 9 | Suck and lick your partner's fingers | Have your fingers sucked and licked | 3 | text: "Have your fingers sucked and licked" / partner: "Suck and lick your partner's fingers" |
| 10 | Touch your partner and have them rate the sensation | Let your partner touch you and rate the sensation | 3 | text: "Let your partner touch you and rate the sensation" / partner: "Touch your partner and have them rate the sensation" |
| 11 | Dry hump your partner slowly | Be dry humped slowly by your partner | 3 | text: "Be dry humped slowly by your partner" / partner: "Dry hump your partner slowly" |
| 12 | Kiss and nibble your partner's ears | Have your ears kissed and nibbled | 3 | text: "Have your ears kissed and nibbled" / partner: "Kiss and nibble your partner's ears" |
| 13 | Use warming or cooling massage oil on your partner | Experience warming or cooling massage oil | 3 | text: "Experience warming or cooling massage oil" / partner: "Use warming or cooling massage oil on your partner" |
| 14 | Give your partner a full body massage with warm oil | Receive a warm oil full body massage | 3 | text: "Receive a warm oil full body massage" / partner: "Give your partner a full body massage with warm oil" |
| 15 | Blindfold your partner and use different textures on their body | Be blindfolded and touched with different textures | 3 | text: "Be blindfolded and touched with different textures" / partner: "Blindfold your partner and use different textures on their body" |
| 16 | Run ice cubes along your partner's body | Have ice cubes run along your body | 3 | text: "Have ice cubes run along your body" / partner: "Run ice cubes along your partner's body" |
| 17 | Use light touch to give your partner shivers | Let your partner give you shivers with light touch | 3 | text: "Let your partner give you shivers with light touch" / partner: "Use light touch to give your partner shivers" |
| 18 | Explore your partner's body and discover new sensitive spots | Have your body explored for new sensitive spots | 3 | text: "Have your body explored for new sensitive spots" / partner: "Explore your partner's body and discover new sensitive spots" |
| 19 | Blindfold your partner and make them guess what you're touching them with | Guess what you're being touched with while blindfolded | 3 | text: "Guess what you're being touched with while blindfolded" / partner: "Blindfold your partner and make them guess what you're touching them with" |
| 20 | Use a feather to tease your partner all over | Be teased with a feather all over | 3 | text: "Be teased with a feather all over" / partner: "Use a feather to tease your partner all over" |
| 21 | Use your breath to stimulate your partner without touching | Be stimulated by your partner's breath without touch | 3 | text: "Be stimulated by your partner's breath without touch" / partner: "Use your breath to stimulate your partner without touching" |
| 22 | Caress your partner's face while looking into their eyes | Have your face caressed while looking into your partner's eyes | 2 | text: "Have your face caressed while looking into your partner's eyes" / partner: "Caress your partner's face while looking into their eyes" |
| 23 | Massage your partner's shoulders while they sit between your legs | Sit between your partner's legs while they massage you | 2 | text: "Sit between your partner's legs while they massage you" / partner: "Massage your partner's shoulders while they sit between your legs" |
| 24 | Use edible body paint on your partner | Have edible body paint used on you | 4 | text: "Have edible body paint used on you" / partner: "Use edible body paint on your partner" |
| 25 | Give your partner goosebumps by whispering and touching | Get goosebumps from whispers and touch | 3 | text: "Get goosebumps from whispers and touch" / partner: "Give your partner goosebumps by whispering and touching" |
| 26 | Alternate between firm and gentle touches on your partner's body | Experience alternating firm and gentle touches | 3 | text: "Experience alternating firm and gentle touches" / partner: "Alternate between firm and gentle touches on your partner's body" |
| 27 | Touch your partner through their clothes before undressing them | Be touched through your clothes before being undressed | 3 | text: "Be touched through your clothes before being undressed" / partner: "Touch your partner through their clothes before undressing them" |
| 28 | Run your hands through your partner's hair and grip gently | Have your hair played with and gripped gently | 3 | text: "Have your hair played with and gripped gently" / partner: "Run your hands through your partner's hair and grip gently" |
| 29 | Kiss the inside of your partner's wrist | Have the inside of your wrist kissed | 2 | text: "Have the inside of your wrist kissed" / partner: "Kiss the inside of your partner's wrist" |
| 30 | Use a massage candle on your partner's body | Have warm massage candle wax used on your body | 3 | text: "Have warm massage candle wax used on your body" / partner: "Use a massage candle on your partner's body" |
| 31 | Apply lotion to your partner slowly and sensually | Have lotion applied to you slowly | 3 | text: "Have lotion applied to you slowly" / partner: "Apply lotion to your partner slowly and sensually" |
| 32 | Use your tongue to trace patterns on your partner's skin | Have patterns traced on your skin with a tongue | 4 | text: "Have patterns traced on your skin with a tongue" / partner: "Use your tongue to trace patterns on your partner's skin" |
| 33 | Give your partner a scalp massage that turns sensual | Receive a scalp massage that turns sensual | 2 | text: "Receive a scalp massage that turns sensual" / partner: "Give your partner a scalp massage that turns sensual" |
| 34 | Hold your partner's hands above their head while kissing them | Have your hands held above your head while being kissed | 3 | text: "Have your hands held above your head while being kissed" / partner: "Hold your partner's hands above their head while kissing them" |
# Spicy Challenges (56 missing)
## 🔞 Dare to Play (22 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Perform a striptease for your partner | Watch your partner do a striptease | 3 | text: "Watch your partner do a striptease" / partner: "Perform a striptease for your partner" |
| 2 | Use only your mouth to pleasure your partner | Be pleasured using only your partner's mouth | 4 | text: "Be pleasured using only your partner's mouth" / partner: "Use only your mouth to pleasure your partner" |
| 3 | Make your partner orgasm twice in one session | Have your partner make you orgasm twice | 5 | text: "Have your partner make you orgasm twice" / partner: "Make your partner orgasm twice in one session" |
| 4 | Initiate sex at an unexpected time | Be surprised by your partner initiating sex | 4 | text: "Be surprised by your partner initiating sex" / partner: "Initiate sex at an unexpected time" |
| 5 | Make your partner beg for what they want | Let your partner make you beg for what you want | 4 | text: "Let your partner make you beg for what you want" / partner: "Make your partner beg for what they want" |
| 6 | Tell your partner your dirtiest thought | Hear your partner's dirtiest thought | 3 | text: "Hear your partner's dirtiest thought" / partner: "Tell your partner your dirtiest thought" |
| 7 | Send your partner a nude photo unexpectedly | Receive a nude photo from your partner | 4 | text: "Receive a nude photo from your partner" / partner: "Send your partner a nude photo unexpectedly " |
| 8 | Surprise your partner with spontaneous oral during a mundane activity | Be surprised with spontaneous oral | 4 | text: "Be surprised with spontaneous oral" / partner: "Surprise your partner with spontaneous oral during a mundane activity" |
| 9 | Blindfold your partner and pleasure them | Be blindfolded and pleasured | 4 | text: "Be blindfolded and pleasured" / partner: "Blindfold your partner and pleasure them" |
| 10 | Let your partner do whatever they want to you for 15 minutes | Do whatever you want to your partner for 15 minutes | 5 | text: "Do whatever you want to your partner for 15 minutes" / partner: "Let your partner do whatever they want to you for 15 minutes" |
| 11 | Describe exactly what you're going to do to your partner, then do it | Listen to what your partner will do, then experience it | 4 | text: "Listen to what your partner will do, then experience it" / partner: "Describe exactly what you're going to do to your partner, then do it" |
| 12 | Make your partner cum without using penetration | Have your partner make you cum without penetration | 4 | text: "Have your partner make you cum without penetration" / partner: "Make your partner cum without using penetration" |
| 13 | Wake your partner up with oral sex | Be woken up with oral sex | 4 | text: "Be woken up with oral sex" / partner: "Wake your partner up with oral sex" |
| 14 | Take control and tell your partner exactly what to do | Let your partner take full control | 4 | text: "Let your partner take full control" / partner: "Take control and tell your partner exactly what to do" |
| 15 | Give your partner a slow, teasing handjob or fingering session | Receive a slow, teasing handjob or fingering | 4 | text: "Receive a slow, teasing handjob or fingering" / partner: "Give your partner a slow, teasing handjob or fingering session" |
| 16 | Edge your partner three times before letting them finish | Be edged three times before finishing | 4 | text: "Be edged three times before finishing" / partner: "Edge your partner three times before letting them finish" |
| 17 | Go down on your partner for at least 10 minutes | Receive oral for at least 10 minutes | 4 | text: "Receive oral for at least 10 minutes" / partner: "Go down on your partner for at least 10 minutes" |
| 18 | Give your partner a lap dance in lingerie or underwear | Receive a lap dance | 3 | text: "Receive a lap dance" / partner: "Give your partner a lap dance in lingerie or underwear" |
| 19 | Masturbate in front of your partner | Watch your partner masturbate | 4 | text: "Watch your partner masturbate" / partner: "Masturbate in front of your partner" |
| 20 | Tease your partner with texts all day, then deliver | Be teased with texts then get the payoff | 4 | text: "Be teased with texts then get the payoff" / partner: "Tease your partner with texts all day, then deliver" |
| 21 | Make your partner come using only external stimulation | Be brought to orgasm without any penetration | 3 | text: "Be brought to orgasm without any penetration" / partner: "Make your partner come using only external stimulation" |
| 22 | Be brought to orgasm without any penetration | Make your partner cum using only external stimulation | 3 | text: "Make your partner cum using only external stimulation" / partner: "Be brought to orgasm without any penetration" |
## 🔞 Pleasure Experiments (1 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Slowly run an ice cube down your partner's body | Let your partner trace an ice cube down your body | 2 | text: "Let your partner trace an ice cube down your body" / partner: "Slowly run an ice cube down your partner's body" |
## 🔞 Tease & Tension (33 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Strip slowly in front of your partner but don't let them touch | Watch your partner strip without being able to touch | 3 | text: "Watch your partner strip without being able to touch" / partner: "Strip slowly in front of your partner but don't let them touch" |
| 2 | Whisper what you want to do later in explicit detail | Listen to explicit details of what's coming later | 3 | text: "Listen to explicit details of what's coming later" / partner: "Whisper what you want to do later in explicit detail" |
| 3 | Restrain your partner and take your time with them | Be restrained while your partner takes their time | 4 | text: "Be restrained while your partner takes their time" / partner: "Restrain your partner and take your time with them" |
| 4 | Use ice on your partner's body while they're restrained | Have ice used on you while restrained | 5 | text: "Have ice used on you while restrained" / partner: "Use ice on your partner's body while they're restrained" |
| 5 | Use a vibrator on your partner on the lowest setting | Be teased with a vibrator on the lowest setting | 4 | text: "Be teased with a vibrator on the lowest setting" / partner: "Use a vibrator on your partner on the lowest setting" |
| 6 | Blindfold your partner and make them guess what comes next | Be blindfolded and guess what's coming | 4 | text: "Be blindfolded and guess what's coming" / partner: "Blindfold your partner and make them guess what comes next" |
| 7 | Maintain eye contact while touching your partner slowly | Maintain eye contact while being touched slowly | 3 | text: "Maintain eye contact while being touched slowly" / partner: "Maintain eye contact while touching your partner slowly" |
| 8 | Make your partner beg before you touch them where they want | Let your partner make you beg before being touched | 4 | text: "Let your partner make you beg before being touched" / partner: "Make your partner beg before you touch them where they want" |
| 9 | Deny your partner an orgasm until they can't take it anymore | Be denied orgasm until you can't take it anymore | 5 | text: "Be denied orgasm until you can't take it anymore" / partner: "Deny your partner an orgasm until they can't take it anymore" |
| 10 | Give your partner a massage that 'accidentally' gets too close | Receive a massage that keeps getting close | 3 | text: "Receive a massage that keeps getting close" / partner: "Give your partner a massage that 'accidentally' gets too close" |
| 11 | Whisper dirty things in your partner's ear without touching them | Hear dirty things whispered without being touched | 3 | text: "Hear dirty things whispered without being touched" / partner: "Whisper dirty things in your partner's ear without touching them" |
| 12 | Bring your partner to the edge and stop - repeat three times | Be brought to the edge and stopped three times | 4 | text: "Be brought to the edge and stopped three times" / partner: "Bring your partner to the edge and stop - repeat three times" |
| 13 | Give your partner a lap dance without letting them touch | Receive a lap dance without being allowed to touch | 3 | text: "Receive a lap dance without being allowed to touch" / partner: "Give your partner a lap dance without letting them touch" |
| 14 | Send your partner flirty texts all day building anticipation | Receive flirty texts all day building anticipation | 2 | text: "Receive flirty texts all day building anticipation" / partner: "Send your partner flirty texts all day building anticipation" |
| 15 | Touch your partner everywhere except where they want most | Be touched everywhere except where you want most | 4 | text: "Be touched everywhere except where you want most" / partner: "Touch your partner everywhere except where they want most" |
| 16 | Use feathers or soft textures to tease all over | Be teased all over with feathers or soft textures | 3 | text: "Be teased all over with feathers or soft textures" / partner: "Use feathers or soft textures to tease all over" |
| 17 | Send a countdown of hours until you'll have sex, with teasers | Receive a countdown with teasing updates | 2 | text: "Receive a countdown with teasing updates" / partner: "Send a countdown of hours until you'll have sex, with teasers" |
| 18 | Undress your partner one piece at a time over an hour | Be undressed one piece at a time over an hour | 3 | text: "Be undressed one piece at a time over an hour" / partner: "Undress your partner one piece at a time over an hour" |
| 19 | Get your partner worked up then leave the room for 5 minutes | Be worked up then left waiting for 5 minutes | 4 | text: "Be worked up then left waiting for 5 minutes" / partner: "Get your partner worked up then leave the room for 5 minutes" |
| 20 | Tease your partner during an entire movie and only finish after | Be teased during a whole movie | 4 | text: "Be teased during a whole movie" / partner: "Tease your partner during an entire movie and only finish after" |
| 21 | Tell your partner exactly what you want but make them wait | Hear what's coming but have to wait | 3 | text: "Hear what's coming but have to wait" / partner: "Tell your partner exactly what you want but make them wait" |
| 22 | Touch yourself in front of your partner but don't let them join | Watch your partner but not be allowed to join | 4 | text: "Watch your partner but not be allowed to join" / partner: "Touch yourself in front of your partner but don't let them join" |
| 23 | Hover your body over your partner without making contact | Have your partner hover without making contact | 3 | text: "Have your partner hover without making contact" / partner: "Hover your body over your partner without making contact" |
| 24 | Kiss every part of your partner except their lips | Be kissed everywhere except your lips | 3 | text: "Be kissed everywhere except your lips" / partner: "Kiss every part of your partner except their lips" |
| 25 | Give oral for 30 seconds, stop, and make them wait | Receive 30 seconds of oral then wait | 4 | text: "Receive 30 seconds of oral then wait" / partner: "Give oral for 30 seconds, stop, and make them wait" |
| 26 | Describe everything you're going to do without doing it yet | Listen to everything your partner will do | 3 | text: "Listen to everything your partner will do" / partner: "Describe everything you're going to do without doing it yet" |
| 27 | Give your partner oral but stop right before they finish | Receive oral that stops right before you finish | 4 | text: "Receive oral that stops right before you finish" / partner: "Give your partner oral but stop right before they finish" |
| 28 | Touch your partner through their clothes for 10 minutes | Be touched through your clothes for 10 minutes | 3 | text: "Be touched through your clothes for 10 minutes" / partner: "Touch your partner through their clothes for 10 minutes" |
| 29 | Send your partner a suggestive photo during dinner | Receive a suggestive photo during dinner | 3 | text: "Receive a suggestive photo during dinner" / partner: "Send your partner a suggestive photo during dinner" |
| 30 | Kiss your partner's neck and stop when they want more | Have your neck kissed and then teased | 3 | text: "Have your neck kissed and then teased" / partner: "Kiss your partner's neck and stop when they want more" |
| 31 | Make your partner ask permission before you give them more | Ask permission before receiving more | 4 | text: "Ask permission before receiving more" / partner: "Make your partner ask permission before you give them more" |
| 32 | Use your mouth close to your partner's skin without touching | Feel your partner's mouth hover without touching | 3 | text: "Feel your partner's mouth hover without touching" / partner: "Use your mouth close to your partner's skin without touching" |
| 33 | Trace your fingers over your partner's body feather-light | Have feather-light touches traced on your body | 3 | text: "Have feather-light touches traced on your body" / partner: "Trace your fingers over your partner's body feather-light" |
# The Kink Lab (34 missing)
## 🔞 Forbidden Fantasy Dates (9 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Use nipple clamps on your partner | Let your partner use nipple clamps on you | 4 | text: "Let your partner use nipple clamps on you" / partner: "Use nipple clamps on your partner" |
| 2 | Let your partner use a clitoris clamp on you | Use a clitoris clamp on your partner | 5 | text: "Use a clitoris clamp on your partner" / partner: "Let your partner use a clitoris clamp on you" |
| 3 | Finger your partner while wearing black latex gloves | Be fingered by your partner wearing black latex gloves | 3 | text: "Be fingered by your partner wearing black latex gloves" / partner: "Finger your partner while wearing black latex gloves" |
| 4 | Edge your partner and deny their orgasm | Let your partner edge you and deny your orgasm | 5 | text: "Let your partner edge you and deny your orgasm" / partner: "Edge your partner and deny their orgasm" |
| 5 | Make your partner cum through domination | Let your partner dominate you until you cum | 5 | text: "Let your partner dominate you until you cum" / partner: "Make your partner cum through domination" |
| 6 | Blindfold your partner and plug their ears to take control | Be blindfolded with ears plugged while your partner controls you | 5 | text: "Be blindfolded with ears plugged while your partner controls you" / partner: "Blindfold your partner and plug their ears to take control" |
| 7 | Talk dirty about breeding your partner | Listen to your partner talk dirty about breeding you | 5 | text: "Listen to your partner talk dirty about breeding you" / partner: "Talk dirty about breeding your partner" |
| 8 | Let your partner take total control | Take total control of your partner | 3 | text: "Take total control of your partner" / partner: "Let your partner take total control" |
| 9 | Spank your partner firmly | Receive a firm spanking from your partner | 4 | text: "Receive a firm spanking from your partner" / partner: "Spank your partner firmly" |
## ✨ Kink Discovery (25 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Gag your partner during sex | Let your partner gag you during sex | 5 | text: "Let your partner gag you during sex" / partner: "Gag your partner during sex" |
| 2 | Hold your partner down during sex | Be held down by your partner during sex | 4 | text: "Be held down by your partner during sex" / partner: "Hold your partner down during sex" |
| 3 | Put a collar on your partner | Wear a collar for your partner | 4 | text: "Wear a collar for your partner" / partner: "Put a collar on your partner" |
| 4 | Blindfold your partner during sex | Be blindfolded by your partner during sex | 3 | text: "Be blindfolded by your partner during sex" / partner: "Blindfold your partner during sex" |
| 5 | Pull your partner's hair during sex | Let your partner pull your hair during sex | 4 | text: "Let your partner pull your hair during sex" / partner: "Pull your partner's hair during sex" |
| 6 | Make your partner ask permission to finish | Ask your partner for permission to finish | 4 | text: "Ask your partner for permission to finish" / partner: "Make your partner ask permission to finish" |
| 7 | Place your hands on your partner's throat | Let your partner's hands rest on your throat | 3 | text: "Let your partner's hands rest on your throat" / partner: "Place your hands on your partner's throat" |
| 8 | Worship your partner's body with kisses | Have your body worshipped with kisses | 2 | text: "Have your body worshipped with kisses" / partner: "Worship your partner's body with kisses" |
| 9 | Make your partner beg for it | Let your partner make you beg for it | 4 | text: "Let your partner make you beg for it" / partner: "Make your partner beg for it" |
| 10 | Use playful, naughty names for your partner | Be called playful, naughty names by your partner | 3 | text: "Be called playful, naughty names by your partner" / partner: "Use playful, naughty names for your partner" |
| 11 | Swallow your partner's release | Have your partner swallow your release | 3 | text: "Have your partner swallow your release" / partner: "Swallow your partner's release" |
| 12 | Finish on your partner's face | Let your partner finish on your face | 4 | text: "Let your partner finish on your face" / partner: "Finish on your partner's face" |
| 13 | Pull your partner's hair during sex | Have your hair pulled during sex | 4 | text: "Have your hair pulled during sex" / partner: "Pull your partner's hair during sex" |
| 14 | Put a collar on your partner | Wear a collar for your partner | 5 | text: "Wear a collar for your partner" / partner: "Put a collar on your partner" |
| 15 | Gag your partner during sex | Be gagged during sex | 5 | text: "Be gagged during sex" / partner: "Gag your partner during sex" |
| 16 | Blindfold your partner during sex | Be blindfolded during sex | 3 | text: "Be blindfolded during sex" / partner: "Blindfold your partner during sex" |
| 17 | Make your partner ask permission before they can cum | Ask permission before you're allowed to cum | 4 | text: "Ask permission before you're allowed to cum" / partner: "Make your partner ask permission before they can cum" |
| 18 | Choke your partner lightly during sex | Be choked lightly during sex | 5 | text: "Be choked lightly during sex" / partner: "Choke your partner lightly during sex" |
| 19 | Hold your partner down and fuck them | Be held down and fucked | 5 | text: "Be held down and fucked" / partner: "Hold your partner down and fuck them" |
| 20 | Worship your partner's body completely | Have your body worshipped and kissed everywhere | 3 | text: "Have your body worshipped and kissed everywhere" / partner: "Worship your partner's body completely" |
| 21 | Make your partner beg for it | Be made to beg for it | 4 | text: "Be made to beg for it" / partner: "Make your partner beg for it" |
| 22 | Call your partner a slut or whore during sex | Be called a slut or whore during sex | 5 | text: "Be called a slut or whore during sex" / partner: "Call your partner a slut or whore during sex" |
| 23 | Have your partner swallow | Swallow your partner's cum | 4 | text: "Swallow your partner's cum" / partner: "Have your partner swallow" |
| 24 | Fuck your partner's face | Have your face fucked | 5 | text: "Have your face fucked" / partner: "Fuck your partner's face" |
| 25 | Finish on your partner's face | Have your partner finish on your face | 5 | text: "Have your partner finish on your face" / partner: "Finish on your partner's face" |
# Toy Time (128 missing)
## 🔞 Leveling Up Together (45 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Attach a vibrator to your partner's inner thigh while you tease them elsewhere | Have a vibrator strapped to your thigh while your partner explores your body | 3 | text: "Have a vibrator strapped to your thigh while your partner explores your body" / partner: "Attach a vibrator to your partner's inner thigh while you tease them elsewhere" |
| 2 | Use a vibrating butt plug on your partner while giving them a slow handjob | Wear a vibrating plug while receiving a teasing handjob | 4 | text: "Wear a vibrating plug while receiving a teasing handjob" / partner: "Use a vibrating butt plug on your partner while giving them a slow handjob" |
| 3 | Blindfold your partner and make them guess which toy you're using | Guess the toy while blindfolded as your partner teases you | 3 | text: "Guess the toy while blindfolded as your partner teases you" / partner: "Blindfold your partner and make them guess which toy you're using" |
| 4 | Record your partner's reactions while you use a powerful toy on them | Let your partner film your pleasure as they use a toy on you | 4 | text: "Let your partner film your pleasure as they use a toy on you" / partner: "Record your partner's reactions while you use a powerful toy on them" |
| 5 | Tie your partner's wrists to the headboard and tease them with a vibrator | Be tied to the headboard and teased with a vibrator | 4 | text: "Be tied to the headboard and teased with a vibrator" / partner: "Tie your partner's wrists to the headboard and tease them with a vibrator" |
| 6 | Control the speed of your partner's toy while they try not to make noise | Use a toy while trying to stay quiet as your partner controls it | 4 | text: "Use a toy while trying to stay quiet as your partner controls it" / partner: "Control the speed of your partner's toy while they try not to make noise" |
| 7 | Wear a strap-on and let your partner control a remote vibrator in the base | Use a strap-on with a vibrator that your partner controls | 4 | text: "Use a strap-on with a vibrator that your partner controls" / partner: "Wear a strap-on and let your partner control a remote vibrator in the base" |
| 8 | Have your partner hold a vibrator on themselves while you penetrate them | Hold a vibrator on yourself while your partner penetrates you | 4 | text: "Hold a vibrator on yourself while your partner penetrates you" / partner: "Have your partner hold a vibrator on themselves while you penetrate them" |
| 9 | Use a textured sleeve on your partner while they watch porn together with you | Watch porn together while your partner uses a textured sleeve on you | 4 | text: "Watch porn together while your partner uses a textured sleeve on you" / partner: "Use a textured sleeve on your partner while they watch porn together with you" |
| 10 | Alternate between your mouth and a vibrator on your partner without warning | Be teased with unpredictable switches between oral and vibration | 4 | text: "Be teased with unpredictable switches between oral and vibration" / partner: "Alternate between your mouth and a vibrator on your partner without warning" |
| 11 | Perform a striptease and make your partner cum with a toy | Watch your partner strip before they make you cum with a toy | 4 | text: "Watch your partner strip before they make you cum with a toy" / partner: "Perform a striptease and make your partner cum with a toy" |
| 12 | Use a vibrating prostate massager on your partner during a handjob | Receive a handjob while wearing a vibrating prostate massager | 4 | text: "Receive a handjob while wearing a vibrating prostate massager" / partner: "Use a vibrating prostate massager on your partner during a handjob" |
| 13 | Perform oral while using nipple suction toys on your partner | Receive oral while your partner uses nipple suction toys on you | 4 | text: "Receive oral while your partner uses nipple suction toys on you" / partner: "Perform oral while using nipple suction toys on your partner" |
| 14 | Use a dildo on your partner to the beat of the music | Be penetrated by a dildo to the beat of the music | 4 | text: "Be penetrated by a dildo to the beat of the music" / partner: "Use a dildo on your partner to the beat of the music" |
| 15 | Use a warming lubricant and a glass dildo on your partner | Feel the contrast of warming lube with a cool glass toy inside you | 4 | text: "Feel the contrast of warming lube with a cool glass toy inside you" / partner: "Use a warming lubricant and a glass dildo on your partner" |
| 16 | Warm massage oil and a vibrating wand on your partner's entire body | Receive a full-body massage with warm oil and vibrations | 3 | text: "Receive a full-body massage with warm oil and vibrations" / partner: "Warm massage oil and a vibrating wand on your partner's entire body" |
| 17 | Insert anal beads into your partner slowly during foreplay | Have anal beads inserted slowly while your partner builds your arousal | 4 | text: "Have anal beads inserted slowly while your partner builds your arousal" / partner: "Insert anal beads into your partner slowly during foreplay" |
| 18 | Use a prostate or G-spot vibrator on your partner during oral | Receive oral while your partner stimulates your G-spot or P-spot | 4 | text: "Receive oral while your partner stimulates your G-spot or P-spot" / partner: "Use a prostate or G-spot vibrator on your partner during oral" |
| 19 | Blindfold your partner and tease them with ice and a warming vibrator | Be blindfolded and teased with ice and a warming vibrator | 4 | text: "Be blindfolded and teased with ice and a warming vibrator" / partner: "Blindfold your partner and tease them with ice and a warming vibrator" |
| 20 | Edge your partner with a wand, bringing them close twice before letting them finish | Be edged with a wand vibrator, brought close twice before release | 4 | text: "Be edged with a wand vibrator, brought close twice before release" / partner: "Edge your partner with a wand, bringing them close twice before letting them finish" |
| 21 | Control a remote vibrator inside your partner while out at dinner | Wear a remote-controlled vibrator while your partner teases you at dinner | 4 | text: "Wear a remote-controlled vibrator while your partner teases you at dinner" / partner: "Control a remote vibrator inside your partner while out at dinner" |
| 22 | Wear a vibrating cock ring while your partner rides you | Ride your partner while they wear a vibrating cock ring | 4 | text: "Ride your partner while they wear a vibrating cock ring" / partner: "Wear a vibrating cock ring while your partner rides you" |
| 23 | Have your partner wear vibrating panties while running errands together | Wear vibrating panties in public while your partner controls the intensity | 4 | text: "Wear vibrating panties in public while your partner controls the intensity" / partner: "Have your partner wear vibrating panties while running errands together" |
| 24 | Let your partner control a toy inside you during a video call with friends | Wear a hidden vibrator during a video call while your partner controls it | 4 | text: "Wear a hidden vibrator during a video call while your partner controls it" / partner: "Let your partner control a toy inside you during a video call with friends" |
| 25 | Drip massage candle wax on your partner while using a vibrator on them | Feel warm wax drip on your skin while your partner vibrates you | 4 | text: "Feel warm wax drip on your skin while your partner vibrates you" / partner: "Drip massage candle wax on your partner while using a vibrator on them" |
| 26 | Let your partner choose the toy and the setting while you lie back | Take full control of which toy and intensity to use on your partner | 4 | text: "Take full control of which toy and intensity to use on your partner" / partner: "Let your partner choose the toy and the setting while you lie back" |
| 27 | Take complete control of your partner's pleasure for an entire session | Surrender all control and let your partner decide everything | 5 | text: "Surrender all control and let your partner decide everything" / partner: "Take complete control of your partner's pleasure for an entire session" |
| 28 | Use a toy on your partner while lightly pulling their hair | Feel your hair pulled while your partner uses a toy on you | 5 | text: "Feel your hair pulled while your partner uses a toy on you" / partner: "Use a toy on your partner while lightly pulling their hair" |
| 29 | Blindfold your partner and make them hold completely still while you tease them | Stay perfectly still while blindfolded as your partner teases you with toys | 5 | text: "Stay perfectly still while blindfolded as your partner teases you with toys" / partner: "Blindfold your partner and make them hold completely still while you tease them" |
| 30 | Edge your partner until they're shaking, then finally let them finish | Be edged until you're trembling before your partner lets you come | 5 | text: "Be edged until you're trembling before your partner lets you come" / partner: "Edge your partner until they're shaking, then finally let them finish" |
| 31 | Use nipple clamps on your partner while penetrating them with a toy | Wear nipple clamps while your partner penetrates you with a toy | 5 | text: "Wear nipple clamps while your partner penetrates you with a toy" / partner: "Use nipple clamps on your partner while penetrating them with a toy" |
| 32 | Put a collar on your partner while pleasuring them with a vibrator | Wear a collar while your partner uses a vibrator on you | 5 | text: "Wear a collar while your partner uses a vibrator on you" / partner: "Put a collar on your partner while pleasuring them with a vibrator" |
| 33 | Restrain your partner's hands behind their back while using toys on them | Have your hands bound behind you while your partner pleasures you with toys | 5 | text: "Have your hands bound behind you while your partner pleasures you with toys" / partner: "Restrain your partner's hands behind their back while using toys on them" |
| 34 | Make your partner ask permission before they're allowed to orgasm | Ask your partner for permission before you're allowed to come | 5 | text: "Ask your partner for permission before you're allowed to come" / partner: "Make your partner ask permission before they're allowed to orgasm" |
| 35 | Blindfold and cuff your partner while using a wand on them | Be blindfolded and cuffed while your partner uses a wand on you | 5 | text: "Be blindfolded and cuffed while your partner uses a wand on you" / partner: "Blindfold and cuff your partner while using a wand on them" |
| 36 | Tie your partner's ankles to the bedposts and tease them with toys | Have your ankles tied while your partner teases you with toys | 5 | text: "Have your ankles tied while your partner teases you with toys" / partner: "Tie your partner's ankles to the bedposts and tease them with toys" |
| 37 | Edge your partner three times before finally letting them finish | Be edged three times before your partner allows you release | 4 | text: "Be edged three times before your partner allows you release" / partner: "Edge your partner three times before finally letting them finish" |
| 38 | Use a toy on your partner from behind while they grip the sheets | Grip the sheets while your partner uses a toy on you from behind | 4 | text: "Grip the sheets while your partner uses a toy on you from behind" / partner: "Use a toy on your partner from behind while they grip the sheets" |
| 39 | Use a thrusting toy on your partner while kissing their neck | Feel a thrusting toy while your partner kisses your neck | 4 | text: "Feel a thrusting toy while your partner kisses your neck" / partner: "Use a thrusting toy on your partner while kissing their neck" |
| 40 | Make your partner describe what they're feeling while you use a toy on them | Describe every sensation out loud while your partner toys you | 4 | text: "Describe every sensation out loud while your partner toys you" / partner: "Make your partner describe what they're feeling while you use a toy on them" |
| 41 | Use a suction toy on your partner while penetrating them | Feel suction stimulation while your partner penetrates you | 4 | text: "Feel suction stimulation while your partner penetrates you" / partner: "Use a suction toy on your partner while penetrating them" |
| 42 | Tease your partner with a wand through their underwear until they beg | Be teased through your underwear until you're begging for more | 4 | text: "Be teased through your underwear until you're begging for more" / partner: "Tease your partner with a wand through their underwear until they beg" |
| 43 | Use two different vibrators on your partner at the same time | Feel two vibrators stimulating different areas simultaneously | 4 | text: "Feel two vibrators stimulating different areas simultaneously" / partner: "Use two different vibrators on your partner at the same time" |
| 44 | Make your partner hold a vibrator on themselves while you watch | Hold a vibrator on yourself while your partner watches | 4 | text: "Hold a vibrator on yourself while your partner watches" / partner: "Make your partner hold a vibrator on themselves while you watch" |
| 45 | Use a vibrating plug on your partner while they go down on you | Wear a vibrating plug while giving your partner oral | 4 | text: "Wear a vibrating plug while giving your partner oral" / partner: "Use a vibrating plug on your partner while they go down on you" |
## 🔞 Starting Out (36 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Give your partner a backrub using a small vibrator | Receive a backrub with a small vibrator | 3 | text: "Receive a backrub with a small vibrator" / partner: "Give your partner a backrub using a small vibrator" |
| 2 | Tease your partner with a bullet vibrator over their clothes | Be teased with a bullet vibrator through your clothes | 3 | text: "Be teased with a bullet vibrator through your clothes" / partner: "Tease your partner with a bullet vibrator over their clothes" |
| 3 | Use a feather tickler on your blindfolded partner | Be blindfolded and teased with a feather tickler | 3 | text: "Be blindfolded and teased with a feather tickler" / partner: "Use a feather tickler on your blindfolded partner" |
| 4 | Have sex using a small dildo on your partner | Be penetrated with a small dildo during sex | 4 | text: "Be penetrated with a small dildo during sex" / partner: "Have sex using a small dildo on your partner" |
| 5 | Tease your partner with feathers and a heating massager | Be teased with feathers and a heating massager | 3 | text: "Be teased with feathers and a heating massager" / partner: "Tease your partner with feathers and a heating massager" |
| 6 | Press a wand vibrator against your partner during missionary | Have a wand vibrator pressed against you during missionary | 4 | text: "Have a wand vibrator pressed against you during missionary" / partner: "Press a wand vibrator against your partner during missionary" |
| 7 | Insert a small butt plug into your partner before you have sex | Have a small butt plug inserted before you have sex | 4 | text: "Have a small butt plug inserted before you have sex" / partner: "Insert a small butt plug into your partner before you have sex" |
| 8 | Wear a vibrating egg while you have sex | Have sex while your partner wears a vibrating egg | 4 | text: "Have sex while your partner wears a vibrating egg" / partner: "Wear a vibrating egg while you have sex" |
| 9 | Use a clitoral suction toy and a dildo on your partner simultaneously | Be penetrated while your partner uses a suction toy on your clit | 4 | text: "Be penetrated while your partner uses a suction toy on your clit" / partner: "Use a clitoral suction toy and a dildo on your partner simultaneously" |
| 10 | Use a textured sleeve on your partner's cock | Have a textured sleeve used on your cock | 4 | text: "Have a textured sleeve used on your cock" / partner: "Use a textured sleeve on your partner's cock" |
| 11 | Perform oral while using a small vibrator on your partner | Receive oral while your partner uses a small vibrator on you | 3 | text: "Receive oral while your partner uses a small vibrator on you" / partner: "Perform oral while using a small vibrator on your partner" |
| 12 | Blindfold your partner and penetrate them with a textured dildo | Be blindfolded and penetrated with a textured dildo | 4 | text: "Be blindfolded and penetrated with a textured dildo" / partner: "Blindfold your partner and penetrate them with a textured dildo" |
| 13 | Blindfold your partner and use a vibrating sleeve on their G-spot or P-spot | Be blindfolded while your partner stimulates your G-spot or P-spot with a vibrating sleeve | 4 | text: "Be blindfolded while your partner stimulates your G-spot or P-spot with a vibrating sleeve" / partner: "Blindfold your partner and use a vibrating sleeve on their G-spot or P-spot" |
| 14 | Blindfold your partner and tease their nipples with weighted clamps | Be blindfolded and have weighted clamps placed on your nipples | 5 | text: "Be blindfolded and have weighted clamps placed on your nipples" / partner: "Blindfold your partner and tease their nipples with weighted clamps" |
| 15 | Tie your partner's hands with a scarf and kiss their body | Have your hands tied with a scarf while your partner kisses you | 3 | text: "Have your hands tied with a scarf while your partner kisses you" / partner: "Tie your partner's hands with a scarf and kiss their body" |
| 16 | Record your partner using a toy on themselves | Let your partner record you using a toy on yourself | 5 | text: "Let your partner record you using a toy on yourself" / partner: "Record your partner using a toy on themselves" |
| 17 | Tease your partner with a toy under the covers in bed | Be teased with a toy under the blankets | 4 | text: "Be teased with a toy under the blankets" / partner: "Tease your partner with a toy under the covers in bed" |
| 18 | Shop for a new toy together online | Browse and pick out a new toy with your partner | 3 | text: "Browse and pick out a new toy with your partner" / partner: "Shop for a new toy together online" |
| 19 | Unbox a new toy together and explore how it feels | Discover a new toy together with your partner | 3 | text: "Discover a new toy together with your partner" / partner: "Unbox a new toy together and explore how it feels" |
| 20 | Use a warming massager on your partner's lower back | Feel warmth and vibration on your lower back | 3 | text: "Feel warmth and vibration on your lower back" / partner: "Use a warming massager on your partner's lower back" |
| 21 | Use a massage wand on your partner's back and shoulders | Receive a relaxing massage with a vibrating wand | 3 | text: "Receive a relaxing massage with a vibrating wand" / partner: "Use a massage wand on your partner's back and shoulders" |
| 22 | Trace a small vibrator slowly along your partner's arms and legs | Feel a vibrator traced gently across your limbs | 3 | text: "Feel a vibrator traced gently across your limbs" / partner: "Trace a small vibrator slowly along your partner's arms and legs" |
| 23 | Tease your partner's inner thighs with a bullet vibrator | Feel a bullet vibrator teasing your inner thighs | 3 | text: "Feel a bullet vibrator teasing your inner thighs" / partner: "Tease your partner's inner thighs with a bullet vibrator" |
| 24 | Use a vibrator on your partner while giving them a hand massage | Receive a hand massage while feeling vibrations elsewhere | 3 | text: "Receive a hand massage while feeling vibrations elsewhere" / partner: "Use a vibrator on your partner while giving them a hand massage" |
| 25 | Give your partner a foot massage using a small vibrator | Receive a foot massage with vibrating sensations | 3 | text: "Receive a foot massage with vibrating sensations" / partner: "Give your partner a foot massage using a small vibrator" |
| 26 | Hold a vibrator against your partner while cuddling on the couch | Feel vibrations while cuddling with your partner | 3 | text: "Feel vibrations while cuddling with your partner" / partner: "Hold a vibrator against your partner while cuddling on the couch" |
| 27 | Use a vibrating ring during foreplay | Feel the vibrating ring while making out with your partner | 3 | text: "Feel the vibrating ring while making out with your partner" / partner: "Use a vibrating ring during foreplay" |
| 28 | Tease your partner with a vibrator while they're still fully clothed | Feel vibrations through your clothes as your partner teases you | 3 | text: "Feel vibrations through your clothes as your partner teases you" / partner: "Tease your partner with a vibrator while they're still fully clothed" |
| 29 | Use a bullet vibrator on your partner while kissing them deeply | Be kissed while your partner uses a bullet vibrator on you | 3 | text: "Be kissed while your partner uses a bullet vibrator on you" / partner: "Use a bullet vibrator on your partner while kissing them deeply" |
| 30 | Let your partner choose which toy to use on you | Pick a toy from the collection to use on your partner | 3 | text: "Pick a toy from the collection to use on your partner" / partner: "Let your partner choose which toy to use on you" |
| 31 | Use a soft vibrator on your partner's neck and collarbone | Feel gentle vibrations on your neck and collarbone | 3 | text: "Feel gentle vibrations on your neck and collarbone" / partner: "Use a soft vibrator on your partner's neck and collarbone" |
| 32 | Use a small dildo on your partner while whispering what you want to do to them | Be penetrated with a toy while your partner whispers in your ear | 4 | text: "Be penetrated with a toy while your partner whispers in your ear" / partner: "Use a small dildo on your partner while whispering what you want to do to them" |
| 33 | Let your partner guide your hand while you hold a toy on them | Guide your partner's hand to show them where the toy feels best | 3 | text: "Guide your partner's hand to show them where the toy feels best" / partner: "Let your partner guide your hand while you hold a toy on them" |
| 34 | Let your partner use a toy on you while you touch yourself | Use a toy on your partner while they pleasure themselves | 4 | text: "Use a toy on your partner while they pleasure themselves" / partner: "Let your partner use a toy on you while you touch yourself" |
| 35 | Use a vibrator on your partner while they watch themselves in a mirror | Watch yourself in a mirror while your partner uses a toy on you | 4 | text: "Watch yourself in a mirror while your partner uses a toy on you" / partner: "Use a vibrator on your partner while they watch themselves in a mirror" |
| 36 | Use cooling lube with a small toy on your partner | Feel the cool sensation as your partner uses a toy with cooling lube | 4 | text: "Feel the cool sensation as your partner uses a toy with cooling lube" / partner: "Use cooling lube with a small toy on your partner" |
## ✨ The Deep End (47 missing)
| # | Current Text | Current Partner Text | Intensity | Inverse to Create |
|---|--------------|---------------------|-----------|-------------------|
| 1 | Lock your partner in a collar and leash, using toys on them while they kneel | Wear a collar and kneel while your partner uses toys on you | 5 | text: "Wear a collar and kneel while your partner uses toys on you" / partner: "Lock your partner in a collar and leash, using toys on them while they kneel" |
| 2 | Restrain your partner in a sex swing and use multiple toys on them | Be suspended in a swing while your partner pleasures you with toys | 5 | text: "Be suspended in a swing while your partner pleasures you with toys" / partner: "Restrain your partner in a sex swing and use multiple toys on them" |
| 3 | Use a toy and a vibrating plug on your partner | Be filled by a toy and a vibrating plug | 5 | text: "Be filled by a toy and a vibrating plug" / partner: "Use a toy and a vibrating plug on your partner" |
| 4 | Control a remote toy for your partner all day | Wear a remote toy for your partner to control all day | 4 | text: "Wear a remote toy for your partner to control all day" / partner: "Control a remote toy for your partner all day" |
| 5 | Suspend your partner's wrists above them and tease their body with a pinwheel and wand | Have your arms suspended while your partner torments you with sensation toys | 5 | text: "Have your arms suspended while your partner torments you with sensation toys" / partner: "Suspend your partner's wrists above them and tease their body with a pinwheel and wand" |
| 6 | Use two vibrating toys on your partner at once | Be filled by two vibrating toys at once | 5 | text: "Be filled by two vibrating toys at once" / partner: "Use two vibrating toys on your partner at once" |
| 7 | Restrain your partner's legs and use a suction toy | Be restrained while your partner uses a suction toy | 4 | text: "Be restrained while your partner uses a suction toy" / partner: "Restrain your partner's legs and use a suction toy" |
| 8 | Use a powerful wand on your partner during penetration | Feel a powerful wand while your partner penetrates you | 4 | text: "Feel a powerful wand while your partner penetrates you" / partner: "Use a powerful wand on your partner during penetration" |
| 9 | Slowly expand an inflatable toy inside your partner | Let your partner slowly expand an inflatable toy inside you | 5 | text: "Let your partner slowly expand an inflatable toy inside you" / partner: "Slowly expand an inflatable toy inside your partner" |
| 10 | Use sensation pads and a vibrator on your partner | Feel sensation pads and a vibrator on your thighs | 5 | text: "Feel sensation pads and a vibrator on your thighs" / partner: "Use sensation pads and a vibrator on your partner" |
| 11 | Use a rhythmic thrusting machine on your partner | Be pleasured by a thrusting machine while your partner controls it | 5 | text: "Be pleasured by a thrusting machine while your partner controls it" / partner: "Use a rhythmic thrusting machine on your partner" |
| 12 | Edge your partner five times before allowing them to peak | Let your partner edge you five times before you reach a peak | 4 | text: "Let your partner edge you five times before you reach a peak" / partner: "Edge your partner five times before allowing them to peak" |
| 13 | Use a TENS unit on your partner while simultaneously penetrating them with a toy | Feel electrical stimulation while your partner uses a toy inside you | 5 | text: "Feel electrical stimulation while your partner uses a toy inside you" / partner: "Use a TENS unit on your partner while simultaneously penetrating them with a toy" |
| 14 | Blindfold your partner and use a sensation wheel | Be blindfolded while your partner uses a sensation wheel | 5 | text: "Be blindfolded while your partner uses a sensation wheel" / partner: "Blindfold your partner and use a sensation wheel" |
| 15 | Make your partner ride a mounted dildo while you control a vibrator on them | Ride a dildo while your partner controls additional stimulation | 4 | text: "Ride a dildo while your partner controls additional stimulation" / partner: "Make your partner ride a mounted dildo while you control a vibrator on them" |
| 16 | Use a thrusting dildo on your partner while they're restrained and blindfolded | Be bound and blindfolded while a thrusting toy penetrates you | 5 | text: "Be bound and blindfolded while a thrusting toy penetrates you" / partner: "Use a thrusting dildo on your partner while they're restrained and blindfolded" |
| 17 | Bring your partner to a peak using only internal toys | Reach a peak using only internal stimulation | 4 | text: "Reach a peak using only internal stimulation" / partner: "Bring your partner to a peak using only internal toys" |
| 18 | Use a thrusting machine for anal play while using a wand on your partner | Experience a thrusting machine and wand stimulation simultaneously | 5 | text: "Experience a thrusting machine and wand stimulation simultaneously" / partner: "Use a thrusting machine for anal play while using a wand on your partner" |
| 19 | Tie your partner in a hogtie and edge them repeatedly | Be bound in a hogtie while your partner edges you | 5 | text: "Be bound in a hogtie while your partner edges you" / partner: "Tie your partner in a hogtie and edge them repeatedly" |
| 20 | Use a sensation wand on your partner's sensitive spots | Feel the tingle of a sensation wand on your body | 5 | text: "Feel the tingle of a sensation wand on your body" / partner: "Use a sensation wand on your partner's sensitive spots" |
| 21 | Attach weighted nipple clamps to your partner and use a powerful wand on them | Wear weighted clamps while your partner overwhelms you with a wand | 5 | text: "Wear weighted clamps while your partner overwhelms you with a wand" / partner: "Attach weighted nipple clamps to your partner and use a powerful wand on them" |
| 22 | Use an internal massager to tease your partner | Let your partner tease you with an internal massager | 4 | text: "Let your partner tease you with an internal massager" / partner: "Use an internal massager to tease your partner" |
| 23 | Restrain your partner and use a vibrator on them | Be restrained while your partner uses a vibrator on you | 5 | text: "Be restrained while your partner uses a vibrator on you" / partner: "Restrain your partner and use a vibrator on them" |
| 24 | Tease your partner while they wear a locked toy | Be teased by your partner while wearing a locked toy | 5 | text: "Be teased by your partner while wearing a locked toy" / partner: "Tease your partner while they wear a locked toy" |
| 25 | Restrain your partner with a spreader bar and tease them with a wand | Be restrained with a spreader bar while your partner teases you | 5 | text: "Be restrained with a spreader bar while your partner teases you" / partner: "Restrain your partner with a spreader bar and tease them with a wand" |
| 26 | Use a large plug and a powerful wand on your partner until they have multiple orgasms | Be filled and vibrated until you orgasm again and again | 5 | text: "Be filled and vibrated until you orgasm again and again" / partner: "Use a large plug and a powerful wand on your partner until they have multiple orgasms" |
| 27 | Make your partner count their edges out loud while you control the toy | Count each edge out loud while your partner decides when you've had enough | 5 | text: "Count each edge out loud while your partner decides when you've had enough" / partner: "Make your partner count their edges out loud while you control the toy" |
| 28 | Put your partner in predicament bondage where struggling increases toy intensity | Be bound so that every movement makes the vibrations stronger | 5 | text: "Be bound so that every movement makes the vibrations stronger" / partner: "Put your partner in predicament bondage where struggling increases toy intensity" |
| 29 | Restrain your partner in a strict position and methodically overstimulate every erogenous zone with toys | Be bound strictly while your partner systematically overwhelms every sensitive part of your body | 5 | text: "Be bound strictly while your partner systematically overwhelms every sensitive part of your body" / partner: "Restrain your partner in a strict position and methodically overstimulate every erogenous zone with toys" |
| 30 | Use a hollow plug on your partner so you can penetrate them while they're already filled | Wear a hollow plug while your partner penetrates you through it | 5 | text: "Wear a hollow plug while your partner penetrates you through it" / partner: "Use a hollow plug on your partner so you can penetrate them while they're already filled" |
| 31 | Edge your partner for an hour using various toys before allowing release | Be edged with different toys for an extended session before finally coming | 5 | text: "Be edged with different toys for an extended session before finally coming" / partner: "Edge your partner for an hour using various toys before allowing release" |
| 32 | Use a large toy on your partner with plenty of lube | Be filled by a large toy with plenty of lube | 4 | text: "Be filled by a large toy with plenty of lube" / partner: "Use a large toy on your partner with plenty of lube" |
| 33 | Use a rotating and thrusting toy on your partner while restraining their hips | Have your hips pinned while a toy rotates and thrusts inside you | 5 | text: "Have your hips pinned while a toy rotates and thrusts inside you" / partner: "Use a rotating and thrusting toy on your partner while restraining their hips" |
| 34 | Bring your partner to a peak while they are gagged | Let your partner bring you to a peak while gagged | 5 | text: "Let your partner bring you to a peak while gagged" / partner: "Bring your partner to a peak while they are gagged" |
| 35 | Use clover clamps on your partner that tighten when pulled while you penetrate them with a toy | Feel clamps tighten with each thrust as your partner toys you | 5 | text: "Feel clamps tighten with each thrust as your partner toys you" / partner: "Use clover clamps on your partner that tighten when pulled while you penetrate them with a toy" |
| 36 | Connect nipple clamps with a chain to your partner's collar while using a toy on them | Wear connected clamps and collar while your partner pleasures you with a toy | 5 | text: "Wear connected clamps and collar while your partner pleasures you with a toy" / partner: "Connect nipple clamps with a chain to your partner's collar while using a toy on them" |
| 37 | Use a large textured dildo on your partner while they wear a ball gag | Be gagged and stretched by a large textured toy | 5 | text: "Be gagged and stretched by a large textured toy" / partner: "Use a large textured dildo on your partner while they wear a ball gag" |
| 38 | Use a thrusting toy on your partner while spanking them | Be penetrated with a thrusting toy while your partner spanks you | 5 | text: "Be penetrated with a thrusting toy while your partner spanks you" / partner: "Use a thrusting toy on your partner while spanking them" |
| 39 | Use a pump on your partner to increase sensitivity before using other toys | Have your sensitivity heightened by a pump before your partner uses toys on you | 5 | text: "Have your sensitivity heightened by a pump before your partner uses toys on you" / partner: "Use a pump on your partner to increase sensitivity before using other toys" |
| 40 | Tie your partner face down and use a thrusting toy on them from behind | Be bound face down while a toy thrusts into you | 5 | text: "Be bound face down while a toy thrusts into you" / partner: "Tie your partner face down and use a thrusting toy on them from behind" |
| 41 | Bind your partner completely immobile and use toys on them until you decide they're done | Be completely restrained while your partner controls all stimulation | 5 | text: "Be completely restrained while your partner controls all stimulation" / partner: "Bind your partner completely immobile and use toys on them until you decide they're done" |
| 42 | Strap vibrators to multiple parts of your partner's body and turn them all on at once | Have vibrators attached to several erogenous zones buzzing simultaneously | 5 | text: "Have vibrators attached to several erogenous zones buzzing simultaneously" / partner: "Strap vibrators to multiple parts of your partner's body and turn them all on at once" |
| 43 | Strap a wand to your partner and leave it on medium while you do other things to them | Have a wand strapped to you as constant stimulation while your partner plays | 5 | text: "Have a wand strapped to you as constant stimulation while your partner plays" / partner: "Strap a wand to your partner and leave it on medium while you do other things to them" |
| 44 | Use electro-stimulation on your partner while they edge themselves with a toy | Shock yourself lightly while edging with a toy at your partner's command | 5 | text: "Shock yourself lightly while edging with a toy at your partner's command" / partner: "Use electro-stimulation on your partner while they edge themselves with a toy" |
| 45 | Make your partner edge themselves while you watch and give instructions | Edge yourself under your partner's commands while they watch | 5 | text: "Edge yourself under your partner's commands while they watch" / partner: "Make your partner edge themselves while you watch and give instructions" |
| 46 | Blindfold your partner and make them guess how many toys are inside them | Guess how many toys your partner has put inside you while blindfolded | 4 | text: "Guess how many toys your partner has put inside you while blindfolded" / partner: "Blindfold your partner and make them guess how many toys are inside them" |
| 47 | Tease your partner right to the edge before stopping | Be teased to the edge before your partner stops | 5 | text: "Be teased to the edge before your partner stops" / partner: "Tease your partner right to the edge before stopping" |
+4
View File
@@ -15,6 +15,10 @@
"turbo": "^2.3.3",
"typescript": "^5.3.3"
},
"optionalDependencies": {
"@rollup/rollup-linux-arm64-musl": "4.54.0",
"@rollup/rollup-linux-x64-musl": "4.54.0"
},
"engines": {
"node": ">=20"
}
+2 -1
View File
@@ -26,6 +26,7 @@
"rollup": "4.54.0"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-musl": "4.54.0"
"@rollup/rollup-linux-x64-musl": "4.54.0",
"@rollup/rollup-linux-arm64-musl": "4.54.0"
}
}
+2
View File
@@ -41,6 +41,8 @@ export interface Question {
allowed_couple_genders?: string[] | null;
target_user_genders?: string[] | null;
required_props?: string[] | null;
/** References the primary question that this is an inverse of (e.g., give vs receive). NULL means this is a primary/standalone question. */
inverse_of?: string | null;
created_at: string;
deleted_at?: string | null;
}
+5
View File
@@ -0,0 +1,5 @@
packages:
- "apps/admin"
- "apps/mobile"
- "apps/supabase"
- "packages/*"