{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/en/html2design-review-rejections/",
    "result": {"data":{"site":{"siteMetadata":{"title":"지나가던 개발(zigae)","author":"geonwoo","lang":"ko"}},"markdownRemark":{"id":"61ee0141-a482-52f6-b7cf-2bd720ced299","excerpt":"I built a tool that moves web pages into Figma and put it on the stores. Getting through review took longer than writing the code. Three rejections. One for the…","html":"<p>I built a tool that moves web pages into Figma and put it on the stores. Getting through review took longer than writing the code.</p>\n<p>Three rejections. One for the name, two for permissions. I was wrong all three times and the reviewers were right, which is exactly why it seemed worth writing down. You rarely get to read someone else’s rejection notices.</p>\n<h2 id=\"1-you-cant-put-figma-in-the-name\" style=\"position:relative;\"><a href=\"#1-you-cant-put-figma-in-the-name\" aria-label=\"1 you cant put figma in the name permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. You can’t put “figma” in the name</h2>\n<p>The original name was html2figma. I submitted the plugin to Figma Community and got this back.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Website url does not align with our branding guidelines</code></pre></div>\n<p>The <a href=\"https://www.figma.com/using-the-figma-brand/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">brand guidelines</a> say plainly that product names, domains, and handles can’t contain “Figma” or “Fig”. The only accepted form is “X for Figma”. Nothing to argue with.</p>\n<p>The problem is that renaming isn’t just renaming. I had to move the domain, 301 the old one, and hunt down the old name across package names, docs, and store assets. I missed places. The app name on the Google OAuth consent screen stayed html2figma for a long while after, so anyone signing in was looking at a different name than the one they installed.</p>\n<p>It’s called html2design now.</p>\n<h2 id=\"2-dont-request-permissions-you-dont-use-twice\" style=\"position:relative;\"><a href=\"#2-dont-request-permissions-you-dont-use-twice\" aria-label=\"2 dont request permissions you dont use twice permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Don’t request permissions you don’t use (twice)</h2>\n<p>The Chrome Web Store’s automated review caught me twice, both for the same violation class.</p>\n<p>The first was <code class=\"language-text\">scripting</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Requests the following permissions but does not use them (scripting)</code></pre></div>\n<p>I searched the code and there were exactly zero calls to <code class=\"language-text\">chrome.scripting</code>. I was running scripts in the page, but through <code class=\"language-text\">chrome.debugger</code> and CDP’s <code class=\"language-text\">Runtime.evaluate</code>. The permission had been sitting in the manifest since the beginning without ever being needed. I removed it and resubmitted.</p>\n<p>The second was <code class=\"language-text\">tabs</code>, and this one had something to teach me.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">You do not need to request the following permissions for the methods/properties implemented by your item (tabs)</code></pre></div>\n<p>I was actually calling <code class=\"language-text\">chrome.tabs.query</code>, and it was still telling me the permission was unnecessary. It was right. <code class=\"language-text\">chrome.tabs.query</code> works without the permission; what the permission gates is four fields: <code class=\"language-text\">url</code>, <code class=\"language-text\">title</code>, <code class=\"language-text\">favIconUrl</code>, and <code class=\"language-text\">pendingUrl</code>. My code only read <code class=\"language-text\">tab.id</code>. The page’s URL and title come from parsing the DOMSnapshot, not from the tab object, so it never mattered.</p>\n<p><code class=\"language-text\">chrome.tabs.create</code> doesn’t require the permission either. Opening a new tab felt like something that obviously would, and it doesn’t.</p>\n<p><strong>A call site doesn’t imply a permission.</strong> That’s what two rejections bought me. Check the docs for whether an API actually requires the permission before you write it into the manifest.</p>\n<p>I applied the same reasoning to <code class=\"language-text\">activeTab</code> and dropped it too. I don’t use <code class=\"language-text\">executeScript</code> or <code class=\"language-text\">insertCSS</code>, and I already have host permissions, so it wasn’t widening or narrowing anything. No reason to wait for a third rejection.</p>\n<p>The count went from five permissions to three: <code class=\"language-text\">debugger</code>, <code class=\"language-text\">storage</code>, <code class=\"language-text\">identity</code>. The install warning got shorter as a result, so it worked out.</p>\n<p>What’s left is one host permission, <code class=\"language-text\">&lt;all_urls></code>. It’s genuinely required, because images on a captured page can come from any origin. The cost is that having it puts the extension into “in-depth review” and makes every submission slower. Not much to do about that one.</p>\n<h2 id=\"3-the-bug-that-took-longer-than-all-three-rejections\" style=\"position:relative;\"><a href=\"#3-the-bug-that-took-longer-than-all-three-rejections\" aria-label=\"3 the bug that took longer than all three rejections permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. The bug that took longer than all three rejections</h2>\n<p>Google sign-in didn’t work at all.</p>\n<p>The consent screen was fine, and clicking “Continue” closed the window, and then nothing happened. <strong>No error either.</strong> With no log, there was nothing to tell me where it stopped.</p>\n<p>Here’s what was happening. When <code class=\"language-text\">chrome.identity.launchWebAuthFlow</code> opens the auth window, focus moves, and at that moment Chrome closes the extension popup. Closing the popup destroys its JS context, so nothing after the <code class=\"language-text\">await</code> runs. The code exchange, the session write, the error display: all of it was after that line. That’s also why there was no error. The thing that would have rendered it was already gone.</p>\n<p>The worst part was that <strong>it worked whenever devtools was attached</strong>. With devtools open the popup doesn’t close, so the flow runs to the end. I spent a long time in “works on my machine” over it.</p>\n<p>The fix was moving the whole auth flow into the service worker. The worker survives the popup closing, and it writes the result to storage, so reopening the popup shows the updated state. I moved opening the checkout page there too, so the tab still opens even if the popup dies partway.</p>\n<p>If I compress it to one line: <strong>don’t start an async flow from an extension popup if that flow opens a window.</strong> A popup is a context that disappears the moment it loses focus.</p>\n<h2 id=\"things-i-removed\" style=\"position:relative;\"><a href=\"#things-i-removed\" aria-label=\"things i removed permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Things I removed</h2>\n<p>Some of what I built, I deleted.</p>\n<p>There was a feature on the Figma side that generated Local Styles from the captured colors and text. It’s gone. Delivery got simplified too. It used to be three paths (save a <code class=\"language-text\">.h2f</code> file and drop it on the plugin, copy through the clipboard, or send directly with a 6-digit code), and only the last one is left.</p>\n<p>The problem was that the removed features were still being advertised in several places. The landing page, the Figma Community description, the store screenshots, the blog post. I was promoting things that no longer existed. Deleting a feature isn’t done when the code is gone. Text baked into store screenshots is especially easy to miss.</p>\n<p>I also lowered the price, from $9/month to $5. That one had nothing to do with the reviews.</p>\n<h2 id=\"where-it-stands\" style=\"position:relative;\"><a href=\"#where-it-stands\" aria-label=\"where it stands permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Where it stands</h2>\n<p>Free is five conversions a month, with no account and no sign-in. Unlimited is $5/month.</p>\n<p>You need both the Chrome extension and the Figma plugin. The extension captures and the plugin renders, so neither half does anything on its own. I know that’s the biggest place people drop off and I don’t have an answer for it yet.</p>\n<p>The things it can’t do, stated plainly: <code class=\"language-text\">&lt;canvas></code> pixel content doesn’t come through, you only get the element box. Gradient angles are approximated, and fonts you don’t have installed fall back to Inter, which is noticeable when the captured site uses a custom typeface.</p>\n<ul>\n<li><a href=\"https://html2design.zigae.com/en/?utm_source=hn&#x26;utm_medium=community&#x26;utm_campaign=launch\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">html2design</a></li>\n<li><a href=\"https://chromewebstore.google.com/detail/cgjbnhacnalehnfkkkoilmglhiigbjmf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chrome Web Store</a></li>\n<li><a href=\"https://www.figma.com/community/plugin/1657063496726706112\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Figma plugin</a></li>\n<li>The three tools I compared before building this: <a href=\"/en/web-to-figma-tools-2026/\">I ran three web-to-Figma tools on a real project</a></li>\n</ul>\n<p>I haven’t started promoting it and about twenty people are using it. Sending me the URL of a page that breaks is the single most useful thing right now.</p>","timeToRead":5,"frontmatter":{"title":"My Chrome extension was rejected three times: the name, the permissions, and a login that failed silently","date":"August 27, 2026","description":"I built a tool that turns web pages into editable Figma layers and shipped it to Figma Community and the Chrome Web Store. It got rejected three times: once for the name, twice for permissions I wasn't using. Notes on all three, plus the bug that took longer than any of them.","tags":["chrome-extension","figma","html2design","side-project","review"]},"fields":{"langKey":"en"}}},"pageContext":{"slug":"/en/html2design-review-rejections/","previous":null,"next":{"fields":{"slug":"/en/tennis-video-auto-edit/","langKey":"en","directoryName":"tennis-video-auto-edit"},"frontmatter":{"date":"July 23, 2026","title":"An hour of tennis footage, fifteen minutes of actual tennis","tags":["tennis","video-editing","auto-editing","filming-guide","onlyrally","side-project"]}},"previousInSameTag":null,"nextInSameTag":{"fields":{"slug":"/html2design-review-rejections/","langKey":"ko","directoryName":"html2design-review-rejections"},"frontmatter":{"date":"August 27, 2026","title":"확장 프로그램 하나로 심사에서 세 번 반려당했다: 이름, 권한, 그리고 조용히 실패하던 로그인","tags":["chrome-extension","figma","html2design","side-project","심사"]}},"translationsLink":[{"name":"Korean","url":"/html2design-review-rejections/"}]}},
    "staticQueryHashes": ["1522010811","1558996917","1615650028","3765107650"]}