Skip to content

Commit eb9b56c

Browse files
jaredcosulichclaude
andcommitted
store: refresh listing, screenshots, and promo tiles; bump to 0.16
Adds the privacy-policy pointer (canonical copy lives at codeyam.com/tabcommand/privacy), swaps the dark-mode screenshot for a search-everything one, and adds the marquee and small promo tiles the Chrome Web Store submission requires. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0123xqBh5Dg5xMEVUjEWq2Ua
1 parent e53c1a9 commit eb9b56c

15 files changed

Lines changed: 425 additions & 59 deletions

‎PRIVACY.md‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# TabCommand Privacy Policy
2+
3+
The canonical TabCommand privacy policy lives at:
4+
5+
## **https://codeyam.com/tabcommand/privacy**
6+
7+
That page is the version submitted to the Chrome Web Store. It is the single
8+
source of truth — this file intentionally does not duplicate it, so the two
9+
cannot drift apart.
10+
11+
## The short version
12+
13+
**TabCommand collects no data.** Your tabs, groups, labels, favorites, history,
14+
and settings are stored only on your own device using Chrome's local extension
15+
storage (`chrome.storage.local`). Nothing is transmitted to us or to any third
16+
party. There is no analytics, no telemetry, and no tracking.
17+
18+
TabCommand reads tab titles and URLs solely to display, search, and organize
19+
them for you, locally. It does not read page content.
20+
21+
Questions: <privacy@codeyam.com> · © 2026 NodLabs Inc. · [MIT License](./LICENSE)

