Skip to content
Back to skills

Incognito Mode Patterns

ASecurity

Incognito mode patterns for ephemeral conversations with blank slate option. Controls tool access (write tools always disabled, read tools configurable), custom instruction application, and inactivity auto-cleanup. Triggers on "incognito", "ephemeral", "blank slate", "private mode", "no memory", "read tools", "write tools", "custom instructions", "incognito settings", "inactivity timeout".

  • 666 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 2, 2026
ai-agentstypescriptapifrontendbackend

Works with

  • api

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add majiayu000/claude-skill-registry --skill incognito-mode-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Incognito Mode Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Incognito Mode Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-incognito-mode-patterns/badge)](https://www.skillsdirectory.com/skills/majiayu000-incognito-mode-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: incognito-mode-patterns
description: Incognito mode patterns for ephemeral conversations with blank slate option. Controls tool access (write tools always disabled, read tools configurable), custom instruction application, and inactivity auto-cleanup. Triggers on "incognito", "ephemeral", "blank slate", "private mode", "no memory", "read tools", "write tools", "custom instructions", "incognito settings", "inactivity timeout".
---

# Incognito Mode Patterns

Incognito conversations provide ephemeral, privacy-focused chat sessions with configurable tool access and optional blank slate mode (skips memories and custom instructions).

## Core Behavior

**Always disabled in incognito:**
- Write tools: saveMemory, deleteMemory, manageTasks
- Canvas/Document mode tools

**Configurable in incognito:**
- Read tools: search (files, notes, tasks, history, memories, knowledge bank)
- Custom instructions application
- Memory injection

## Schema Structure

### Conversation Table Fields

```typescript
// From conversations.ts:30-36
isIncognito: v.optional(v.boolean()),
incognitoSettings: v.optional(
  v.object({
    enableReadTools: v.optional(v.boolean()),
    applyCustomInstructions: v.optional(v.boolean()),
    inactivityTimeoutMinutes: v.optional(v.number()),
  }),
),
```

### Creation Pattern

```typescript
// From conversations.ts:57-67
...(args.isIncognito && {
  isIncognito: true,
  incognitoSettings: {
    enableReadTools: args.incognitoSettings?.enableReadTools ?? true,
    applyCustomInstructions:
      args.incognitoSettings?.applyCustomInstructions ?? true,
    inactivityTimeoutMinutes:
      args.incognitoSettings?.inactivityTimeoutMinutes,
    lastActivityAt: now,
  },
}),
```

**Default behavior**: Read tools enabled, custom instructions applied unless explicitly disabled.

## Tool Filtering Logic

### Write Tools: Always Disabled

```typescript
// From tools.ts:167-210
// Write tools: DISABLED for incognito
if (!isIncognito) {
  // Memory write tools
  if (enableMemoryWriteTools) {
    tools.saveMemory = createMemorySaveTool(ctx, userId);
    if (memoryExtractionLevel !== "passive") {
      tools.deleteMemory = createMemoryDeleteTool(ctx, userId);
    }
  }

  // Task manager
  tools.manageTasks = createTaskManagerTool(ctx, userId, conversation?.projectId);

  // Document mode tools
  tools.enterDocumentMode = createEnterDocumentModeTool(ctx, conversationId);
  if (isDocumentMode) {
    tools.exitDocumentMode = createExitDocumentModeTool(ctx, conversationId);
    tools.createDocument = createDocumentTool(ctx, userId, conversationId);
    tools.updateDocument = createUpdateDocumentTool(ctx, userId, conversationId);
    tools.readDocument = createReadDocumentTool(ctx, userId, conversationId);
    tools.resolveConflict = createResolveConflictTool(ctx, userId, conversationId);
  }
}
```

### Read Tools: Configurable

```typescript
// From tools.ts:86-97
const isIncognito = conversation?.isIncognito ?? false;
const incognitoSettings = conversation?.incognitoSettings;
const enableReadTools = !isIncognito || incognitoSettings?.enableReadTools !== false;

// Memory tool settings based on extraction level
const enableMemoryWriteTools = !isIncognito && memoryExtractionLevel !== "none";
const enableMemoryReadTools = enableReadTools && memoryExtractionLevel !== "none";
```

```typescript
// From tools.ts:212-238
// Read tools: Configurable for incognito (search user data)
if (enableReadTools) {
  // Memory search: respects extraction level
  if (enableMemoryReadTools) {
    tools.searchMemories = createMemorySearchTool(ctx, userId);
  }

  // Other search tools
  tools.searchFiles = createSearchFilesTool(ctx, userId);
  tools.searchNotes = createSearchNotesTool(ctx, userId);
  tools.searchTasks = createSearchTasksTool(ctx, userId);
  tools.queryHistory = createQueryHistoryTool(ctx, userId, conversationId);
  tools.searchAll = createSearchAllTool(ctx, userId, conversationId, searchCache, budgetState);
  tools.searchKnowledgeBank = createSearchKnowledgeBankTool(ctx, userId, conversation?.projectId);
}
```

**Logic**: `enableReadTools` defaults to `true` unless explicitly set to `false` via `incognitoSettings.enableReadTools`.

### Capability Tools: Always Available

Stateless tools (calculator, datetime, web search, URL reader, code execution, weather, YouTube, file docs) are always enabled regardless of incognito mode.

## Blank Slate Mode

Skip memories and custom instructions when `applyCustomInstructions: false`.

```typescript
// From systemBuilder.ts:59-62
const isBlankSlate =
  conversation?.isIncognito &&
  conversation?.incognitoSettings?.applyCustomInstructions === false;
```

### Skipped Sections

```typescript
// From systemBuilder.ts:95-133
// === 2. IDENTITY MEMORIES ===
// Skip for incognito blank slate mode
if (!isBlankSlate) {
  const identityMemories = await ctx.runQuery(
    internal.memories.search.getIdentityMemories,
    { userId: args.userId, limit: 20 }
  );
  // ... format and inject
}
```

```typescript
// From systemBuilder.ts:135-142
// === 3. CONTEXTUAL MEMORIES ===
// Skip for incognito blank slate mode
if (args.prefetchedMemories && !isBlankSlate) {
  systemMessages.push({
    role: "system",
    content: `## Contextual Memories\n\n${args.prefetchedMemories}`,
  });
}
```

```typescript
// From systemBuilder.ts:160-186
// === 4.25. KNOWLEDGE BANK ===
// Skip for incognito blank slate mode
if (!isBlankSlate && args.hasFunctionCalling) {
  const hasKnowledge = await ctx.runQuery(
    internal.knowledgeBank.index.hasKnowledge,
    { userId: args.userId }
  );
  const kbPrompt = getKnowledgeBankSystemPrompt(hasKnowledge);
  if (kbPrompt) {
    systemMessages.push({ role: "system", content: kbPrompt });
  }
}
```

```typescript
// From systemBuilder.ts:227-304
// === 6. USER CUSTOM INSTRUCTIONS ===
// Skip for incognito blank slate mode
if (customInstructions?.enabled && !isBlankSlate) {
  // ... build and inject user preferences
}
```

**Effect**: Blank slate mode provides completely fresh AI behavior without personalization or history context.

## Inactivity Timeout

Optional auto-cleanup for incognito conversations.

### Field Structure

```typescript
incognitoSettings: {
  inactivityTimeoutMinutes?: number;  // Optional timeout in minutes
  lastActivityAt: number;             // Timestamp of last activity
}
```

**Implementation**: Set during creation, updated on message activity. Cleanup logic runs via scheduled job (not shown in provided files but referenced in schema).

## Usage Patterns

### Standard Incognito (Read Tools Enabled)

```typescript
await ctx.runMutation(api.conversations.create, {
  model: "openai:gpt-5-mini",
  isIncognito: true,
  incognitoSettings: {
    enableReadTools: true,          // Can search files/notes/tasks
    applyCustomInstructions: true,  // Apply user preferences
  },
});
```

**Tools**: Web search, URL reader, code execution + file/note/task/history search. No writes.

### Strict Incognito (Read Tools Disabled)

```typescript
await ctx.runMutation(api.conversations.create, {
  model: "openai:gpt-5-mini",
  isIncognito: true,
  incognitoSettings: {
    enableReadTools: false,         // No data access
    applyCustomInstructions: true,  // Still apply preferences
  },
});
```

**Tools**: Only capability tools (web search, calculator, datetime, URL reader, code execution). No data access.

### Blank Slate Mode

```typescript
await ctx.runMutation(api.conversations.create, {
  model: "openai:gpt-5-mini",
  isIncognito: true,
  incognitoSettings: {
    enableReadTools: false,              // No data access
    applyCustomInstructions: false,      // Skip memories + custom instructions
    inactivityTimeoutMinutes: 60,        // Auto-delete after 1 hour of inactivity
  },
});
```

**Tools**: Only capability tools. **System prompt**: Skips identity memories, contextual memories, knowledge bank, and custom instructions. Fully anonymous.

## Key Files

- `packages/backend/convex/conversations.ts` - Schema + creation mutation (lines 30-112)
- `packages/backend/convex/generation/tools.ts` - Tool filtering logic (lines 42-241)
- `packages/backend/convex/lib/prompts/systemBuilder.ts` - Blank slate prompt filtering (lines 59-304)

## Anti-Patterns

**Don't assume incognito = no read tools**. Default is `enableReadTools: true`. Must explicitly set to `false` for strict privacy.

**Don't confuse blank slate with incognito**. Incognito only controls tool access. Blank slate (`applyCustomInstructions: false`) controls system prompt personalization.

**Don't use incognito for temporary chats**. Use `inactivityTimeoutMinutes` for auto-cleanup. Otherwise incognito conversations persist like normal ones.

**Don't expose write tools in incognito UI**. Backend enforces this but frontend must not offer task creation, memory saving, or canvas tools when `isIncognito: true`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.