{"id":8360,"date":"2025-08-15T01:27:15","date_gmt":"2025-08-14T18:27:15","guid":{"rendered":"https:\/\/danielepais.com\/journal\/?p=8360"},"modified":"2025-08-15T01:27:15","modified_gmt":"2025-08-14T18:27:15","slug":"build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions","status":"publish","type":"post","link":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/","title":{"rendered":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)"},"content":{"rendered":"<p>Tired of bending your workflow to one-size-fits-all tools? Let&#8217;s make something new and exciting. Introducing, the newest EPG: <strong>Editorial Plan Prompt Generator<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/ywAAAAAAQABAAACAUwAOw==\" fifu-lazy=\"1\" fifu-data-sizes=\"auto\" fifu-data-srcset=\"https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/a0d4aa45f7fe\/editorial-plan-prompt-generator.webp?p=8360&w=75&h=0&c=0 75w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/6c69f91843b2\/editorial-plan-prompt-generator.webp?p=8360&w=100&h=0&c=0 100w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/be06baa549c3\/editorial-plan-prompt-generator.webp?p=8360&w=150&h=0&c=0 150w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/876f212709e4\/editorial-plan-prompt-generator.webp?p=8360&w=240&h=0&c=0 240w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/c2605391f6a8\/editorial-plan-prompt-generator.webp?p=8360&w=320&h=0&c=0 320w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/03ab6e684f6f\/editorial-plan-prompt-generator.webp?p=8360&w=500&h=0&c=0 500w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/7e4e5d392148\/editorial-plan-prompt-generator.webp?p=8360&w=640&h=0&c=0 640w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/a53b393ac259\/editorial-plan-prompt-generator.webp?p=8360&w=800&h=0&c=0 800w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/8349a40768f2\/editorial-plan-prompt-generator.webp?p=8360&w=1024&h=0&c=0 1024w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/2e370613f054\/editorial-plan-prompt-generator.webp?p=8360&w=1280&h=0&c=0 1280w, https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/6c4796b696b7\/editorial-plan-prompt-generator.webp?p=8360&w=1600&h=0&c=0 1600w\" class=\"size-full wp-image-8363 aligncenter\" title=\"Editorial Plan Prompt Generator\" fifu-data-src=\"https:\/\/wp.fifu.app\/danielepais.com\/aHR0cHM6Ly9kYW5pZWxlcGFpcy5jb20vam91cm5hbC93cC1jb250ZW50L3VwbG9hZHMvMjAyNS8wOC9FZGl0b3JpYWwtUGxhbi1Qcm9tcHQtR2VuZXJhdG9yLmpwZw\/cf490175e431\/editorial-plan-prompt-generator.webp?p=8360\" alt=\"Editorial Plan Prompt Generator\" width=\"850\" height=\"400\" \/><br \/>\nIn this tutorial you\u2019ll build a tiny Chrome extension that turns a list of keywords into a clean, constraint-based prompt for ChatGPT. It\u2019s perfect for writers, bloggers, designers, and developers who want a tool that behaves exactly the way they work\u2014without monthly fees and without sending data to third-party servers.<\/p>\n<p>This is intentionally a work in progress. You\u2019ll get a solid, production-ready base that you can extend with new features as your needs evolve.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a68638fbe5c3\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #18bc9c;color:#18bc9c\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #18bc9c;color:#18bc9c\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a68638fbe5c3\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#What_youll_build\" >What you\u2019ll build<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Why_local-first_matters\" >Why local-first matters<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Prerequisites\" >Prerequisites<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Project_structure\" >Project structure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#1_manifestjson\" >1) manifest.json<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#2_popuphtml\" >2) popup.html<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#3_popupcss\" >3) popup.css<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#_4_popupjs\" >\u00a04) popup.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#_5_apphtml\" >\u00a05) app.html<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#6_icons_icon16png_icon32png_icon48png_icon128png\" >6) icons\/ (icon16.png, icon32.png, icon48.png, icon128.png)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Installation_instructions\" >Installation instructions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Test_flow\" >Test flow<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#The_popup_UI_what_users_see_first\" >The popup UI (what users see first)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Core_behavior_and_best_practices\" >Core behavior and best practices<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Example_prompt_the_extension_generates\" >Example prompt the extension generates<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Recommended_workflow\" >Recommended workflow<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Work_in_progress_suggested_next_features\" >Work in progress: suggested next features<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Troubleshooting\" >Troubleshooting<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#Takeaways\" >Takeaways<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"What_youll_build\"><\/span>What you\u2019ll build<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p>A compact popup UI plus a persistent full-page editor (great for importing files).<\/p>\n<\/li>\n<li>\n<p>A Keywords field that accepts one keyword per line (also supports commas\/semicolons).<\/p>\n<\/li>\n<li>\n<p>Import from <code>.txt<\/code> or <code>.csv<\/code> (replace or merge with existing keywords).<\/p>\n<\/li>\n<li>\n<p>Automatic cleaning on paste: trims whitespace, removes blanks, deduplicates, keeps ordering sane.<\/p>\n<\/li>\n<li>\n<p>Live keyword counter and a guidance notice (e.g., \u201ccapped to N\u201d or \u201cincreased to N\u201d).<\/p>\n<\/li>\n<li>\n<p>One-to-one mapping: if you provide multiple keywords, the tool enforces \u201cone keyword = one article idea.\u201d<\/p>\n<\/li>\n<li>\n<p>Selectable Language, Tone, Style, FAQs yes\/no, word count, and an extra notes field.<\/p>\n<\/li>\n<li>\n<p>Generates a structured prompt per idea: SEO title (\u226460 chars), SEO description (\u2264160), <a href=\"https:\/\/danielepais.com\/journal\/how-to-drop-a-shadow-to-an-image-in-photoshop-cs6\/\">image<\/a> alt tag, brief outline.<\/p>\n<\/li>\n<li>\n<p>Copy to clipboard, Reset, and local persistence (localStorage).<\/p>\n<\/li>\n<li>\n<p>Local-only, privacy-first: no telemetry, no <a href=\"https:\/\/danielepais.com\/journal\/network-over-the-mains\/\">network<\/a> calls, no external libraries.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Why_local-first_matters\"><\/span>Why local-first matters<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Everything happens in your browser. If your editorial work includes trade secrets, NDA-bound material, private research, or just competitive keyword sets, you don\u2019t want them leaving your device. This extension stores only your last inputs in localStorage for convenience\u2014nothing goes to third-party servers.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Prerequisites\"><\/span>Prerequisites<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p>Google Chrome (or any Chromium browser with Manifest V3 support).<\/p>\n<\/li>\n<li>\n<p>No build tools or external packages\u2014just a few static files.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Project_structure\"><\/span>Project structure<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Create a folder (for example, <code>editorial-plan-prompt-generator\/<\/code>) and <a href=\"https:\/\/danielepais.com\/journal\/add-a-new-layer-photoshop-daily-tips-shortcut-master\/\">add<\/a> these files:<\/p>\n<p>editorial-plan-prompt-generator\/<br \/>\n\u251c\u2500 manifest.json<br \/>\n\u251c\u2500 popup.html<br \/>\n\u251c\u2500 popup.css<br \/>\n\u251c\u2500 popup.js<br \/>\n\u251c\u2500 app.html \u2190 full-page editor (persistent tab)<br \/>\n\u2514\u2500 icons\/<br \/>\n\u251c\u2500 icon16.png<br \/>\n\u251c\u2500 icon32.png<br \/>\n\u251c\u2500 icon48.png<br \/>\n\u2514\u2500 icon128.png<\/p>\n<p>Use these exact filenames inside your project folder.<\/p>\n<div class=\"su-button-center\"><a href=\"https:\/\/www.canva.com\/design\/DADa1yjx42E\/r0qqXVs7cK99R08f41Mrsw\/view?utm_content=DADa1yjx42E&#038;utm_campaign=designshare&#038;utm_medium=link&#038;utm_source=publishsharelink&#038;mode=preview\" class=\"su-button su-button-style-3d su-button-wide\" style=\"color:#FFFFFF;background-color:#17BBA0;border-color:#139680;border-radius:10px\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color:#FFFFFF;padding:8px 26px;font-size:20px;line-height:30px;border-color:#5dd0bd;border-radius:10px;text-shadow:none\"><i class=\"sui sui-crosshairs\" style=\"font-size:20px;color:#FFFFFF\"><\/i> GET IT FROM CANVA<small style=\"padding-bottom:8px;color:#FFFFFF\">Danang, Vietnam Free Canva Travel Brochure Template<\/small><\/span><\/a><\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_manifestjson\"><\/span>1) manifest.json<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What it does: Declares a Manifest V3 extension with a popup and app icons. No permissions are required (privacy-first, local-only).<\/p>\n<pre>{\r\n \"manifest_version\": 3,\r\n \"name\": \"Editorial Plan Prompt Generator\",\r\n \"version\": \"1.0.0\",\r\n \"description\": \"Builds a structured ChatGPT prompt for generating an editorial plan based on your inputs.\",\r\n \"action\": {\r\n \"default_popup\": \"popup.html\",\r\n \"default_title\": \"Editorial Plan Prompt Generator\"\r\n },\r\n \"icons\": {\r\n \"16\": \"icons\/icon16.png\",\r\n \"32\": \"icons\/icon32.png\",\r\n \"48\": \"icons\/icon48.png\",\r\n \"128\": \"icons\/icon128.png\"\r\n },\r\n \"permissions\": []\r\n}\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"2_popuphtml\"><\/span>2) popup.html<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What it does: The main UI shown when you click the extension icon. Includes a Keywords textarea, import button, replace\/merge toggle, select fields, notice area, buttons, and a read-only output box.<\/p>\n<blockquote>\n<pre><code>\r\n &lt;!doctype html&gt;\r\n&lt;html lang=\"en\"&gt;\r\n&lt;head&gt;\r\n &lt;meta charset=\"utf-8\"&gt;\r\n &lt;meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"&gt;\r\n &lt;title&gt;Editorial Plan Prompt Generator&lt;\/title&gt;\r\n &lt;link rel=\"stylesheet\" href=\"popup.css\"&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n &lt;main class=\"container\"&gt;\r\n &lt;h1 class=\"app-title\"&gt;Editorial Plan Prompt Generator&lt;\/h1&gt;\r\n &lt;form id=\"promptForm\" autocomplete=\"off\" novalidate&gt;\r\n &lt;div class=\"field\"&gt;\r\n &lt;div class=\"label-row\"&gt;\r\n &lt;label for=\"keywords\"&gt;Keywords&lt;\/label&gt;\r\n &lt;span class=\"chip\" id=\"kwCount\"&gt;0&lt;\/span&gt;\r\n &lt;\/div&gt;\r\n &lt;textarea id=\"keywords\" name=\"keywords\" rows=\"5\"\r\n placeholder=\"One keyword per line (or comma-separated).\r\nExample:\r\nelectric bike\r\ncity commute\r\nbattery life\"&gt;&lt;\/textarea&gt;\r\n &lt;small class=\"hint\"&gt;Paste from a spreadsheet \u2014 we\u2019ll trim, deduplicate, and remove blank lines.&lt;\/small&gt;\r\n &lt;div class=\"import-row\"&gt;\r\n &lt;input type=\"file\" id=\"fileInput\" accept=\".txt,.csv\" hidden&gt;\r\n &lt;button type=\"button\" class=\"btn small\" id=\"importBtn\"&gt;Import keywords (.txt\/.csv)&lt;\/button&gt;\r\n &lt;button type=\"button\" class=\"btn small\" id=\"openFullBtn\"&gt;Open full page&lt;\/button&gt;\r\n &lt;label class=\"inline\"&gt;\r\n &lt;input type=\"checkbox\" id=\"replaceToggle\" checked&gt;\r\n Replace existing\r\n &lt;\/label&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"language\"&gt;Language&lt;\/label&gt;\r\n &lt;select id=\"language\" name=\"language\" required&gt;\r\n &lt;option&gt;English&lt;\/option&gt;&lt;option&gt;Spanish&lt;\/option&gt;&lt;option&gt;Portuguese&lt;\/option&gt;&lt;option&gt;Italian&lt;\/option&gt;\r\n &lt;option&gt;German&lt;\/option&gt;&lt;option&gt;French&lt;\/option&gt;&lt;option&gt;Chinese (Simplified)&lt;\/option&gt;&lt;option&gt;Chinese (Traditional)&lt;\/option&gt;\r\n &lt;option&gt;Japanese&lt;\/option&gt;&lt;option&gt;Korean&lt;\/option&gt;&lt;option&gt;Russian&lt;\/option&gt;&lt;option&gt;Arabic&lt;\/option&gt;&lt;option&gt;Hindi&lt;\/option&gt;\r\n &lt;option&gt;Thai&lt;\/option&gt;&lt;option&gt;Indonesian&lt;\/option&gt;&lt;option&gt;Turkish&lt;\/option&gt;&lt;option&gt;Dutch&lt;\/option&gt;&lt;option&gt;Polish&lt;\/option&gt;&lt;option&gt;Swedish&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"tone\"&gt;Tone&lt;\/label&gt;\r\n &lt;select id=\"tone\" name=\"tone\" required&gt;\r\n &lt;option&gt;Professional&lt;\/option&gt;&lt;option&gt;Enthusiastic&lt;\/option&gt;&lt;option&gt;Neutral&lt;\/option&gt;&lt;option&gt;Friendly&lt;\/option&gt;\r\n &lt;option&gt;Authoritative&lt;\/option&gt;&lt;option&gt;Conversational&lt;\/option&gt;&lt;option&gt;Inspirational&lt;\/option&gt;&lt;option&gt;Technical&lt;\/option&gt;\r\n &lt;option&gt;Journalistic&lt;\/option&gt;&lt;option&gt;Humorous&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"style\"&gt;Style&lt;\/label&gt;\r\n &lt;select id=\"style\" name=\"style\" required&gt;\r\n &lt;option&gt;Blog writing&lt;\/option&gt;&lt;option&gt;How-to guide&lt;\/option&gt;&lt;option&gt;Listicle&lt;\/option&gt;&lt;option&gt;Case study&lt;\/option&gt;&lt;option&gt;White paper&lt;\/option&gt;\r\n &lt;option&gt;News article&lt;\/option&gt;&lt;option&gt;Product review&lt;\/option&gt;&lt;option&gt;Interview style&lt;\/option&gt;&lt;option&gt;Q&amp;A&lt;\/option&gt;&lt;option&gt;Storytelling&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"wordCount\"&gt;Word count per article&lt;\/label&gt;\r\n &lt;input id=\"wordCount\" name=\"wordCount\" type=\"number\" min=\"300\" step=\"50\" value=\"1200\" required&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"faqs\"&gt;Include FAQs?&lt;\/label&gt;\r\n &lt;select id=\"faqs\" name=\"faqs\" required&gt;\r\n &lt;option value=\"Yes\"&gt;Yes&lt;\/option&gt;\r\n &lt;option value=\"No\" selected&gt;No&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"articlesCount\"&gt;How many article ideas?&lt;\/label&gt;\r\n &lt;div id=\"articleNotice\" class=\"notice\"&gt;&lt;\/div&gt;\r\n &lt;input id=\"articlesCount\" name=\"articlesCount\" type=\"number\" min=\"1\" max=\"50\" step=\"1\" value=\"12\" required&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field\"&gt;\r\n &lt;label for=\"extra\"&gt;Other important information (optional)&lt;\/label&gt;\r\n &lt;textarea id=\"extra\" name=\"extra\" rows=\"2\"\r\n placeholder=\"Deadlines, target audience, mandatory sections, brand voice guidelines, etc.\"&gt;&lt;\/textarea&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"actions\"&gt;\r\n &lt;button type=\"submit\" class=\"btn primary\"&gt;GENERATE NOW&lt;\/button&gt;\r\n &lt;button type=\"reset\" class=\"btn ghost\" id=\"resetBtn\"&gt;Reset&lt;\/button&gt;\r\n &lt;button type=\"button\" class=\"btn\" id=\"copyBtn\" disabled&gt;Copy final prompt&lt;\/button&gt;\r\n &lt;\/div&gt;\r\n &lt;\/form&gt;\r\n &lt;section class=\"output\"&gt;\r\n &lt;h2 class=\"section-title\"&gt;Your ChatGPT Prompt&lt;\/h2&gt;\r\n &lt;textarea id=\"result\" rows=\"14\" readonly\r\n placeholder=\"Your generated prompt will appear here...\"&gt;&lt;\/textarea&gt;\r\n &lt;\/section&gt;\r\n &lt;footer class=\"footnote\"&gt;\r\n &lt;p&gt;Runs locally in your browser. No data is sent anywhere.&lt;\/p&gt;\r\n &lt;\/footer&gt;\r\n &lt;\/main&gt;\r\n &lt;script src=\"popup.js\" defer&gt;&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n <\/code><\/pre>\n<\/blockquote>\n<h2><span class=\"ez-toc-section\" id=\"3_popupcss\"><\/span>3) popup.css<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What it does: Simple, modern dark theme; compact and readable in the popup and in the full-page view.<\/p>\n<blockquote>\n<pre><code>\r\n :root{\r\n --bg:#0f172a; --panel:#111827; --muted:#94a3b8; --text:#e5e7eb;\r\n --accent:#6366f1; --accent-strong:#4f46e5; --ring:rgba(99,102,241,.35);\r\n --ok:#16a34a; --ghost:#1f2937;\r\n}\r\n*{box-sizing:border-box}\r\nhtml,body{\r\n margin:0;padding:0;\r\n font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;\r\n background:linear-gradient(180deg,#0b1022,#0f172a);\r\n color:var(--text);\r\n}\r\n.container{width:400px;padding:16px 16px 12px}\r\n.app-title{font-size:20px;margin:0 0 10px}\r\nform{\r\n background:rgba(17,24,39,.65);\r\n border:1px solid rgba(99,102,241,.15);\r\n border-radius:14px;padding:12px;\r\n backdrop-filter:blur(6px);\r\n box-shadow:0 10px 25px rgba(0,0,0,.35);\r\n}\r\n.field{margin-bottom:10px}\r\n.label-row{display:flex;align-items:center;justify-content:space-between}\r\n.chip{\r\n display:inline-block;background:rgba(99,102,241,.15);\r\n border:1px solid rgba(99,102,241,.35);\r\n padding:2px 8px;border-radius:999px;font-size:12px;\r\n}\r\nlabel{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}\r\ninput[type=\"number\"],select,textarea{\r\n width:100%;padding:10px 12px;border:1px solid rgba(148,163,184,.35);\r\n background:#0b1022;color:var(--text);border-radius:10px;outline:none;\r\n transition:box-shadow .2s,border-color .2s;\r\n}\r\ntextarea{resize:vertical}\r\ninput:focus,select:focus,textarea:focus{\r\n border-color:var(--accent);box-shadow:0 0 0 3px var(--ring);\r\n}\r\n.hint,.notice{display:block;margin-top:6px;font-size:11px;color:var(--muted);min-height:14px}\r\n.row{display:grid;grid-template-columns:1fr 1fr;gap:10px}\r\n.half{width:100%}\r\n.import-row{display:flex;align-items:center;gap:8px;margin-top:8px}\r\n.inline{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}\r\n.actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}\r\n.btn{\r\n border:1px solid rgba(148,163,184,.35);\r\n background:var(--ghost);color:var(--text);\r\n padding:10px 12px;border-radius:10px;font-weight:600;font-size:13px;cursor:pointer;\r\n}\r\n.btn.small{padding:6px 10px;font-size:12px}\r\n.btn.primary{background:linear-gradient(135deg,var(--accent),var(--accent-strong));border-color:transparent}\r\n.btn:disabled{opacity:.6;cursor:not-allowed}\r\n.output{\r\n margin-top:12px;background:rgba(17,24,39,.65);\r\n border:1px solid rgba(99,102,241,.15);border-radius:14px;padding:12px;\r\n}\r\n.section-title{margin:0 0 8px 0;font-size:14px;color:var(--muted)}\r\n#result{\r\n width:100%;min-height:180px;\r\n font-family:ui-monospace,Consolas,Menlo,monospace;\r\n font-size:12px;line-height:1.4;border-radius:10px;background:#0b1022;color:#d1d5db;\r\n border:1px solid rgba(148,163,184,.35);\r\n}\r\n.footnote{text-align:center;font-size:11px;color:var(--muted);margin-top:8px}\r\n <\/code><\/pre>\n<\/blockquote>\n<div class=\"su-button-center\"><a href=\"https:\/\/danielepais.com\/journal\/understanding-http-the-backbone-of-web-communication\/\" class=\"su-button su-button-style-3d su-button-wide\" style=\"color:#FFFFFF;background-color:#17BBA0;border-color:#139680;border-radius:10px\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color:#FFFFFF;padding:8px 26px;font-size:20px;line-height:30px;border-color:#5dd0bd;border-radius:10px;text-shadow:none\"><i class=\"sui sui-crosshairs\" style=\"font-size:20px;color:#FFFFFF\"><\/i> Understanding HTTP<small style=\"padding-bottom:8px;color:#FFFFFF\">The Backbone of Web Communication<\/small><\/span><\/a><\/div>\n<h2><span class=\"ez-toc-section\" id=\"_4_popupjs\"><\/span>\u00a04) popup.js<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What it does: All the behavior. Highlights include multi-format keyword parsing, live counter, import with replace\/merge, paste sanitizer, live notice, gentle auto-adjust, strict 1:1 mapping when multiple keywords are present, copy\/reset, and opening the full-page editor.<\/p>\n<blockquote>\n<pre><code>\r\n 'use strict';\r\n\/* ===== Constants (used for validation defaults if needed) ===== *\/\r\nconst LANGS = [\r\n \"English\",\"Spanish\",\"Portuguese\",\"Italian\",\"German\",\"French\",\r\n \"Chinese (Simplified)\",\"Chinese (Traditional)\",\"Japanese\",\"Korean\",\"Russian\",\r\n \"Arabic\",\"Hindi\",\"Thai\",\"Indonesian\",\"Turkish\",\"Dutch\",\"Polish\",\"Swedish\"\r\n];\r\nconst TONES = [\r\n \"Professional\",\"Enthusiastic\",\"Neutral\",\"Friendly\",\"Authoritative\",\r\n \"Conversational\",\"Inspirational\",\"Technical\",\"Journalistic\",\"Humorous\"\r\n];\r\nconst STYLES = [\r\n \"Blog writing\",\"How-to guide\",\"Listicle\",\"Case study\",\"White paper\",\r\n \"News article\",\"Product review\",\"Interview style\",\"Q&amp;A\",\"Storytelling\"\r\n];\r\nconst $ = (sel) =&gt; document.querySelector(sel);\r\n\/* ===== Utilities ===== *\/\r\nfunction normalizeKeywords(raw) {\r\n if (!raw) return [];\r\n return Array.from(new Set(\r\n raw.split(\/\\r?\\n|,|;\/g).map(s =&gt; s.trim()).filter(Boolean)\r\n ));\r\n}\r\nfunction persistForm() {\r\n const form = $('#promptForm');\r\n if (!form) return;\r\n const data = Object.fromEntries(new FormData(form).entries());\r\n try { localStorage.setItem('epg.form', JSON.stringify(data)); } catch {}\r\n}\r\nfunction restoreForm() {\r\n try {\r\n const raw = localStorage.getItem('epg.form');\r\n if (!raw) return;\r\n const data = JSON.parse(raw);\r\n for (const [k, v] of Object.entries(data)) {\r\n const el = document.querySelector(`[name=\"${k}\"]`);\r\n if (el) el.value = v;\r\n }\r\n } catch {}\r\n}\r\nfunction updateKwCount() {\r\n const n = normalizeKeywords($('#keywords')?.value || \"\").length;\r\n const chip = $('#kwCount');\r\n if (chip) chip.textContent = String(n);\r\n}\r\nfunction updateArticleCountNotice() {\r\n const kwList = normalizeKeywords($('#keywords')?.value || \"\");\r\n const requested = parseInt($('#articlesCount')?.value || \"0\", 10);\r\n const note = $('#articleNotice');\r\n if (!note) return;\r\n note.textContent = \"\";\r\n if (kwList.length &gt; 1) {\r\n if (requested &gt; kwList.length) {\r\n note.textContent = `Tip: You have ${kwList.length} unique keywords but requested ${requested}. The count will be capped to ${kwList.length}.`;\r\n } else if (requested &lt; kwList.length &amp;&amp; requested &gt;= 1) {\r\n note.textContent = `Tip: You have ${kwList.length} unique keywords but requested ${requested}. The count will be increased to ${kwList.length}.`;\r\n }\r\n } else if (requested &lt; 3) {\r\n note.textContent = `Tip: Minimum recommended is 3 article ideas.`;\r\n }\r\n}\r\nfunction gentleAutoAdjust() {\r\n const kwList = normalizeKeywords($('#keywords')?.value || \"\");\r\n const ac = $('#articlesCount');\r\n if (kwList.length &gt; 1 &amp;&amp; ac) {\r\n ac.value = String(kwList.length);\r\n }\r\n updateArticleCountNotice();\r\n}\r\n\/* Import from file (.txt\/.csv) *\/\r\nasync function importKeywordsFromFile() {\r\n const input = $('#fileInput');\r\n const replace = $('#replaceToggle')?.checked ?? true;\r\n if (!input) return;\r\n return new Promise((resolve) =&gt; {\r\n input.onchange = async (e) =&gt; {\r\n const file = e.target.files?.[0];\r\n if (!file) return resolve(false);\r\n try {\r\n const text = await file.text();\r\n const imported = normalizeKeywords(text);\r\n const current = normalizeKeywords($('#keywords')?.value || \"\");\r\n const merged = replace ? imported : Array.from(new Set([...current, ...imported]));\r\n const ta = $('#keywords');\r\n if (ta) ta.value = merged.join('\\n');\r\n updateKwCount();\r\n gentleAutoAdjust();\r\n persistForm();\r\n } catch (e) {\r\n console.error('Import failed:', e);\r\n } finally {\r\n input.value = \"\";\r\n resolve(true);\r\n }\r\n };\r\n input.click();\r\n });\r\n}\r\nfunction buildPrompt(data) {\r\n const kwList = normalizeKeywords(data.keywords);\r\n const kwStr = kwList.join(', ');\r\n const mappingRule = kwList.length &gt; 1\r\n ? `- For each suggested article, use exactly one unique keyword from the provided list (no repeats). Map articles 1:1 to keywords in order.`\r\n : null;\r\n return [\r\n `Act as a copywriter. Using the suggested keywords, create a complete editorial plan based on the following requirements:`,\r\n ``,\r\n `\u2022 Language: ${data.language}`,\r\n `\u2022 Tone: ${data.tone}`,\r\n `\u2022 Style: ${data.style}`,\r\n `\u2022 Include FAQs: ${data.faqs}`,\r\n `\u2022 Target word count per article: ${data.wordCount}`,\r\n `\u2022 Number of article ideas to propose: ${data.articlesCount}`,\r\n `\u2022 Keywords (comma separated): ${kwStr}`,\r\n data.extra ? `\u2022 Other important information: ${data.extra}` : null,\r\n ``,\r\n `For each suggested article, provide:`,\r\n `1) SEO title (max 60 characters)`,\r\n `2) SEO description (max 160 characters)`,\r\n `3) Image alt tag`,\r\n `4) Brief outline of the article (4\u20136 bullet points).`,\r\n ``,\r\n `Important notes:`,\r\n mappingRule,\r\n `- Make sure the keywords are naturally integrated.`,\r\n `- Avoid repetition across titles; ensure variety.`,\r\n `- Keep SEO title\/description within the character limits.`,\r\n ``,\r\n `Return the full plan in ${data.language}.`\r\n ].filter(Boolean).join('\\n');\r\n}\r\n\/* ===== Init ===== *\/\r\nfunction initUI() {\r\n const form = $('#promptForm');\r\n if (!form) { console.error('promptForm not found'); return; }\r\n \/\/ restore previous session\r\n restoreForm();\r\n \/\/ counters and notice\r\n updateKwCount();\r\n updateArticleCountNotice();\r\n \/\/ popup \u2192 open full page\r\n const openBtn = $('#openFullBtn');\r\n if (openBtn) {\r\n openBtn.addEventListener('click', () =&gt; {\r\n const url = chrome.runtime.getURL('app.html');\r\n window.open(url, '_blank');\r\n });\r\n }\r\n \/\/ import\r\n const importBtn = $('#importBtn');\r\n if (importBtn) {\r\n importBtn.addEventListener('click', importKeywordsFromFile);\r\n }\r\n \/\/ input persistence &amp; live hints\r\n form.addEventListener('input', () =&gt; {\r\n updateKwCount();\r\n updateArticleCountNotice();\r\n persistForm();\r\n });\r\n \/\/ paste sanitizer and blur auto-adjust\r\n const kw = $('#keywords');\r\n if (kw) {\r\n kw.addEventListener('paste', () =&gt; {\r\n setTimeout(() =&gt; {\r\n const cleaned = normalizeKeywords(kw.value).join('\\n');\r\n kw.value = cleaned;\r\n updateKwCount();\r\n gentleAutoAdjust();\r\n persistForm();\r\n }, 0);\r\n });\r\n kw.addEventListener('blur', gentleAutoAdjust);\r\n }\r\n const ac = $('#articlesCount');\r\n if (ac) ac.addEventListener('blur', gentleAutoAdjust);\r\n \/\/ submit\r\n form.addEventListener('submit', (e) =&gt; {\r\n e.preventDefault();\r\n const data = Object.fromEntries(new FormData(form).entries());\r\n const note = $('#articleNotice');\r\n if (note) note.textContent = \"\";\r\n const kw = (data.keywords || \"\").trim();\r\n const wc = parseInt(data.wordCount, 10);\r\n let n = parseInt(data.articlesCount, 10);\r\n const kwList = normalizeKeywords(data.keywords);\r\n if (!kw) {\r\n if (note) note.textContent = \"Please enter at least one keyword.\";\r\n $('#keywords')?.focus();\r\n return;\r\n }\r\n if (Number.isNaN(wc) || wc &lt; 300) {\r\n if (note) note.textContent = \"Please set a word count of at least 300.\";\r\n $('#wordCount')?.focus();\r\n return;\r\n }\r\n if (kwList.length &gt; 1) {\r\n n = kwList.length;\r\n const ac = $('#articlesCount'); if (ac) ac.value = String(n);\r\n data.articlesCount = String(n);\r\n } else if (Number.isNaN(n) || n &lt; 1) {\r\n if (note) note.textContent = \"Please request at least 1 article idea.\";\r\n $('#articlesCount')?.focus();\r\n return;\r\n }\r\n const prompt = buildPrompt(data);\r\n const out = $('#result');\r\n if (out) {\r\n out.value = prompt;\r\n const copyBtn = $('#copyBtn');\r\n if (copyBtn) copyBtn.disabled = false;\r\n }\r\n });\r\n \/\/ reset\r\n const resetBtn = $('#resetBtn');\r\n if (resetBtn) {\r\n resetBtn.addEventListener('click', () =&gt; {\r\n const out = $('#result'); if (out) out.value = \"\";\r\n const copyBtn = $('#copyBtn'); if (copyBtn) copyBtn.disabled = true;\r\n try { localStorage.removeItem('epg.form'); } catch {}\r\n $('#language') &amp;&amp; ($('#language').value = 'English');\r\n $('#tone') &amp;&amp; ($('#tone').value = 'Professional');\r\n $('#style') &amp;&amp; ($('#style').value = 'Blog writing');\r\n updateKwCount();\r\n const note = $('#articleNotice'); if (note) note.textContent = \"\";\r\n });\r\n }\r\n \/\/ copy\r\n const copyBtn = $('#copyBtn');\r\n if (copyBtn) {\r\n copyBtn.addEventListener('click', async () =&gt; {\r\n const txt = ($('#result')?.value || \"\").trim();\r\n if (!txt) return;\r\n try {\r\n await navigator.clipboard.writeText(txt);\r\n const prev = copyBtn.textContent;\r\n copyBtn.textContent = \"Copied!\";\r\n copyBtn.style.background = \"linear-gradient(135deg, #16a34a, #0ea5e9)\";\r\n setTimeout(() =&gt; {\r\n copyBtn.textContent = prev;\r\n copyBtn.style.background = \"\";\r\n }, 1200);\r\n } catch (err) {\r\n const out = $('#result');\r\n out?.select();\r\n document.execCommand('copy');\r\n alert('Copied to clipboard.');\r\n }\r\n });\r\n }\r\n}\r\n\/* Boot *\/\r\nif (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', initUI);\r\n} else {\r\n initUI();\r\n}\r\n <\/code><\/pre>\n<\/blockquote>\n<h2><span class=\"ez-toc-section\" id=\"_5_apphtml\"><\/span>\u00a05) app.html<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What it does: Opens the exact same UI as a normal tab (persistent), so the OS file picker won\u2019t close your interface during imports.<\/p>\n<blockquote>\n<pre><code>\r\n &lt;!doctype html&gt;\r\n&lt;html lang=\"en\"&gt;\r\n&lt;head&gt;\r\n &lt;meta charset=\"utf-8\"&gt;\r\n &lt;meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"&gt;\r\n &lt;title&gt;Editorial Plan Prompt Generator \u2014 Full Page&lt;\/title&gt;\r\n &lt;link rel=\"stylesheet\" href=\"popup.css\"&gt;\r\n &lt;style&gt;\r\n .container { width: min(900px, 92vw); margin: 24px auto; }\r\n .app-title { display: flex; align-items: baseline; gap: 8px; }\r\n .tag { font-size: 11px; padding: 2px 8px; border-radius: 999px;\r\n border: 1px solid rgba(99,102,241,.35); color: #c7d2fe; }\r\n &lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n &lt;main class=\"container\"&gt;\r\n &lt;h1 class=\"app-title\"&gt;Editorial Plan Prompt Generator &lt;span class=\"tag\"&gt;Full Page&lt;\/span&gt;&lt;\/h1&gt;\r\n &lt;form id=\"promptForm\" autocomplete=\"off\" novalidate&gt;\r\n &lt;div class=\"field\"&gt;\r\n &lt;div class=\"label-row\"&gt;\r\n &lt;label for=\"keywords\"&gt;Keywords&lt;\/label&gt;\r\n &lt;span class=\"chip\" id=\"kwCount\"&gt;0&lt;\/span&gt;\r\n &lt;\/div&gt;\r\n &lt;textarea id=\"keywords\" name=\"keywords\" rows=\"8\"\r\n placeholder=\"One keyword per line (or comma-separated).\r\nExample:\r\nelectric bike\r\ncity commute\r\nbattery life\"&gt;&lt;\/textarea&gt;\r\n &lt;small class=\"hint\"&gt;Paste from a spreadsheet \u2014 we\u2019ll trim, deduplicate, and remove blank lines.&lt;\/small&gt;\r\n &lt;div class=\"import-row\"&gt;\r\n &lt;input type=\"file\" id=\"fileInput\" accept=\".txt,.csv\" hidden&gt;\r\n &lt;button type=\"button\" class=\"btn small\" id=\"importBtn\"&gt;Import keywords (.txt\/.csv)&lt;\/button&gt;\r\n &lt;label class=\"inline\"&gt;\r\n &lt;input type=\"checkbox\" id=\"replaceToggle\" checked&gt;\r\n Replace existing\r\n &lt;\/label&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"language\"&gt;Language&lt;\/label&gt;\r\n &lt;select id=\"language\" name=\"language\" required&gt;\r\n &lt;option&gt;English&lt;\/option&gt;&lt;option&gt;Spanish&lt;\/option&gt;&lt;option&gt;Portuguese&lt;\/option&gt;&lt;option&gt;Italian&lt;\/option&gt;\r\n &lt;option&gt;German&lt;\/option&gt;&lt;option&gt;French&lt;\/option&gt;&lt;option&gt;Chinese (Simplified)&lt;\/option&gt;&lt;option&gt;Chinese (Traditional)&lt;\/option&gt;\r\n &lt;option&gt;Japanese&lt;\/option&gt;&lt;option&gt;Korean&lt;\/option&gt;&lt;option&gt;Russian&lt;\/option&gt;&lt;option&gt;Arabic&lt;\/option&gt;&lt;option&gt;Hindi&lt;\/option&gt;\r\n &lt;option&gt;Thai&lt;\/option&gt;&lt;option&gt;Indonesian&lt;\/option&gt;&lt;option&gt;Turkish&lt;\/option&gt;&lt;option&gt;Dutch&lt;\/option&gt;&lt;option&gt;Polish&lt;\/option&gt;&lt;option&gt;Swedish&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"tone\"&gt;Tone&lt;\/label&gt;\r\n &lt;select id=\"tone\" name=\"tone\" required&gt;\r\n &lt;option&gt;Professional&lt;\/option&gt;&lt;option&gt;Enthusiastic&lt;\/option&gt;&lt;option&gt;Neutral&lt;\/option&gt;&lt;option&gt;Friendly&lt;\/option&gt;\r\n &lt;option&gt;Authoritative&lt;\/option&gt;&lt;option&gt;Conversational&lt;\/option&gt;&lt;option&gt;Inspirational&lt;\/option&gt;&lt;option&gt;Technical&lt;\/option&gt;\r\n &lt;option&gt;Journalistic&lt;\/option&gt;&lt;option&gt;Humorous&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"style\"&gt;Style&lt;\/label&gt;\r\n &lt;select id=\"style\" name=\"style\" required&gt;\r\n &lt;option&gt;Blog writing&lt;\/option&gt;&lt;option&gt;How-to guide&lt;\/option&gt;&lt;option&gt;Listicle&lt;\/option&gt;&lt;option&gt;Case study&lt;\/option&gt;&lt;option&gt;White paper&lt;\/option&gt;\r\n &lt;option&gt;News article&lt;\/option&gt;&lt;option&gt;Product review&lt;\/option&gt;&lt;option&gt;Interview style&lt;\/option&gt;&lt;option&gt;Q&amp;A&lt;\/option&gt;&lt;option&gt;Storytelling&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"wordCount\"&gt;Word count per article&lt;\/label&gt;\r\n &lt;input id=\"wordCount\" name=\"wordCount\" type=\"number\" min=\"300\" step=\"50\" value=\"1200\" required&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"row\"&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"faqs\"&gt;Include FAQs?&lt;\/label&gt;\r\n &lt;select id=\"faqs\" name=\"faqs\" required&gt;\r\n &lt;option value=\"Yes\"&gt;Yes&lt;\/option&gt;\r\n &lt;option value=\"No\" selected&gt;No&lt;\/option&gt;\r\n &lt;\/select&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field half\"&gt;\r\n &lt;label for=\"articlesCount\"&gt;How many article ideas?&lt;\/label&gt;\r\n &lt;div id=\"articleNotice\" class=\"notice\"&gt;&lt;\/div&gt;\r\n &lt;input id=\"articlesCount\" name=\"articlesCount\" type=\"number\" min=\"1\" max=\"50\" step=\"1\" value=\"12\" required&gt;\r\n &lt;\/div&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"field\"&gt;\r\n &lt;label for=\"extra\"&gt;Other important information (optional)&lt;\/label&gt;\r\n &lt;textarea id=\"extra\" name=\"extra\" rows=\"3\"\r\n placeholder=\"Deadlines, target audience, mandatory sections, brand voice guidelines, etc.\"&gt;&lt;\/textarea&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\"actions\"&gt;\r\n &lt;button type=\"submit\" class=\"btn primary\"&gt;GENERATE NOW&lt;\/button&gt;\r\n &lt;button type=\"reset\" class=\"btn ghost\" id=\"resetBtn\"&gt;Reset&lt;\/button&gt;\r\n &lt;button type=\"button\" class=\"btn\" id=\"copyBtn\" disabled&gt;Copy final prompt&lt;\/button&gt;\r\n &lt;\/div&gt;\r\n &lt;\/form&gt;\r\n &lt;section class=\"output\"&gt;\r\n &lt;h2 class=\"section-title\"&gt;Your ChatGPT Prompt&lt;\/h2&gt;\r\n &lt;textarea id=\"result\" rows=\"18\" readonly\r\n placeholder=\"Your generated prompt will appear here...\"&gt;&lt;\/textarea&gt;\r\n &lt;\/section&gt;\r\n &lt;footer class=\"footnote\"&gt;\r\n &lt;p&gt;Runs locally in your browser. No data is sent anywhere.&lt;\/p&gt;\r\n &lt;\/footer&gt;\r\n &lt;\/main&gt;\r\n &lt;script src=\"popup.js\" defer&gt;&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n <\/code><\/pre>\n<\/blockquote>\n<div class=\"boxlink\">Read also: <a title=\"Quick Amazon ASIN Extractor Tool\" href=\"https:\/\/danielepais.com\/journal\/quick-amazon-asin-extractor-tool\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\">Quick Amazon ASIN Extractor Tool<\/a><\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_icons_icon16png_icon32png_icon48png_icon128png\"><\/span>6) icons\/ (icon16.png, icon32.png, icon48.png, icon128.png)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>What they do: Chrome uses these in the toolbar, the Extensions page, and the Web Store. Keep them square. A simple approach is a solid indigo background with white \u201cEPG\u201d text centered.<\/p>\n<p>Quick <a href=\"https:\/\/danielepais.com\/journal\/fill-a-layer-photoshop-daily-tips-shortcut-master\/\">tips<\/a>:<\/p>\n<ul>\n<li>\n<p>Sizes: 16\u00d716, 32\u00d732, 48\u00d748, 128\u00d7128 PNG.<\/p>\n<\/li>\n<li>\n<p>Keep text large and bold for visibility at 16\u00d716.<\/p>\n<\/li>\n<li>\n<p>You can export once at 512\u00d7512 and downscale to required sizes to keep visual consistency.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Installation_instructions\"><\/span>Installation instructions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<p>Go to chrome:\/\/extensions in Chrome.<\/p>\n<\/li>\n<li>\n<p>Toggle on Developer mode (top-right).<\/p>\n<\/li>\n<li>\n<p>Click Load unpacked and select your project folder.<\/p>\n<\/li>\n<li>\n<p>Pin the extension from the puzzle-piece icon, then click it to open the popup.<\/p>\n<\/li>\n<li>\n<p>For importing files, use Open full page (or open app.html directly) so the UI doesn\u2019t close while the OS file picker is open.<\/p>\n<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"Test_flow\"><\/span>Test flow<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p>Paste a messy keyword list \u2192 show that duplicates\/blank lines disappear and the counter updates.<\/p>\n<\/li>\n<li>\n<p>Import a .txt or .csv with keywords \u2192 show Replace existing on\/off behavior.<\/p>\n<\/li>\n<li>\n<p>Enter multiple keywords \u2192 watch the inline notice and automatic article-count adjustment.<\/p>\n<\/li>\n<li>\n<p>Click GENERATE NOW \u2192 show the final prompt populated.<\/p>\n<\/li>\n<li>\n<p>Click Copy final prompt \u2192 show the \u201cCopied!\u201d feedback.<\/p>\n<\/li>\n<li>\n<p>Click Reset \u2192 show defaults restored and output cleared.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"The_popup_UI_what_users_see_first\"><\/span>The popup UI (what users see first)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The popup contains:<\/p>\n<ul>\n<li>\n<p>A Keywords textarea with the hint \u201cone keyword per line\u201d (still accepts commas\/semicolons).<\/p>\n<\/li>\n<li>\n<p>An Import button wired to a hidden file input (accept <code>.txt<\/code>\/<code>.csv<\/code>).<\/p>\n<\/li>\n<li>\n<p>A Replace existing toggle (merge when off).<\/p>\n<\/li>\n<li>\n<p>Selects for Language, Tone, Style with sensible defaults.<\/p>\n<\/li>\n<li>\n<p>Inputs for FAQs (Yes\/No), Word Count, and How many article ideas.<\/p>\n<\/li>\n<li>\n<p>A live notice that explains if the article count will be capped or increased to match your keywords.<\/p>\n<\/li>\n<li>\n<p>Buttons: GENERATE NOW, Reset, Copy final prompt.<\/p>\n<\/li>\n<li>\n<p>A read-only output box with your generated prompt.<\/p>\n<\/li>\n<\/ul>\n<p>Tip: we also include an <strong>Open full page<\/strong> button that opens <code>app.html<\/code> in a normal tab, so the UI doesn\u2019t close when your OS\u2019s file picker opens during import.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Core_behavior_and_best_practices\"><\/span>Core behavior and best practices<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p><strong>Multi-format keywords<\/strong><br \/>\nThe parser splits on newlines first, but also accepts commas and semicolons. It trims spaces, ignores empty lines, and deduplicates. Paste directly from spreadsheets or SEO tools.<\/p>\n<\/li>\n<li>\n<p><strong>Live keyword counter<\/strong><br \/>\nAs you type, paste, or import, a small counter updates so you always know how many unique keywords are detected.<\/p>\n<\/li>\n<li>\n<p><strong>1:1 mapping to articles<\/strong><br \/>\nIf multiple keywords are provided, the tool sets the article count to match the number of unique keywords. This prevents duplicate keyword usage and keeps your plan organized.<\/p>\n<\/li>\n<li>\n<p><strong>Gentle auto-adjust<\/strong><br \/>\nWhen you leave the Keywords or article count field, the tool aligns the count to your keyword list and shows a subtle inline notice rather than intrusive alerts.<\/p>\n<\/li>\n<li>\n<p><strong>Local persistence<\/strong><br \/>\nThe last set of values is saved to localStorage so you can pick up where you left off.<\/p>\n<\/li>\n<\/ul>\n<div class=\"su-custom-gallery su-custom-gallery-align-left su-custom-gallery-title-hover su-lightbox-gallery\"><div class=\"su-custom-gallery-slide\" style=\"width:225px;height:225px\"><a href=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.47.36.png\" title=\"\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.47.36-225x225.png\" alt=\"Prompt generator &#8211; top part\" width=\"225\" height=\"225\" \/><span class=\"su-custom-gallery-title\">Prompt generator &#8211; top part<\/span><\/a><\/div><div class=\"su-custom-gallery-slide\" style=\"width:225px;height:225px\"><a href=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.48.01.png\" title=\"\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.48.01-225x225.png\" alt=\"Prompt generator &#8211; bottom part\" width=\"225\" height=\"225\" \/><span class=\"su-custom-gallery-title\">Prompt generator &#8211; bottom part<\/span><\/a><\/div><div class=\"su-custom-gallery-slide\" style=\"width:225px;height:225px\"><a href=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.49.31.png\" title=\"\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Screenshot-2025-08-14-23.49.31-225x225.png\" alt=\"Prompt generator &#8211; results pasted from clipboard\" width=\"225\" height=\"225\" \/><span class=\"su-custom-gallery-title\">Prompt generator &#8211; results pasted from clipboard<\/span><\/a><\/div><div class=\"su-clear\"><\/div><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Example_prompt_the_extension_generates\"><\/span>Example prompt the extension generates<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When you click GENERATE NOW, you\u2019ll get a clean prompt like this (values will reflect your selections):<\/p>\n<p>Act as a copywriter. Using the suggested keywords, create a complete editorial plan based on the following requirements:<\/p>\n<p>\u2022 Language: English<br \/>\n\u2022 Tone: Professional<br \/>\n\u2022 Style: Blog writing<br \/>\n\u2022 Include FAQs: Yes<br \/>\n\u2022 Target word count per article: 1200<br \/>\n\u2022 Number of article ideas to propose: 8<br \/>\n\u2022 Keywords (comma separated): electric bike, city commute, battery life, Fiido T2, &#8230;<\/p>\n<p>For each suggested article, provide:<br \/>\n1) SEO title (max 60 characters)<br \/>\n2) SEO description (max 160 characters)<br \/>\n3) Image alt tag<br \/>\n4) Brief outline of the article (4\u20136 bullet points).<\/p>\n<p>Important notes:<br \/>\n&#8211; For each suggested article, use exactly one unique keyword from the provided list (no repeats). Map articles 1:1 to keywords in order.<br \/>\n&#8211; Make sure the keywords are naturally integrated.<br \/>\n&#8211; Avoid repetition across titles; ensure variety.<br \/>\n&#8211; Keep SEO title\/description within the character limits.<\/p>\n<p>Return the full plan in English.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Recommended_workflow\"><\/span>Recommended workflow<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<p>Paste or import your keywords (one per line). The counter updates and duplicates are removed.<\/p>\n<\/li>\n<li>\n<p>Set Language, Tone, Style, FAQs, and Word Count.<\/p>\n<\/li>\n<li>\n<p>If you supplied multiple keywords, the tool enforces 1:1 keyword-to-article mapping automatically.<\/p>\n<\/li>\n<li>\n<p>Click <strong>GENERATE NOW<\/strong>. Review the generated prompt in the output box.<\/p>\n<\/li>\n<li>\n<p>Click <strong>Copy final prompt<\/strong> and paste it into ChatGPT.<\/p>\n<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"Work_in_progress_suggested_next_features\"><\/span>Work in progress: suggested next features<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p>Drag-and-drop import onto the keywords box.<\/p>\n<\/li>\n<li>\n<p>Export keywords to <code>.txt<\/code>.<\/p>\n<\/li>\n<li>\n<p>Presets for Tone\/Style\/Notes (e.g., \u201cSEO blog default\u201d, \u201cJournalistic brief\u201d).<\/p>\n<\/li>\n<li>\n<p>Toggle to lock\/unlock the 1:1 rule.<\/p>\n<\/li>\n<li>\n<p>Informational counters for SEO limits (title \u226460 \/ description \u2264160).<\/p>\n<\/li>\n<li>\n<p>Options page to edit the Language\/Tone\/Style lists without touching code.<\/p>\n<\/li>\n<li>\n<p>Simple UI i18n (switch the extension labels to your preferred language).<\/p>\n<\/li>\n<li>\n<p>Backup\/restore all fields as a JSON file.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Troubleshooting\"><\/span>Troubleshooting<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<p>The popup closes during file import: use the <strong>Open full page<\/strong> tab and import there.<\/p>\n<\/li>\n<li>\n<p>Selects look empty: ensure the HTML includes inline options; JavaScript then validates and preserves them.<\/p>\n<\/li>\n<li>\n<p>Buttons don\u2019t respond: verify <code>popup.js<\/code> is loaded with <code>defer<\/code>, then reload the extension in <code>chrome:\/\/extensions<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Takeaways\"><\/span>Takeaways<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Small, purpose-built tools can dramatically speed up editorial work. With just a handful of static files, you\u2019ve built a privacy-first prompt generator that is fast, predictable, and extendable\u2014no subscriptions, no compromises, and no data leaving your device.<\/p>\n<div class=\"su-button-center\"><a href=\"https:\/\/danielepais.com\/journal\/free-downloads\/\" class=\"su-button su-button-style-3d su-button-wide\" style=\"color:#FFFFFF;background-color:#17BBA0;border-color:#139680;border-radius:10px\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color:#FFFFFF;padding:8px 26px;font-size:20px;line-height:30px;border-color:#5dd0bd;border-radius:10px;text-shadow:none\"><i class=\"sui sui-crosshairs\" style=\"font-size:20px;color:#FFFFFF\"><\/i> DOWNLOAD THE SOURCE FILES FREE<small style=\"padding-bottom:8px;color:#FFFFFF\">FREE Google Chrome Editorial Plan Prompt Generator for ChatGPT<\/small><\/span><\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)<\/p>\n","protected":false},"author":1,"featured_media":8363,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[1196,561],"tags":[],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Daniele Pais\"\/>\n\t<meta name=\"google-site-verification\" content=\"googleb91c9505ed997b99\" \/>\n\t<meta name=\"msvalidate.01\" content=\"AD1C96C338E051848BE08C67378B20CA\" \/>\n\t<meta name=\"keywords\" content=\"gpt,web development\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Daniele Pais Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design\" \/>\n\t\t<meta property=\"og:description\" content=\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"850\" \/>\n\t\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-08-14T18:27:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-08-14T18:27:15+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@daniele_pais\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2017\/10\/daniele-pais-digital-design.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#article\",\"name\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design\",\"headline\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\",\"author\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/author\\\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/Editorial-Plan-Prompt-Generator.jpg\",\"width\":850,\"height\":400,\"caption\":\"Editorial Plan Prompt Generator\"},\"datePublished\":\"2025-08-15T01:27:15+07:00\",\"dateModified\":\"2025-08-15T01:27:15+07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#webpage\"},\"articleSection\":\"GPT, Web Development\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/danielepais.com\\\/journal\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/#listItem\",\"name\":\"Web\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/#listItem\",\"position\":2,\"name\":\"Web\",\"item\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/web-development\\\/#listItem\",\"name\":\"Web Development\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/web-development\\\/#listItem\",\"position\":3,\"name\":\"Web Development\",\"item\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/web-development\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#listItem\",\"name\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/#listItem\",\"name\":\"Web\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#listItem\",\"position\":4,\"name\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/category\\\/web\\\/web-development\\\/#listItem\",\"name\":\"Web Development\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/#person\",\"name\":\"Daniele Pais\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86bedf0ab24a6d4a4f32de230cc797ef?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Daniele Pais\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/author\\\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\\\/#author\",\"url\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/author\\\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\\\/\",\"name\":\"Daniele Pais\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86bedf0ab24a6d4a4f32de230cc797ef?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Daniele Pais\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#webpage\",\"url\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/\",\"name\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design\",\"description\":\"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/author\\\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/author\\\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/Editorial-Plan-Prompt-Generator.jpg\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#mainImage\",\"width\":850,\"height\":400,\"caption\":\"Editorial Plan Prompt Generator\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\\\/#mainImage\"},\"datePublished\":\"2025-08-15T01:27:15+07:00\",\"dateModified\":\"2025-08-15T01:27:15+07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/#website\",\"url\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/\",\"name\":\"Phuket Web Design\",\"description\":\"Digital Print\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/danielepais.com\\\/journal\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design","description":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","canonical_url":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/","robots":"max-image-preview:large","keywords":"gpt,web development","webmasterTools":{"google-site-verification":"googleb91c9505ed997b99","msvalidate.01":"AD1C96C338E051848BE08C67378B20CA","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#article","name":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design","headline":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","author":{"@id":"https:\/\/danielepais.com\/journal\/author\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\/#author"},"publisher":{"@id":"https:\/\/danielepais.com\/journal\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg","width":850,"height":400,"caption":"Editorial Plan Prompt Generator"},"datePublished":"2025-08-15T01:27:15+07:00","dateModified":"2025-08-15T01:27:15+07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#webpage"},"isPartOf":{"@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#webpage"},"articleSection":"GPT, Web Development"},{"@type":"BreadcrumbList","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal#listItem","position":1,"name":"Home","item":"https:\/\/danielepais.com\/journal","nextItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/#listItem","name":"Web"}},{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/#listItem","position":2,"name":"Web","item":"https:\/\/danielepais.com\/journal\/category\/web\/","nextItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/web-development\/#listItem","name":"Web Development"},"previousItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/web-development\/#listItem","position":3,"name":"Web Development","item":"https:\/\/danielepais.com\/journal\/category\/web\/web-development\/","nextItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#listItem","name":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)"},"previousItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/#listItem","name":"Web"}},{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#listItem","position":4,"name":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","previousItem":{"@type":"ListItem","@id":"https:\/\/danielepais.com\/journal\/category\/web\/web-development\/#listItem","name":"Web Development"}}]},{"@type":"Person","@id":"https:\/\/danielepais.com\/journal\/#person","name":"Daniele Pais","image":{"@type":"ImageObject","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/86bedf0ab24a6d4a4f32de230cc797ef?s=96&d=mm&r=g","width":96,"height":96,"caption":"Daniele Pais"}},{"@type":"Person","@id":"https:\/\/danielepais.com\/journal\/author\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\/#author","url":"https:\/\/danielepais.com\/journal\/author\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\/","name":"Daniele Pais","image":{"@type":"ImageObject","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/86bedf0ab24a6d4a4f32de230cc797ef?s=96&d=mm&r=g","width":96,"height":96,"caption":"Daniele Pais"}},{"@type":"WebPage","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#webpage","url":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/","name":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design","description":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/danielepais.com\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#breadcrumblist"},"author":{"@id":"https:\/\/danielepais.com\/journal\/author\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\/#author"},"creator":{"@id":"https:\/\/danielepais.com\/journal\/author\/_-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2--2\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg","@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#mainImage","width":850,"height":400,"caption":"Editorial Plan Prompt Generator"},"primaryImageOfPage":{"@id":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/#mainImage"},"datePublished":"2025-08-15T01:27:15+07:00","dateModified":"2025-08-15T01:27:15+07:00"},{"@type":"WebSite","@id":"https:\/\/danielepais.com\/journal\/#website","url":"https:\/\/danielepais.com\/journal\/","name":"Phuket Web Design","description":"Digital Print","inLanguage":"en-US","publisher":{"@id":"https:\/\/danielepais.com\/journal\/#person"}}]},"og:locale":"en_US","og:site_name":"Daniele Pais Blog","og:type":"article","og:title":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design","og:description":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","og:url":"https:\/\/danielepais.com\/journal\/build-your-own-chrome-extension-editorial-plan-prompt-generator-privacy-first-no-subscriptions\/","og:image":"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg","og:image:secure_url":"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2025\/08\/Editorial-Plan-Prompt-Generator.jpg","og:image:width":850,"og:image:height":400,"article:published_time":"2025-08-14T18:27:15+00:00","article:modified_time":"2025-08-14T18:27:15+00:00","twitter:card":"summary","twitter:site":"@daniele_pais","twitter:title":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions) | Phuket Web Design","twitter:description":"Build Your Own Chrome Extension: Editorial Plan Prompt Generator (Privacy-First, No Subscriptions)","twitter:image":"https:\/\/danielepais.com\/journal\/wp-content\/uploads\/2017\/10\/daniele-pais-digital-design.png"},"aioseo_meta_data":{"post_id":"8360","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"Editorial Plan Prompt Generator","score":78,"analysis":{"keyphraseInTitle":{"score":9,"maxScore":9,"error":0},"keyphraseInDescription":{"score":9,"maxScore":9,"error":0},"keyphraseLength":{"score":9,"maxScore":9,"error":0,"length":4},"keyphraseInURL":{"score":5,"maxScore":5,"error":0},"keyphraseInIntroduction":{"score":9,"maxScore":9,"error":0},"keyphraseInSubHeadings":{"score":3,"maxScore":9,"error":1},"keyphraseInImageAlt":{"score":9,"maxScore":9,"error":0},"keywordDensity":{"score":0,"type":"low","maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"created":"2025-08-14 16:56:18","updated":"2025-08-14 18:36:36","ai":null,"seo_analyzer_scan_date":null},"fifu_redirection_url":"https:\/\/www.workinghomeguide.com\/25339\/become-a-home-builder-and-build-your-own-home-by-yourself","_links":{"self":[{"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/posts\/8360"}],"collection":[{"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/comments?post=8360"}],"version-history":[{"count":0,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/posts\/8360\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/media\/8363"}],"wp:attachment":[{"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/media?parent=8360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/categories?post=8360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danielepais.com\/journal\/wp-json\/wp\/v2\/tags?post=8360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}