‎manifest.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "TabCommand",
3-
"version": "0.14",
3+
"version": "0.16",
44
"description": "Command Central for your browsing experience.",
55
"permissions": ["storage", "tabs", "tabGroups", "system.cpu", "system.memory", "alarms"],
66
"background": {

‎store/UPLOAD-GUIDE.md‎

Lines changed: 128 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,176 @@
1-
# TabCommand — Unlisted Chrome Web Store upload guide
2-
3-
Everything in this `store/` folder is **prepped and ready**. The steps below are
4-
the parts only you can do (they need your Google account and a credit card).
5-
6-
## What "unlisted" actually means — read first
7-
8-
- **Unlisted ≠ private or instant.** An unlisted item is simply hidden from Web
9-
Store search and category browsing. Anyone with the **direct link can still
10-
install it**, and it is **not** an internal/whitelist-only channel.
11-
- **Unlisted still goes through Google's review.** Publishing as unlisted does
12-
*not* skip review. First-time review for a new item commonly takes anywhere
13-
from a few hours to a couple of weeks, especially with sensitive permissions
14-
(see the `tabs` / `processes` note below). Plan for a wait; it is not a
15-
same-day private share.
16-
- If you need to hand a build to a handful of people *today* with no review,
17-
use **"Load unpacked"** from `build/` in `chrome://extensions` (Developer
18-
mode on), or zip `build/` and have them load it unpacked. That is the true
19-
instant path; the Web Store is the durable, auto-updating one.
1+
# TabCommand — Chrome Web Store upload guide (Public listing, v0.16)
2+
3+
Everything in this `store/` folder is **prepped and ready** for a **public**
4+
listing. The steps below are the parts only you can do — they need your Google
5+
account and a credit card.
206

217
## One-time requirement: paid developer account
228

23-
- Publishing anything to the Chrome Web Store requires a **registered Chrome
24-
Web Store developer account**, which costs a **one-time US $5 fee** (not per
25-
extension, not recurring).
26-
- Register and pay at the **Developer Dashboard**:
9+
- Publishing to the Chrome Web Store requires a registered developer account,
10+
which costs a **one-time US $5 fee** (not per extension, not recurring).
11+
- Register and pay at the Developer Dashboard:
2712
https://chrome.google.com/webstore/devconsole
28-
- You will also be asked to verify a contact email and accept the developer
29-
agreement before your first item can be submitted.
13+
- You'll also verify a contact email and accept the developer agreement before
14+
your first item can be submitted.
15+
16+
## What "public" means
17+
18+
- The item is **listed** — it appears in Web Store search and category browsing,
19+
and anyone can find and install it.
20+
- Expect **review to take longer and be stricter than unlisted**. TabCommand
21+
requests `tabs`, which Google treats as access to sensitive user data (browsing
22+
activity), so a permissions/privacy review is likely. First review for a new
23+
public item commonly runs from a few days to a couple of weeks.
24+
- If you need to hand the build to someone **today**, don't wait on review: have
25+
them load `build/` unpacked via `chrome://extensions` → Developer mode → Load
26+
unpacked.
3027

3128
---
3229

3330
## What's already prepared in this folder
3431

3532
| File | What it is | Where it goes in the dashboard |
3633
|---|---|---|
37-
| `tabcommand-0.14.zip` | The packaged extension (manifest at the zip root, version **0.14**) | "Package" → Upload new package |
34+
| `tabcommand-0.16.zip` | The packaged extension (manifest at the zip root, version **0.16**) | Package → Upload new package |
3835
| `icon/tabcommand-icon-128.png` | 128×128 store icon | Store listing → Store icon |
39-
| `screenshots/01…05-*.png` | Five 1280×800 screenshots | Store listing → Screenshots |
40-
| `store-listing.md` | Title, summary, full description, permission justifications, privacy answers | Store listing + Privacy tabs |
36+
| `screenshots/01…05-*.png` | Five 1280×800 screenshots, in upload order (5 is the max allowed) | Store listing → Screenshots |
37+
| `promo/small-tile-440x280.png` | 440×280 small promo tile — **required to publish** | Store listing → Small promo tile |
38+
| `promo/marquee-1400x560.png` | 1400×560 marquee tile — optional, needed to be eligible for featuring | Store listing → Marquee promo tile |
39+
| `store-listing.md` | Title, summary, description, permission justifications, privacy answers | Store listing + Privacy tabs |
40+
| _(hosted)_ `https://codeyam.com/tabcommand/privacy` | Privacy policy page, in the `codeyam-local` repo | Privacy → Privacy policy URL |
4141

4242
> The `.zip` is gitignored (the repo ignores `*.zip` and `build/`). Regenerate it
4343
> any time with the commands at the bottom of this file.
4444
4545
---
4646

47+
## Before you upload: ship the privacy policy page
48+
49+
The Privacy tab requires a **working** privacy policy URL. TabCommand's policy is
50+
a page on the CodeYam site, added in the `codeyam-local` repo as
51+
`dashboard/app/routes/tabcommand.privacy.tsx`. **It must be merged and deployed
52+
to production before you submit**, or Google will hit a 404 and reject.
53+
54+
Confirm this URL loads in a logged-out browser before submitting:
55+
https://codeyam.com/tabcommand/privacy
56+
57+
---
58+
4759
## Upload steps (you do these)
4860

4961
1. **Register / sign in** at https://chrome.google.com/webstore/devconsole and
5062
pay the one-time $5 fee if you haven't already.
51-
2. Click **"Add new item"** and upload **`tabcommand-0.14.zip`**.
63+
2. Click **"Add new item"** and upload **`tabcommand-0.16.zip`**.
5264
3. **Store listing** tab:
5365
- Item name, Summary, Detailed description → copy from `store-listing.md`.
5466
- Store icon → `icon/tabcommand-icon-128.png`.
55-
- Screenshots → upload all five from `screenshots/` (drag to order them).
56-
- Category → Productivity. Language → English (US).
67+
- Screenshots → upload all five from `screenshots/` in numbered order.
68+
(Five is the cap; the form will reject a sixth.)
69+
- Small promo tile → `promo/small-tile-440x280.png`. **This one is required**
70+
— the listing cannot be submitted without it.
71+
- Marquee promo tile → `promo/marquee-1400x560.png`. Optional, but without it
72+
the extension is not eligible for marquee featuring.
73+
- Category → **Productivity**. Language → **English (US)**.
5774
4. **Privacy** tab:
5875
- Single-purpose description → from `store-listing.md`.
59-
- Permission justifications → paste the table rows from `store-listing.md`.
60-
- Data usage → "No data collected" (TabCommand stores everything locally via
61-
`chrome.storage.local`). Certify the policy compliance checkbox.
76+
- Permission justifications → paste the table rows from `store-listing.md`
77+
(one per permission — Google rejects blanks here).
78+
- Privacy policy URL → `https://codeyam.com/tabcommand/privacy`
79+
(**not** `/privacy` — that's the company policy and it describes data
80+
collection TabCommand doesn't do)
81+
- Data usage → **no** data-collection categories checked. Tick all three
82+
certification checkboxes.
6283
5. **Distribution** tab:
63-
- Visibility → **Unlisted**.
64-
6. Click **Submit for review**. You'll get email when it's approved; the install
65-
link appears on the item's dashboard page.
84+
- Visibility → **Public**.
85+
- Regions → All (or narrow if you prefer).
86+
6. Click **Submit for review**. You'll get email on approval; the public install
87+
link then appears on the item's dashboard page.
88+
89+
### If review comes back with questions
90+
91+
The most likely question is about `tabs`. The answer: TabCommand reads tab titles
92+
and URLs **only to display, search, and organize them locally for the user**; it
93+
reads no page content and transmits nothing. That's already the wording in
94+
`store-listing.md` and `PRIVACY.md`.
6695

6796
---
6897

6998
## Note: the `processes` permission was removed
7099

71-
- The `processes` permission has been **dropped** from `manifest.json` for this
72-
build. `chrome.processes` is a Dev/Canary-only API and would have drawn a
73-
likely review question on a stable-channel extension.
100+
- `processes` was dropped from `manifest.json`. `chrome.processes` is a
101+
Dev/Canary-only API and would have drawn a review question on a stable-channel
102+
extension.
74103
- No functionality is lost on stable Chrome: `service_worker.js` checks
75104
`processesApiAvailable()` and falls back to `system.cpu` / `system.memory`,
76-
which is exactly what stable Chrome uses anyway. Verified — all 70 worker/popup
77-
tests pass after removal.
105+
which is what stable Chrome uses anyway.
78106
- The only effect: on Dev/Canary you no longer get the richer per-tab process
79-
breakdown. The Browser Load gauge and Heaviest Tabs panel still work from
107+
breakdown. The Browser Load gauge and Heaviest Tabs still work from
80108
system-level CPU/memory.
81109

82110
---
83111

112+
## What the production build deliberately excludes
113+
114+
`npm run build` strips all codeyam artifacts from the package:
115+
116+
- The isolation harness (`.codeyam/harness/isolate.jsx`) is swapped for a stub
117+
that renders `<App/>` directly. The harness only does anything when the URL has
118+
`?isolate=`, which never happens in a packaged extension.
119+
- With it go `ISOLATION_PROPS` and the `codeyam:components` /
120+
`codeyam:component-scenarios` manifests — i.e. all **scenario mock data**.
121+
122+
Before this, the published `.zip` contained internal URLs (Notion, Linear, Figma)
123+
and placeholder favicon links pointing at `google.com/s2/favicons`. Now it doesn't.
124+
Bundle dropped 351 kB → 338 kB.
125+
126+
Dev is untouched: `npm run dev` still loads the real harness, so `?isolate=` and
127+
codeyam scenario capture work exactly as before. Set `CODEYAM_KEEP_HARNESS=1` to
128+
force the harness into a build if you ever need to.
129+
130+
Sanity-check any new package before uploading:
131+
132+
```bash
133+
unzip -qq store/tabcommand-<version>.zip -d /tmp/zc
134+
grep -rl "codeyam\|s2/favicons\|notion.so\|fonts.googleapis" /tmp/zc # → no matches
135+
```
136+
84137
## Regenerate the package (if you change code)
85138

86139
```bash
87-
# 1. bump the version in manifest.json (Web Store rejects re-used versions)
140+
# 1. bump the version in manifest.json (the Web Store rejects re-used versions)
88141
# 2. rebuild
89142
npm run build
90143
# 3. repackage — manifest.json must be at the ZIP ROOT
91144
cd build && zip -rqX "../store/tabcommand-<version>.zip" . -x ".*" && cd ..
92145
```
146+
147+
## Regenerate the promo tiles
148+
149+
The tiles are built from `promo/tiles.html` (self-contained: the icon is embedded
150+
as a base64 data URI, so there are no external assets). Render each element with
151+
Playwright at `deviceScaleFactor: 2`, then downscale to the exact spec — this is
152+
sharper than rendering at 1×:
153+
154+
```bash
155+
# renders #small and #mq from promo/tiles.html, then:
156+
sips -z 280 440 small@2x.png --out store/promo/small-tile-440x280.png
157+
sips -z 560 1400 mq@2x.png --out store/promo/marquee-1400x560.png
158+
```
159+
160+
Sizes must be **exact** (440×280 / 1400×560); the dashboard rejects anything else.
161+
162+
## Regenerate the screenshots
163+
164+
They're downscaled straight from codeyam scenario captures (2880×1800 → 1280×800,
165+
same 1.6 aspect ratio, so no cropping):
166+
167+
```bash
168+
S=.codeyam/scenarios/screenshots
169+
sips -z 800 1280 "$S/home-open-and-saved-tabs--desktop.png" --out store/screenshots/01-tab-groups.png
170+
sips -z 800 1280 "$S/search-active-results--desktop.png" --out store/screenshots/02-search-everything.png
171+
sips -z 800 1280 "$S/home-running-hot--desktop.png" --out store/screenshots/03-browser-load-gauge.png
172+
sips -z 800 1280 "$S/home-settings-popover-open--desktop.png" --out store/screenshots/04-auto-close-settings.png
173+
sips -z 800 1280 "$S/history-populated--desktop.png" --out store/screenshots/05-history.png
174+
```
175+
176+
Exactly five — the Web Store rejects a sixth. (A dark-mode shot was cut for this.)

‎store/promo/marquee-1400x560.png‎

108 KB
Loading

‎store/promo/small-tile-440x280.png‎

35.4 KB
Loading

0 commit comments

Comments
 (0)