Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# Privacy Policy for Panelize

**Last Updated: February 3, 2026**
**Last Updated: July 15, 2026**

## Overview

Panelize is committed to protecting your privacy. This privacy policy explains what data the extension collects, how it's used, and your control over it.

**In short:** Panelize stores all data locally on your device. We do not collect, transmit, or sell any of your personal information to third parties or external servers.
**In short:** Panelize stores extension data in browser-managed storage. Chrome may synchronize supported preferences across your signed-in browsers when browser sync is enabled. We do not collect, transmit, or sell your personal information through Panelize-operated servers.

---

## What Data We Collect and Store

### 1. Data Stored Locally on Your Device
### 1. Data Stored in Your Browser

All of the following data is stored **exclusively in your browser's local storage** and never leaves your device:
The following data is stored in browser-managed storage. Prompt library data remains local to the browser profile. Supported preferences may use Chrome's sync storage and therefore may be synchronized by Chrome according to your browser account and sync settings:

#### Prompt Library Data
- Prompt titles, content, categories, and tags you create
Expand All @@ -31,6 +31,7 @@ All of the following data is stored **exclusively in your browser's local storag
- Enter key behavior preferences
- Source URL placement preferences
- Language preferences
- Experimental Claude model preference

**Purpose:** To maintain your personalized extension configuration.

Expand Down Expand Up @@ -73,9 +74,11 @@ All data collected by Panelize is used solely for providing extension functional

### AI Provider Websites

Panelize loads AI provider websites (ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, and Google AI Mode) inside embedded panels. These providers operate under their own privacy policies.
Panelize loads AI provider websites (ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen, and Google AI Mode) inside embedded panels. These providers operate under their own privacy policies.

When you interact with these AI providers through Panelize, you are subject to their respective privacy policies. Panelize does not intercept or store the content of your conversations with these services.
When you interact with these AI providers through Panelize, you are subject to their respective privacy policies. Panelize does not collect or store the content of your conversations with these services.

If you explicitly select an experimental Claude model in Panelize, the extension locally processes Claude's outgoing completion request only to insert or replace its top-level model identifier. This processing happens in your browser. Panelize does not log, store, collect, or send the request body or conversation content to Panelize developers or Panelize-operated servers. The modified request continues directly to Claude as part of the chat you initiated. Selecting **Claude default** disables this request modification.

### Cookie Access

Expand All @@ -93,16 +96,16 @@ Panelize loads the Material Symbols font from Google Fonts for UI icons. This re

## Data Storage and Security

### Local Storage Only
### Browser-Managed Storage

All extension data is stored in your browser using:
- **Chrome Storage API:** For settings and preferences
- **IndexedDB:** For prompts

This data:
- Remains on your device
- Is managed by your browser; supported preferences may sync through Chrome when browser sync is enabled
- Is not accessible to websites you visit
- Is not transmitted over the network
- Is not transmitted to Panelize-operated servers
- Is protected by browser security mechanisms

### Data Retention
Expand Down Expand Up @@ -213,6 +216,7 @@ If you are a California resident:
- Store your prompts and settings locally on your device
- Use local browser storage to remember your preferences
- Temporarily process selected text or page content on-device when you use the context menu
- Locally set Claude's requested model when you explicitly enable experimental model selection
- Load AI provider websites inside embedded panels
- Check for updates on GitHub

