Skip to content

Commit 896330f

Browse files
tech-sumitclaude
andcommitted
chore(extension): prep Chrome Web Store submission
- manifest v1.0.0; drop unused 'scripting' + redundant 'activeTab' perms (smaller permission footprint → smoother review); add homepage_url - STORE-LISTING.md: descriptions, single-purpose, per-permission justifications, privacy-practice answers, screenshot specs, checklist - host a privacy policy at web /privacy (required for OAuth/Drive apps); link it from the landing footer - update build-smoke to assert the trimmed permission set Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent f409c22 commit 896330f

6 files changed

Lines changed: 231 additions & 6 deletions

File tree

apps/extension/STORE-LISTING.md

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# Chrome Web Store submission — PromptVault
2+
3+
Everything you need to fill the CWS dashboard. The upload artifact is
4+
`apps/extension/promptvault-extension.zip` (built from `dist/`).
5+
6+
---
7+
8+
## Item basics
9+
10+
- **Name:** PromptVault
11+
- **Version:** 1.0.0 (from `manifest.json`)
12+
- **Category:** Productivity
13+
- **Language:** English (United Kingdom) / English
14+
15+
## Short description (≤ 132 chars)
16+
17+
```
18+
Save reusable AI prompts in your own Google Drive and inject them into Claude, ChatGPT, Gemini, or any text field.
19+
```
20+
21+
## Detailed description
22+
23+
```
24+
PromptVault is a clipboard manager built for AI prompts. Save the instructions you retype every day — prefaces, guardrails, personas, personal context, snippets — and drop any of them into Claude, ChatGPT, Gemini, or any text field on the web with a click or a right-click.
25+
26+
WHY PROMPTVAULT
27+
• Your library, your storage. Prompts live in YOUR Google Drive (in a single PromptVault folder), not on our servers — because we don't run any.
28+
• Works everywhere you type. Inject a saved prompt at the cursor in any website's text box, or capture selected text into your library.
29+
• Organised. Categories, tags, and instant search.
30+
• Private. No accounts to create with us, no analytics, no telemetry, no ads.
31+
• Free forever. It uses storage you already own.
32+
33+
HOW IT WORKS
34+
1. Install and open the setup page.
35+
2. Connect your Google account (least-privilege access — PromptVault can only see the files it creates).
36+
3. Save prompts, then right-click or use the toolbar popup to inject them anywhere.
37+
38+
The companion web app at https://prompt-vault-01.web.app manages the same library from any browser.
39+
40+
PromptVault requests only the drive.file and email scopes, and its use of Google user data follows the Google API Services User Data Policy, including the Limited Use requirements.
41+
```
42+
43+
## Privacy policy URL (required)
44+
45+
```
46+
https://prompt-vault-01.web.app/privacy
47+
```
48+
49+
## Homepage / support URL
50+
51+
```
52+
https://prompt-vault-01.web.app
53+
```
54+
55+
---
56+
57+
## Single purpose (required field)
58+
59+
```
60+
PromptVault stores reusable text prompts in the user's own Google Drive and inserts a chosen prompt into the focused text field on any website.
61+
```
62+
63+
## Permission justifications (paste one per permission)
64+
65+
| Permission | Justification |
66+
|---|---|
67+
| `storage` | Caches the user's prompt library locally for fast, offline access between sessions. |
68+
| `identity` | Lets the user sign in to their own Google account so prompts can be stored in their Google Drive. Uses `chrome.identity.launchWebAuthFlow`; no credentials are seen by the extension. |
69+
| `contextMenus` | Adds the right-click items "Inject prompt" and "Save selection to PromptVault". |
70+
| `clipboardWrite` | Copies a prompt to the clipboard as a fallback when no editable field is focused at injection time. |
71+
| `alarms` | Schedules a periodic background sync of the prompt library with the user's Google Drive. |
72+
| **Host permission `<all_urls>`** | The core feature inserts a user-selected prompt into the focused text field on whatever site the user is on. A content script must be able to run on all sites to do this. The content script only writes the chosen prompt's text into a field — it never reads or transmits page content. |
73+
| Host `https://www.googleapis.com/*` | Calls the Google Drive API to read/write the user's PromptVault folder and `vault.json`. |
74+
| Host `https://accounts.google.com/*` | Google sign-in / OAuth flow. |
75+
76+
**Are you using remote code?** No. All JavaScript is bundled in the package; the extension loads no external scripts. (Authentication uses Chrome's built-in `chrome.identity` API.)
77+
78+
---
79+
80+
## Privacy practices / data usage (the certification form)
81+
82+
PromptVault transmits data only between the user's browser and the user's own Google account; **the developer operates no server and collects nothing**. Recommended answers:
83+
84+
- **Data handled:** *Authentication information* (an OAuth token + the account email, kept on-device / used only to access the user's own Drive). Prompts are user-authored text stored in the user's own Drive. No other categories (no location, financial, health, web history, etc.).
85+
- **Sold to third parties?** No.
86+
- Tick all three required certifications:
87+
- ☑ I do not sell or transfer user data to third parties outside the approved use cases.
88+
- ☑ I do not use or transfer user data for purposes unrelated to my item's single purpose.
89+
- ☑ I do not use or transfer user data to determine creditworthiness or for lending.
90+
91+
> Note: "collect" on this form means transmitting data off the device to the developer or third parties. PromptVault does neither — data goes only to the user's own Google Drive. If the form requires you to declare data that *leaves the device at all*, declare **Authentication information** and **Personal communications** (the prompt text), and rely on the certifications above.
92+
93+
---
94+
95+
## Graphics
96+
97+
Required:
98+
- **Store icon 128×128**`dist/icon128.png` (included).
99+
- **At least 1 screenshot** — 1280×800 or 640×400, PNG/JPEG (up to 5).
100+
101+
Optional:
102+
- Small promo tile 440×280; Marquee 1400×560.
103+
104+
### Screenshots to capture (load the unpacked extension first — see below)
105+
1. The toolbar **popup** showing a few saved prompts (Inject / Copy buttons).
106+
2. The **dashboard** with the card grid, category chips, and the Drive panel showing "Connected".
107+
3. The **onboarding** page (the guided Google setup).
108+
4. (Nice) An **inject in action** on the ChatGPT/Claude composer with a prompt dropped in.
109+
110+
Capture at a 1280×800 window. On macOS: Shift-Cmd-4 then Space to grab a window, or set the Chrome window to 1280×800.
111+
112+
---
113+
114+
## Pre-submission checklist
115+
116+
1. Build a fresh package: `npm -w apps/extension run package` → produces `apps/extension/promptvault-extension.zip`.
117+
2. Smoke-test locally: `chrome://extensions` → Developer mode → **Load unpacked** → select `apps/extension/dist/` → no errors; complete onboarding; inject a prompt into a textarea.
118+
3. Register/long in to the **Chrome Web Store Developer Dashboard** (one-time US$5 registration if you haven't).
119+
4. **Add new item** → upload `promptvault-extension.zip`.
120+
5. Fill **Store listing** (name, descriptions, category, language, screenshots, icon).
121+
6. Fill **Privacy** tab: single purpose, each permission justification, "remote code: No", privacy policy URL, and the data-use certifications above.
122+
7. **Account** tab: verify a contact email (required before publishing).
123+
8. Submit for review. First reviews typically take a few days. Because scopes are non-sensitive (`drive.file` + `email`), no separate OAuth verification is required.
124+
125+
## After publishing
126+
- Put the published Web Store URL into `apps/web/src/config.js` (`EXTENSION_URL`) and the landing CTA so the website links to it.

apps/extension/manifest.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
{
22
"manifest_version": 3,
33
"name": "PromptVault",
4-
"version": "0.1.0",
4+
"version": "1.0.0",
55
"description": "Store reusable AI prompts in your own Google Drive and inject them into any text field.",
6+
"homepage_url": "https://prompt-vault-01.web.app",
67
"action": { "default_popup": "popup.html", "default_title": "PromptVault" },
78
"options_page": "dashboard.html",
89
"background": { "service_worker": "background.js" },
910
"content_scripts": [
1011
{ "matches": ["<all_urls>"], "js": ["content.js"], "run_at": "document_idle" }
1112
],
12-
"permissions": ["contextMenus", "storage", "scripting", "activeTab", "clipboardWrite", "identity", "alarms"],
13+
"permissions": ["contextMenus", "storage", "clipboardWrite", "identity", "alarms"],
1314
"host_permissions": ["<all_urls>", "https://www.googleapis.com/*", "https://accounts.google.com/*"],
1415
"icons": { "16": "icon16.png", "48": "icon48.png", "128": "icon128.png" }
1516
}

apps/extension/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@promptvault/extension",
3-
"version": "0.1.0",
3+
"version": "1.0.0",
44
"private": true,
55
"type": "module",
66
"scripts": {

apps/extension/test/build-smoke.test.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ describe('build smoke', () => {
2020
}
2121
});
2222

23-
test('manifest.json is valid JSON with MV3 + required permissions', () => {
23+
test('manifest.json is valid JSON with MV3 + the required (minimal) permissions', () => {
2424
const m = JSON.parse(readFileSync(p('manifest.json'), 'utf8'));
2525
expect(m.manifest_version).toBe(3);
26-
for (const perm of ['contextMenus', 'storage', 'identity', 'alarms', 'scripting', 'activeTab', 'clipboardWrite']) {
26+
for (const perm of ['contextMenus', 'storage', 'identity', 'alarms', 'clipboardWrite']) {
2727
expect(m.permissions).toContain(perm);
2828
}
29+
// Trimmed for Web Store review — these are unused/redundant and must NOT be present.
30+
expect(m.permissions).not.toContain('scripting');
31+
expect(m.permissions).not.toContain('activeTab');
2932
});
3033
});

apps/web/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ <h2>How it works</h2>
6666
</section>
6767

6868
<footer>
69-
<div class="wrap">PromptVault · Free &amp; private · <a href="/app">Open the app</a></div>
69+
<div class="wrap">PromptVault · Free &amp; private · <a href="/app">Open the app</a> · <a href="/privacy">Privacy</a></div>
7070
</footer>
7171
</div>
7272
</body>

apps/web/public/privacy.html

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<link rel="icon" type="image/png" href="/favicon.png" />
7+
<title>PromptVault — Privacy Policy</title>
8+
<style>
9+
:root { --accent:#185fa5; --line:#e4e4df; --ink:#1f2330; }
10+
body { max-width: 760px; margin: 40px auto; padding: 0 20px; font: 16px/1.6 system-ui, sans-serif; color: var(--ink); }
11+
h1 { margin-bottom: 4px; }
12+
h2 { margin-top: 28px; }
13+
.muted { color: #777; }
14+
a { color: var(--accent); }
15+
code { background:#f5f6f8; padding:1px 5px; border-radius:5px; }
16+
hr { border:none; border-top:1px solid var(--line); margin:24px 0; }
17+
</style>
18+
</head>
19+
<body>
20+
<h1>PromptVault — Privacy Policy</h1>
21+
<p class="muted">Last updated: 7 June 2026</p>
22+
23+
<p>
24+
PromptVault is a prompt manager available as a website and a browser extension. It is built to be
25+
<strong>private by design and to run without any backend server</strong>. This policy explains exactly
26+
what data PromptVault touches and where it goes.
27+
</p>
28+
29+
<h2>The short version</h2>
30+
<ul>
31+
<li>We operate <strong>no servers and no database</strong>. There is nothing for us to see, store, or sell.</li>
32+
<li>Your prompts and any media you attach are stored in <strong>your own Google Drive</strong> and in your
33+
browser's local storage — never on infrastructure we control.</li>
34+
<li>We collect <strong>no analytics, no telemetry, and no advertising data</strong>.</li>
35+
<li>The only network requests PromptVault makes are directly between your browser and
36+
<strong>Google</strong> (for sign-in and Drive), after you choose to connect.</li>
37+
</ul>
38+
39+
<h2>What data PromptVault handles</h2>
40+
<ul>
41+
<li><strong>Your prompts and metadata</strong> (titles, categories, tags, timestamps): stored in a
42+
<code>vault.json</code> file inside a <code>PromptVault</code> folder in your Google Drive, and cached
43+
locally in your browser (<code>chrome.storage.local</code> in the extension; IndexedDB on the web).</li>
44+
<li><strong>Media you attach</strong> (e.g. images): uploaded as files to that same Google Drive folder.</li>
45+
<li><strong>Your Google account email</strong>: shown in the UI so you know which account is connected.
46+
It is read from Google and kept only in your browser's local storage.</li>
47+
<li><strong>An OAuth access token</strong>: held only in your browser to call the Google Drive API on your
48+
behalf. It is cleared when you disconnect/sign out.</li>
49+
</ul>
50+
51+
<h2>Google account access (limited scope)</h2>
52+
<p>
53+
PromptVault requests the least-privilege scopes <code>drive.file</code> and <code>userinfo.email</code>.
54+
The <code>drive.file</code> scope means PromptVault can <strong>only access files it creates</strong>
55+
(your PromptVault folder) — it cannot see or touch any of your other Drive files. PromptVault's use of
56+
information received from Google APIs adheres to the
57+
<a href="https://developers.google.com/terms/api-services-user-data-policy" target="_blank" rel="noreferrer">Google API Services User Data Policy</a>,
58+
including the Limited Use requirements.
59+
</p>
60+
61+
<h2>What we do NOT do</h2>
62+
<ul>
63+
<li>We do not transmit your prompts or files to any server we operate (we have none).</li>
64+
<li>We do not sell, rent, or share your data with third parties.</li>
65+
<li>We do not use your data for advertising or to train models.</li>
66+
<li>We do not track your browsing. The browser extension's content script only inserts a prompt's text
67+
into the field you choose; it does not read or send page contents anywhere.</li>
68+
</ul>
69+
70+
<h2>Browser extension permissions</h2>
71+
<ul>
72+
<li><code>storage</code> — cache your prompt library locally.</li>
73+
<li><code>identity</code> — sign in to Google to connect your Drive.</li>
74+
<li><code>contextMenus</code> — the right-click "Inject prompt" / "Save selection" menu.</li>
75+
<li><code>clipboardWrite</code> — copy a prompt to the clipboard as a fallback when no text field is focused.</li>
76+
<li><code>alarms</code> — periodically sync your library with your Drive.</li>
77+
<li>Host access to all sites — required so you can insert a saved prompt into a text field on any website.
78+
Page content is never read or collected.</li>
79+
</ul>
80+
81+
<h2>Deleting your data</h2>
82+
<p>
83+
Your data lives in your Google Drive and your browser. To remove it: delete the <code>PromptVault</code>
84+
folder from your Google Drive, and remove the extension / clear the site's browser storage. You can revoke
85+
PromptVault's access at any time at
86+
<a href="https://myaccount.google.com/permissions" target="_blank" rel="noreferrer">myaccount.google.com/permissions</a>.
87+
</p>
88+
89+
<h2>Contact</h2>
90+
<p>Questions about this policy: <a href="mailto:sumit@sumitagrawal.dev">sumit@sumitagrawal.dev</a>.</p>
91+
92+
<hr />
93+
<p class="muted"><a href="/">← Back to PromptVault</a></p>
94+
</body>
95+
</html>

0 commit comments

Comments
 (0)