Expand Down
20 changes: 20 additions & 0 deletions _locales/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "Zum Popup-Modus wechseln"
},
"openProviderTopLevel": { "message": "Claude öffnen" },
"openProviderTopLevelTitle": { "message": "In neuem Tab öffnen" },
"embeddedModelLimitNotice": { "message": "Claude schränkt die Modellauswahl in eingebetteten Ansichten ein. Panelize kann experimentell ein Modell anfordern." },
"embeddedModelOverrideNotice": {
"message": "Experimentelle Anfrage: $MODEL$. Die Verfügbarkeit hängt von deinem Claude-Konto ab.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Claude-Standard" },
"claudeModelExperimentalBadge": { "message": "Experimentell" },
"claudeModelExperimentalTitle": { "message": "Experimenteller Kompatibilitätsmodus" },
"claudeModelSelectTitle": { "message": "Claude-Modellanfrage" },
"claudeModelRequestedStatus": {
"message": "$MODEL$ angefordert",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "Die Modellüberschreibung ist nicht verfügbar. Claude-Standard wurde aktiviert." },
"claudeModelRequestRejected": {
"message": "Die Modellanforderung wurde abgelehnt (HTTP $STATUS$). Claude-Standard wurde aktiviert.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "Öffnungsmodus aktualisiert"
},
Expand Down
41 changes: 40 additions & 1 deletion _locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,46 @@
"message": "Open in new tab"
},
"embeddedModelLimitNotice": {
"message": "Claude may show limited model options when embedded. Open Claude in a normal tab to use the regular model selector."
"message": "Claude limits model selection when embedded. Panelize can experimentally request a model."
},
"embeddedModelOverrideNotice": {
"message": "Experimental request: $MODEL$. Availability depends on your Claude account.",
"placeholders": {
"model": {
"content": "$1"
}
}
},
"claudeModelDefault": {
"message": "Claude default"
},
"claudeModelExperimentalBadge": {
"message": "Experimental"
},
"claudeModelExperimentalTitle": {
"message": "Experimental compatibility mode"
},
"claudeModelSelectTitle": {
"message": "Claude model request"
},
"claudeModelRequestedStatus": {
"message": "Requested $MODEL$",
"placeholders": {
"model": {
"content": "$1"
}
}
},
"claudeModelOverrideUnavailable": {
"message": "Model override is unavailable. Switched to Claude default."
},
"claudeModelRequestRejected": {
"message": "Model request was rejected (HTTP $STATUS$). Switched to Claude default.",
"placeholders": {
"status": {
"content": "$1"
}
}
},
"msgOpenModeUpdated": {
"message": "Open mode updated"
Expand Down
20 changes: 20 additions & 0 deletions _locales/es/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "Cambiar a modo ventana emergente"
},
"openProviderTopLevel": { "message": "Abrir Claude" },
"openProviderTopLevelTitle": { "message": "Abrir en una pestaña nueva" },
"embeddedModelLimitNotice": { "message": "Claude limita la selección de modelos cuando está integrado. Panelize puede solicitar un modelo de forma experimental." },
"embeddedModelOverrideNotice": {
"message": "Solicitud experimental: $MODEL$. La disponibilidad depende de tu cuenta de Claude.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Predeterminado de Claude" },
"claudeModelExperimentalBadge": { "message": "Experimental" },
"claudeModelExperimentalTitle": { "message": "Modo de compatibilidad experimental" },
"claudeModelSelectTitle": { "message": "Solicitud de modelo de Claude" },
"claudeModelRequestedStatus": {
"message": "Solicitado $MODEL$",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "La selección experimental no está disponible. Se cambió al modelo predeterminado de Claude." },
"claudeModelRequestRejected": {
"message": "La solicitud de modelo fue rechazada (HTTP $STATUS$). Se cambió al modelo predeterminado de Claude.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "Modo de apertura actualizado"
},
Expand Down
20 changes: 20 additions & 0 deletions _locales/fr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "Passer au mode fenêtre popup"
},
"openProviderTopLevel": { "message": "Ouvrir Claude" },
"openProviderTopLevelTitle": { "message": "Ouvrir dans un nouvel onglet" },
"embeddedModelLimitNotice": { "message": "Claude limite la sélection des modèles lorsqu’il est intégré. Panelize peut demander un modèle de manière expérimentale." },
"embeddedModelOverrideNotice": {
"message": "Demande expérimentale : $MODEL$. La disponibilité dépend de votre compte Claude.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Modèle Claude par défaut" },
"claudeModelExperimentalBadge": { "message": "Expérimental" },
"claudeModelExperimentalTitle": { "message": "Mode de compatibilité expérimental" },
"claudeModelSelectTitle": { "message": "Demande de modèle Claude" },
"claudeModelRequestedStatus": {
"message": "$MODEL$ demandé",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "La sélection expérimentale n’est pas disponible. Retour au modèle Claude par défaut." },
"claudeModelRequestRejected": {
"message": "La demande de modèle a été refusée (HTTP $STATUS$). Retour au modèle Claude par défaut.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "Mode d'ouverture mis à jour"
},
Expand Down
20 changes: 20 additions & 0 deletions _locales/it/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "Passa alla modalità finestra popup"
},
"openProviderTopLevel": { "message": "Apri Claude" },
"openProviderTopLevelTitle": { "message": "Apri in una nuova scheda" },
"embeddedModelLimitNotice": { "message": "Claude limita la selezione dei modelli quando è incorporato. Panelize può richiedere un modello in via sperimentale." },
"embeddedModelOverrideNotice": {
"message": "Richiesta sperimentale: $MODEL$. La disponibilità dipende dal tuo account Claude.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Predefinito di Claude" },
"claudeModelExperimentalBadge": { "message": "Sperimentale" },
"claudeModelExperimentalTitle": { "message": "Modalità di compatibilità sperimentale" },
"claudeModelSelectTitle": { "message": "Richiesta modello Claude" },
"claudeModelRequestedStatus": {
"message": "Richiesto $MODEL$",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "La selezione sperimentale non è disponibile. È stato ripristinato il modello predefinito di Claude." },
"claudeModelRequestRejected": {
"message": "La richiesta del modello è stata rifiutata (HTTP $STATUS$). È stato ripristinato il modello predefinito di Claude.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "Modalità di apertura aggiornata"
},
Expand Down
20 changes: 20 additions & 0 deletions _locales/ja/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "ポップアップモードに切り替え"
},
"openProviderTopLevel": { "message": "Claude を開く" },
"openProviderTopLevelTitle": { "message": "新しいタブで開く" },
"embeddedModelLimitNotice": { "message": "埋め込み表示では Claude のモデル選択が制限されます。Panelize から実験的にモデルを指定できます。" },
"embeddedModelOverrideNotice": {
"message": "実験的なリクエスト:$MODEL$。利用可否は Claude アカウントによって異なります。",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Claude のデフォルト" },
"claudeModelExperimentalBadge": { "message": "実験的" },
"claudeModelExperimentalTitle": { "message": "実験的な互換モード" },
"claudeModelSelectTitle": { "message": "Claude モデルのリクエスト" },
"claudeModelRequestedStatus": {
"message": "$MODEL$ をリクエストしました",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "モデル指定を利用できません。Claude のデフォルトに戻しました。" },
"claudeModelRequestRejected": {
"message": "モデルのリクエストが拒否されました(HTTP $STATUS$)。Claude のデフォルトに戻しました。",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "開くモードを更新しました"
},
Expand Down
20 changes: 20 additions & 0 deletions _locales/ko/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "팝업 모드로 전환"
},
"openProviderTopLevel": { "message": "Claude 열기" },
"openProviderTopLevelTitle": { "message": "새 탭에서 열기" },
"embeddedModelLimitNotice": { "message": "Claude는 임베드된 화면에서 모델 선택을 제한합니다. Panelize가 실험적으로 모델을 요청할 수 있습니다." },
"embeddedModelOverrideNotice": {
"message": "실험적 요청: $MODEL$. 사용 가능 여부는 Claude 계정에 따라 달라집니다.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Claude 기본값" },
"claudeModelExperimentalBadge": { "message": "실험적" },
"claudeModelExperimentalTitle": { "message": "실험적 호환 모드" },
"claudeModelSelectTitle": { "message": "Claude 모델 요청" },
"claudeModelRequestedStatus": {
"message": "$MODEL$ 요청됨",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "모델 재정의를 사용할 수 없습니다. Claude 기본값으로 전환했습니다." },
"claudeModelRequestRejected": {
"message": "모델 요청이 거부되었습니다(HTTP $STATUS$). Claude 기본값으로 전환했습니다.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "열기 모드가 업데이트되었습니다"
},
Expand Down
20 changes: 20 additions & 0 deletions _locales/ru/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,26 @@
"switchToPopupModeTitle": {
"message": "Переключиться в режим всплывающего окна"
},
"openProviderTopLevel": { "message": "Открыть Claude" },
"openProviderTopLevelTitle": { "message": "Открыть в новой вкладке" },
"embeddedModelLimitNotice": { "message": "Claude ограничивает выбор моделей во встроенном режиме. Panelize может экспериментально запросить определённую модель." },
"embeddedModelOverrideNotice": {
"message": "Экспериментальный запрос: $MODEL$. Доступность зависит от вашей учётной записи Claude.",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelDefault": { "message": "Модель Claude по умолчанию" },
"claudeModelExperimentalBadge": { "message": "Экспериментально" },
"claudeModelExperimentalTitle": { "message": "Экспериментальный режим совместимости" },
"claudeModelSelectTitle": { "message": "Запрос модели Claude" },
"claudeModelRequestedStatus": {
"message": "Запрошена модель $MODEL$",
"placeholders": { "model": { "content": "$1" } }
},
"claudeModelOverrideUnavailable": { "message": "Переопределение модели недоступно. Выбрана модель Claude по умолчанию." },
"claudeModelRequestRejected": {
"message": "Запрос модели отклонён (HTTP $STATUS$). Выбрана модель Claude по умолчанию.",
"placeholders": { "status": { "content": "$1" } }
},
"msgOpenModeUpdated": {
"message": "Режим открытия обновлен"
},
Expand Down
41 changes: 40 additions & 1 deletion _locales/zh_CN/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,46 @@
"message": "在新标签页中打开"
},
"embeddedModelLimitNotice": {
"message": "Claude 在嵌入时可能只显示有限模型。请在普通标签页中打开 Claude,以使用常规模型选择器。"
"message": "Claude 会限制内嵌页面中的模型选择。Panelize 可以通过实验性方式请求指定模型。"
},
"embeddedModelOverrideNotice": {
"message": "实验性请求:$MODEL$。是否可用取决于你的 Claude 账号。",
"placeholders": {
"model": {
"content": "$1"
}
}
},
"claudeModelDefault": {
"message": "Claude 默认模型"
},
"claudeModelExperimentalBadge": {
"message": "实验性"
},
"claudeModelExperimentalTitle": {
"message": "实验性兼容模式"
},
"claudeModelSelectTitle": {
"message": "Claude 模型请求"
},
"claudeModelRequestedStatus": {
"message": "已请求 $MODEL$",
"placeholders": {
"model": {
"content": "$1"
}
}
},
"claudeModelOverrideUnavailable": {
"message": "模型覆盖不可用,已切换到 Claude 默认模型。"
},
"claudeModelRequestRejected": {
"message": "模型请求被拒绝(HTTP $STATUS$),已切换到 Claude 默认模型。",
"placeholders": {
"status": {
"content": "$1"
}
}
},
"msgOpenModeUpdated": {
"message": "打开模式已更新"
Expand Down
Loading
Loading