@muskanmeet/invoicing-design-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/.cache/replit/env/latest +78 -0
  2. package/.cache/replit/env/latest.json +1 -0
  3. package/.cache/replit/modules/nodejs-20.res +1 -0
  4. package/.cache/replit/modules/python-3.11.res +1 -0
  5. package/.cache/replit/modules/replit-rtld-loader.res +1 -0
  6. package/.cache/replit/modules/replit.res +1 -0
  7. package/.cache/replit/modules.stamp +0 -0
  8. package/.cache/replit/nix/dotreplitenv.json +1 -0
  9. package/.cache/replit/toolchain.json +1 -0
  10. package/.cache/typescript/5.9/package-lock.json +50 -0
  11. package/.cache/typescript/5.9/package.json +1 -0
  12. package/.config/nextjs-nodejs/config.json +7 -0
  13. package/.eslintrc.json +3 -0
  14. package/.local/.commit_message +31 -0
  15. package/.local/secondary_skills/LICENSE.txt +21 -0
  16. package/.local/secondary_skills/ad-creative/.fingerprint +1 -0
  17. package/.local/secondary_skills/ad-creative/SKILL.md +872 -0
  18. package/.local/secondary_skills/ai-recruiter/.fingerprint +1 -0
  19. package/.local/secondary_skills/ai-recruiter/SKILL.md +1087 -0
  20. package/.local/secondary_skills/ai-sdr/.fingerprint +1 -0
  21. package/.local/secondary_skills/ai-sdr/SKILL.md +204 -0
  22. package/.local/secondary_skills/ai-secretary/.fingerprint +1 -0
  23. package/.local/secondary_skills/ai-secretary/SKILL.md +1132 -0
  24. package/.local/secondary_skills/branding-generator/.fingerprint +1 -0
  25. package/.local/secondary_skills/branding-generator/SKILL.md +286 -0
  26. package/.local/secondary_skills/competitive-analysis/.fingerprint +1 -0
  27. package/.local/secondary_skills/competitive-analysis/SKILL.md +429 -0
  28. package/.local/secondary_skills/content-machine/.fingerprint +1 -0
  29. package/.local/secondary_skills/content-machine/SKILL.md +321 -0
  30. package/.local/secondary_skills/deep-research/.fingerprint +1 -0
  31. package/.local/secondary_skills/deep-research/SKILL.md +517 -0
  32. package/.local/secondary_skills/design-thinker/.fingerprint +1 -0
  33. package/.local/secondary_skills/design-thinker/SKILL.md +327 -0
  34. package/.local/secondary_skills/excel-generator/.fingerprint +1 -0
  35. package/.local/secondary_skills/excel-generator/SKILL.md +954 -0
  36. package/.local/secondary_skills/excel-generator/financial-models.md +289 -0
  37. package/.local/secondary_skills/file-converter/.fingerprint +1 -0
  38. package/.local/secondary_skills/file-converter/SKILL.md +823 -0
  39. package/.local/secondary_skills/flashcard-generator/.fingerprint +1 -0
  40. package/.local/secondary_skills/flashcard-generator/SKILL.md +233 -0
  41. package/.local/secondary_skills/geo/.fingerprint +1 -0
  42. package/.local/secondary_skills/geo/SKILL.md +378 -0
  43. package/.local/secondary_skills/geo/references/content-patterns.md +158 -0
  44. package/.local/secondary_skills/geo/references/platform-notes.md +128 -0
  45. package/.local/secondary_skills/geo/references/scorecard.md +113 -0
  46. package/.local/secondary_skills/geo/references/technical-checklist.md +257 -0
  47. package/.local/secondary_skills/github-solution-finder/.fingerprint +1 -0
  48. package/.local/secondary_skills/github-solution-finder/SKILL.md +174 -0
  49. package/.local/secondary_skills/infographic-builder/.fingerprint +1 -0
  50. package/.local/secondary_skills/infographic-builder/SKILL.md +317 -0
  51. package/.local/secondary_skills/infographic-builder/antv-syntax.md +470 -0
  52. package/.local/secondary_skills/infographic-builder/react-fallback.md +210 -0
  53. package/.local/secondary_skills/insurance-optimizer/.fingerprint +1 -0
  54. package/.local/secondary_skills/insurance-optimizer/SKILL.md +209 -0
  55. package/.local/secondary_skills/interview-prep/.fingerprint +1 -0
  56. package/.local/secondary_skills/interview-prep/SKILL.md +349 -0
  57. package/.local/secondary_skills/invoice-generator/.fingerprint +1 -0
  58. package/.local/secondary_skills/invoice-generator/SKILL.md +527 -0
  59. package/.local/secondary_skills/legal-contract/.fingerprint +1 -0
  60. package/.local/secondary_skills/legal-contract/SKILL.md +977 -0
  61. package/.local/secondary_skills/meal-planner/.fingerprint +1 -0
  62. package/.local/secondary_skills/meal-planner/SKILL.md +517 -0
  63. package/.local/secondary_skills/personal-shopper/.fingerprint +1 -0
  64. package/.local/secondary_skills/personal-shopper/SKILL.md +361 -0
  65. package/.local/secondary_skills/photo-editor/.fingerprint +1 -0
  66. package/.local/secondary_skills/photo-editor/SKILL.md +605 -0
  67. package/.local/secondary_skills/podcast-generator/.fingerprint +1 -0
  68. package/.local/secondary_skills/podcast-generator/SKILL.md +560 -0
  69. package/.local/secondary_skills/podcast-marketing/.fingerprint +1 -0
  70. package/.local/secondary_skills/podcast-marketing/SKILL.md +550 -0
  71. package/.local/secondary_skills/podcast-marketing/audio-processing.md +530 -0
  72. package/.local/secondary_skills/podcast-marketing/content-atoms.md +253 -0
  73. package/.local/secondary_skills/podcast-marketing/content-calendar.md +318 -0
  74. package/.local/secondary_skills/podcast-marketing/content-templates.md +325 -0
  75. package/.local/secondary_skills/podcast-marketing/quote-cards.md +238 -0
  76. package/.local/secondary_skills/podcast-marketing/rss-and-batch.md +359 -0
  77. package/.local/secondary_skills/podcast-marketing/video-clips.md +660 -0
  78. package/.local/secondary_skills/podcast-marketing/youtube-processing.md +328 -0
  79. package/.local/secondary_skills/product-manager/.fingerprint +1 -0
  80. package/.local/secondary_skills/product-manager/SKILL.md +272 -0
  81. package/.local/secondary_skills/programmatic-seo/.fingerprint +1 -0
  82. package/.local/secondary_skills/programmatic-seo/SKILL.md +1207 -0
  83. package/.local/secondary_skills/real-estate-analyzer/.fingerprint +1 -0
  84. package/.local/secondary_skills/real-estate-analyzer/SKILL.md +786 -0
  85. package/.local/secondary_skills/recipe-creator/.fingerprint +1 -0
  86. package/.local/secondary_skills/recipe-creator/SKILL.md +259 -0
  87. package/.local/secondary_skills/recreate-screenshot/.fingerprint +1 -0
  88. package/.local/secondary_skills/recreate-screenshot/SKILL.md +215 -0
  89. package/.local/secondary_skills/replit-migration-guardrails/.fingerprint +1 -0
  90. package/.local/secondary_skills/replit-migration-guardrails/SKILL.md +55 -0
  91. package/.local/secondary_skills/replit-migration-guardrails/references/base44.md +47 -0
  92. package/.local/secondary_skills/replit-migration-guardrails/references/vercel.md +78 -0
  93. package/.local/secondary_skills/resume-maker/.fingerprint +1 -0
  94. package/.local/secondary_skills/resume-maker/SKILL.md +790 -0
  95. package/.local/secondary_skills/seo-auditor/.fingerprint +1 -0
  96. package/.local/secondary_skills/seo-auditor/SKILL.md +448 -0
  97. package/.local/secondary_skills/skill-creator/.fingerprint +1 -0
  98. package/.local/secondary_skills/skill-creator/SKILL.md +214 -0
  99. package/.local/secondary_skills/skill-finder/.fingerprint +1 -0
  100. package/.local/secondary_skills/skill-finder/SKILL.md +299 -0
  101. package/.local/secondary_skills/stock-analyzer/.fingerprint +1 -0
  102. package/.local/secondary_skills/stock-analyzer/SKILL.md +798 -0
  103. package/.local/secondary_skills/storyboard/.fingerprint +1 -0
  104. package/.local/secondary_skills/storyboard/SKILL.md +558 -0
  105. package/.local/secondary_skills/supplier-research/.fingerprint +1 -0
  106. package/.local/secondary_skills/supplier-research/SKILL.md +213 -0
  107. package/.local/secondary_skills/tax-reviewer/.fingerprint +1 -0
  108. package/.local/secondary_skills/tax-reviewer/SKILL.md +131 -0
  109. package/.local/secondary_skills/travel-assistant/.fingerprint +1 -0
  110. package/.local/secondary_skills/travel-assistant/SKILL.md +667 -0
  111. package/.local/secondary_skills/video-editing/.fingerprint +1 -0
  112. package/.local/secondary_skills/video-editing/SKILL.md +705 -0
  113. package/.local/secondary_skills/video-editing/dead-space-and-chunking.md +1081 -0
  114. package/.local/secondary_skills/video-editing/operations.md +1719 -0
  115. package/.local/secondary_skills/video-editing/virality-scoring.md +1212 -0
  116. package/.local/secondary_skills/video-editing/voiceover.md +788 -0
  117. package/.local/secondary_skills/website-cloning/.fingerprint +1 -0
  118. package/.local/secondary_skills/website-cloning/SKILL.md +544 -0
  119. package/.local/secondary_skills/website-cloning/extraction.md +1207 -0
  120. package/.local/secondary_skills/website-cloning/pitfalls.md +297 -0
  121. package/.local/skills/LICENSE.txt +21 -0
  122. package/.local/skills/agent-inbox/.fingerprint +1 -0
  123. package/.local/skills/agent-inbox/SKILL.md +128 -0
  124. package/.local/skills/artifacts/.fingerprint +1 -0
  125. package/.local/skills/artifacts/SKILL.md +21 -0
  126. package/.local/skills/artifacts/artifacts/automation/artifact.yaml +40 -0
  127. package/.local/skills/artifacts/artifacts/automation/files/package.json.template +47 -0
  128. package/.local/skills/artifacts/artifacts/automation/files/scripts/build.sh +6 -0
  129. package/.local/skills/artifacts/artifacts/automation/files/scripts/inngest.sh +18 -0
  130. package/.local/skills/artifacts/artifacts/automation/files/src/global.d.ts +1 -0
  131. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/agents/agent.ts +89 -0
  132. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/index.ts +212 -0
  133. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/client.ts +17 -0
  134. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/index.ts +214 -0
  135. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/storage/index.ts +8 -0
  136. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/tools/exampleTool.ts +71 -0
  137. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/workflows/workflow.ts +203 -0
  138. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/cronTriggers.ts +61 -0
  139. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/exampleConnectorTrigger.ts +153 -0
  140. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/slackTriggers.ts +638 -0
  141. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/telegramTriggers.ts +94 -0
  142. package/.local/skills/artifacts/artifacts/automation/files/tests/testCronAutomation.ts +86 -0
  143. package/.local/skills/artifacts/artifacts/automation/files/tests/testWebhookAutomation.ts +118 -0
  144. package/.local/skills/artifacts/artifacts/automation/files/tsconfig.json +26 -0
  145. package/.local/skills/artifacts/artifacts/data-visualization/artifact.yaml +48 -0
  146. package/.local/skills/artifacts/artifacts/expo/OWNERS +2 -0
  147. package/.local/skills/artifacts/artifacts/expo/artifact.yaml +47 -0
  148. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/_layout.tsx +86 -0
  149. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/index.tsx +28 -0
  150. package/.local/skills/artifacts/artifacts/expo/files/app/+not-found.tsx +45 -0
  151. package/.local/skills/artifacts/artifacts/expo/files/app/_layout.tsx +60 -0
  152. package/.local/skills/artifacts/artifacts/expo/files/app.json.template +38 -0
  153. package/.local/skills/artifacts/artifacts/expo/files/assets/images/icon.png +0 -0
  154. package/.local/skills/artifacts/artifacts/expo/files/babel.config.js +6 -0
  155. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorBoundary.tsx +54 -0
  156. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorFallback.tsx +278 -0
  157. package/.local/skills/artifacts/artifacts/expo/files/components/KeyboardAwareScrollViewCompat.tsx +29 -0
  158. package/.local/skills/artifacts/artifacts/expo/files/constants/colors.ts +59 -0
  159. package/.local/skills/artifacts/artifacts/expo/files/hooks/useColors.ts +24 -0
  160. package/.local/skills/artifacts/artifacts/expo/files/metro.config.js +3 -0
  161. package/.local/skills/artifacts/artifacts/expo/files/package.json.template +58 -0
  162. package/.local/skills/artifacts/artifacts/expo/files/scripts/build.js +573 -0
  163. package/.local/skills/artifacts/artifacts/expo/files/server/serve.js +135 -0
  164. package/.local/skills/artifacts/artifacts/expo/files/server/templates/landing-page.html +460 -0
  165. package/.local/skills/artifacts/artifacts/expo/files/tsconfig.json +23 -0
  166. package/.local/skills/artifacts/artifacts/mockup-sandbox/artifact.yaml +15 -0
  167. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/components.json +21 -0
  168. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/index.html +31 -0
  169. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/mockupPreviewPlugin.ts +199 -0
  170. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/package.json.template +75 -0
  171. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/public/favicon.svg +3 -0
  172. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/.generated/mockup-components.ts +3 -0
  173. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/App.tsx +146 -0
  174. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/accordion.tsx +55 -0
  175. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert-dialog.tsx +139 -0
  176. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert.tsx +59 -0
  177. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/aspect-ratio.tsx +5 -0
  178. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/avatar.tsx +50 -0
  179. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/badge.tsx +43 -0
  180. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/breadcrumb.tsx +115 -0
  181. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button-group.tsx +83 -0
  182. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button.tsx +65 -0
  183. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/calendar.tsx +213 -0
  184. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/card.tsx +76 -0
  185. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/carousel.tsx +260 -0
  186. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/chart.tsx +367 -0
  187. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/checkbox.tsx +28 -0
  188. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/collapsible.tsx +11 -0
  189. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/command.tsx +153 -0
  190. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/context-menu.tsx +198 -0
  191. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dialog.tsx +120 -0
  192. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/drawer.tsx +116 -0
  193. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dropdown-menu.tsx +201 -0
  194. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/empty.tsx +104 -0
  195. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/field.tsx +244 -0
  196. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/form.tsx +176 -0
  197. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/hover-card.tsx +27 -0
  198. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-group.tsx +168 -0
  199. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-otp.tsx +69 -0
  200. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input.tsx +22 -0
  201. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/item.tsx +193 -0
  202. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/kbd.tsx +28 -0
  203. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/label.tsx +26 -0
  204. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/menubar.tsx +254 -0
  205. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/navigation-menu.tsx +128 -0
  206. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/pagination.tsx +117 -0
  207. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/popover.tsx +31 -0
  208. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/progress.tsx +28 -0
  209. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/radio-group.tsx +42 -0
  210. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/resizable.tsx +45 -0
  211. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/scroll-area.tsx +46 -0
  212. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/select.tsx +159 -0
  213. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/separator.tsx +29 -0
  214. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sheet.tsx +140 -0
  215. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sidebar.tsx +727 -0
  216. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/skeleton.tsx +15 -0
  217. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/slider.tsx +26 -0
  218. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sonner.tsx +31 -0
  219. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/spinner.tsx +16 -0
  220. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/switch.tsx +27 -0
  221. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/table.tsx +120 -0
  222. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tabs.tsx +53 -0
  223. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/textarea.tsx +22 -0
  224. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toast.tsx +127 -0
  225. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toaster.tsx +33 -0
  226. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle-group.tsx +61 -0
  227. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle.tsx +43 -0
  228. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tooltip.tsx +32 -0
  229. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-mobile.tsx +19 -0
  230. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-toast.ts +189 -0
  231. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/index.css +158 -0
  232. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/lib/utils.ts +6 -0
  233. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/main.tsx +5 -0
  234. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/tsconfig.json +20 -0
  235. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/vite.config.ts +72 -0
  236. package/.local/skills/artifacts/artifacts/react-vite/artifact.yaml +41 -0
  237. package/.local/skills/artifacts/artifacts/react-vite/files/components.json +20 -0
  238. package/.local/skills/artifacts/artifacts/react-vite/files/index.html.template +24 -0
  239. package/.local/skills/artifacts/artifacts/react-vite/files/package.json.template +77 -0
  240. package/.local/skills/artifacts/artifacts/react-vite/files/public/favicon.svg +3 -0
  241. package/.local/skills/artifacts/artifacts/react-vite/files/public/robots.txt +2 -0
  242. package/.local/skills/artifacts/artifacts/react-vite/files/src/App.tsx +42 -0
  243. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/accordion.tsx +55 -0
  244. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert-dialog.tsx +139 -0
  245. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert.tsx +59 -0
  246. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/aspect-ratio.tsx +5 -0
  247. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/avatar.tsx +50 -0
  248. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/badge.tsx +43 -0
  249. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/breadcrumb.tsx +115 -0
  250. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button-group.tsx +83 -0
  251. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button.tsx +65 -0
  252. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/calendar.tsx +213 -0
  253. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/card.tsx +76 -0
  254. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/carousel.tsx +260 -0
  255. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/chart.tsx +367 -0
  256. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/checkbox.tsx +28 -0
  257. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/collapsible.tsx +11 -0
  258. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/command.tsx +153 -0
  259. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/context-menu.tsx +198 -0
  260. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dialog.tsx +120 -0
  261. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/drawer.tsx +116 -0
  262. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dropdown-menu.tsx +201 -0
  263. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/empty.tsx +104 -0
  264. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/field.tsx +244 -0
  265. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/form.tsx +176 -0
  266. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/hover-card.tsx +27 -0
  267. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-group.tsx +168 -0
  268. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-otp.tsx +69 -0
  269. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input.tsx +22 -0
  270. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/item.tsx +193 -0
  271. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/kbd.tsx +28 -0
  272. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/label.tsx +26 -0
  273. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/menubar.tsx +254 -0
  274. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/navigation-menu.tsx +128 -0
  275. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/pagination.tsx +117 -0
  276. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/popover.tsx +31 -0
  277. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/progress.tsx +28 -0
  278. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/radio-group.tsx +42 -0
  279. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/resizable.tsx +45 -0
  280. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/scroll-area.tsx +46 -0
  281. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/select.tsx +159 -0
  282. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/separator.tsx +29 -0
  283. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sheet.tsx +140 -0
  284. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sidebar.tsx +727 -0
  285. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/skeleton.tsx +15 -0
  286. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/slider.tsx +26 -0
  287. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sonner.tsx +31 -0
  288. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/spinner.tsx +16 -0
  289. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/switch.tsx +27 -0
  290. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/table.tsx +120 -0
  291. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tabs.tsx +53 -0
  292. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/textarea.tsx +22 -0
  293. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toast.tsx +127 -0
  294. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toaster.tsx +33 -0
  295. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle-group.tsx +61 -0
  296. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle.tsx +43 -0
  297. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tooltip.tsx +32 -0
  298. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-mobile.tsx +19 -0
  299. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-toast.ts +191 -0
  300. package/.local/skills/artifacts/artifacts/react-vite/files/src/index.css +393 -0
  301. package/.local/skills/artifacts/artifacts/react-vite/files/src/lib/utils.ts +6 -0
  302. package/.local/skills/artifacts/artifacts/react-vite/files/src/main.tsx +5 -0
  303. package/.local/skills/artifacts/artifacts/react-vite/files/src/pages/not-found.tsx +21 -0
  304. package/.local/skills/artifacts/artifacts/react-vite/files/tsconfig.json +22 -0
  305. package/.local/skills/artifacts/artifacts/react-vite/files/vite.config.ts +75 -0
  306. package/.local/skills/artifacts/artifacts/slides/artifact.yaml +33 -0
  307. package/.local/skills/artifacts/artifacts/slides/files/index.html.template +46 -0
  308. package/.local/skills/artifacts/artifacts/slides/files/package.json.template +30 -0
  309. package/.local/skills/artifacts/artifacts/slides/files/public/favicon.svg +3 -0
  310. package/.local/skills/artifacts/artifacts/slides/files/scripts/validate-slides.ts +193 -0
  311. package/.local/skills/artifacts/artifacts/slides/files/src/App.tsx +251 -0
  312. package/.local/skills/artifacts/artifacts/slides/files/src/data/slides-manifest.json +1 -0
  313. package/.local/skills/artifacts/artifacts/slides/files/src/data/slidesManifestSchema.ts +33 -0
  314. package/.local/skills/artifacts/artifacts/slides/files/src/index.css +48 -0
  315. package/.local/skills/artifacts/artifacts/slides/files/src/main.tsx +14 -0
  316. package/.local/skills/artifacts/artifacts/slides/files/src/slideLoader.ts +51 -0
  317. package/.local/skills/artifacts/artifacts/slides/files/tsconfig.json +17 -0
  318. package/.local/skills/artifacts/artifacts/slides/files/vite.config.ts +74 -0
  319. package/.local/skills/artifacts/artifacts/video-js/artifact.yaml +38 -0
  320. package/.local/skills/artifacts/artifacts/video-js/files/index.html.template +27 -0
  321. package/.local/skills/artifacts/artifacts/video-js/files/package.json.template +36 -0
  322. package/.local/skills/artifacts/artifacts/video-js/files/public/favicon.svg +3 -0
  323. package/.local/skills/artifacts/artifacts/video-js/files/scripts/validate-recording.sh +38 -0
  324. package/.local/skills/artifacts/artifacts/video-js/files/src/App.tsx +5 -0
  325. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/ReplitLoadingScene.tsx +105 -0
  326. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/VideoTemplate.tsx +30 -0
  327. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/index.ts +1 -0
  328. package/.local/skills/artifacts/artifacts/video-js/files/src/hooks/use-mobile.tsx +19 -0
  329. package/.local/skills/artifacts/artifacts/video-js/files/src/index.css +50 -0
  330. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/utils.ts +6 -0
  331. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/animations.ts +239 -0
  332. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/hooks.ts +104 -0
  333. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/index.ts +19 -0
  334. package/.local/skills/artifacts/artifacts/video-js/files/src/main.tsx +5 -0
  335. package/.local/skills/artifacts/artifacts/video-js/files/tsconfig.json +16 -0
  336. package/.local/skills/artifacts/artifacts/video-js/files/vite.config.ts +79 -0
  337. package/.local/skills/artifacts/bootstrap-legacy.js +115 -0
  338. package/.local/skills/artifacts/bootstrap.js +118 -0
  339. package/.local/skills/artifacts/references/multi-artifact-creation.md +94 -0
  340. package/.local/skills/canvas/.fingerprint +1 -0
  341. package/.local/skills/canvas/SKILL.md +534 -0
  342. package/.local/skills/canvas/__init__.py +1 -0
  343. package/.local/skills/code_review/.fingerprint +1 -0
  344. package/.local/skills/code_review/SKILL.md +82 -0
  345. package/.local/skills/database/.fingerprint +1 -0
  346. package/.local/skills/database/SKILL.md +351 -0
  347. package/.local/skills/database/references/database-migrations-on-publish.md +57 -0
  348. package/.local/skills/delegation/.fingerprint +1 -0
  349. package/.local/skills/delegation/SKILL.md +200 -0
  350. package/.local/skills/deployment/.fingerprint +1 -0
  351. package/.local/skills/deployment/SKILL.md +261 -0
  352. package/.local/skills/deployment/references/deployment-failure-debugging.md +243 -0
  353. package/.local/skills/deployment/references/deployment-logs.md +147 -0
  354. package/.local/skills/design/.fingerprint +1 -0
  355. package/.local/skills/design/SKILL.md +235 -0
  356. package/.local/skills/design-exploration/.fingerprint +1 -0
  357. package/.local/skills/design-exploration/SKILL.md +95 -0
  358. package/.local/skills/diagnostics/.fingerprint +1 -0
  359. package/.local/skills/diagnostics/SKILL.md +122 -0
  360. package/.local/skills/environment-secrets/.fingerprint +1 -0
  361. package/.local/skills/environment-secrets/SKILL.md +201 -0
  362. package/.local/skills/expo/.fingerprint +1 -0
  363. package/.local/skills/expo/OWNERS +2 -0
  364. package/.local/skills/expo/SKILL.md +298 -0
  365. package/.local/skills/expo/references/design_and_aesthetics.md +141 -0
  366. package/.local/skills/expo/references/device_features_and_permissions.md +48 -0
  367. package/.local/skills/expo/references/first_build.md +114 -0
  368. package/.local/skills/expo/references/react_context.md +54 -0
  369. package/.local/skills/external_apis/.fingerprint +1 -0
  370. package/.local/skills/external_apis/SKILL.md +25 -0
  371. package/.local/skills/external_apis/references/brave.md +116 -0
  372. package/.local/skills/external_apis/references/elevenlabs.md +44 -0
  373. package/.local/skills/external_apis/references/exa.md +34 -0
  374. package/.local/skills/external_apis/references/firecrawl.md +37 -0
  375. package/.local/skills/external_apis/references/nano_banana.md +33 -0
  376. package/.local/skills/follow-up-tasks/.fingerprint +1 -0
  377. package/.local/skills/follow-up-tasks/SKILL.md +80 -0
  378. package/.local/skills/image-search/.fingerprint +1 -0
  379. package/.local/skills/image-search/SKILL.md +150 -0
  380. package/.local/skills/integrations/.fingerprint +1 -0
  381. package/.local/skills/integrations/SKILL.md +205 -0
  382. package/.local/skills/media-generation/.fingerprint +1 -0
  383. package/.local/skills/media-generation/SKILL.md +170 -0
  384. package/.local/skills/media-generation/audio_generation.md +138 -0
  385. package/.local/skills/media-generation/video_generation.md +82 -0
  386. package/.local/skills/mockup-extract/.fingerprint +1 -0
  387. package/.local/skills/mockup-extract/SKILL.md +123 -0
  388. package/.local/skills/mockup-graduate/.fingerprint +1 -0
  389. package/.local/skills/mockup-graduate/SKILL.md +97 -0
  390. package/.local/skills/mockup-sandbox/.fingerprint +1 -0
  391. package/.local/skills/mockup-sandbox/SKILL.md +750 -0
  392. package/.local/skills/package-management/.fingerprint +1 -0
  393. package/.local/skills/package-management/SKILL.md +264 -0
  394. package/.local/skills/post_merge_setup/.fingerprint +1 -0
  395. package/.local/skills/post_merge_setup/SKILL.md +102 -0
  396. package/.local/skills/project_tasks/.fingerprint +1 -0
  397. package/.local/skills/project_tasks/SKILL.md +361 -0
  398. package/.local/skills/query-integration-data/.fingerprint +1 -0
  399. package/.local/skills/query-integration-data/SKILL.md +385 -0
  400. package/.local/skills/react-vite/.fingerprint +1 -0
  401. package/.local/skills/react-vite/SKILL.md +110 -0
  402. package/.local/skills/react-vite/references/frontend_general_rules.md +66 -0
  403. package/.local/skills/react-vite/references/seo.md +158 -0
  404. package/.local/skills/remove-image-background/.fingerprint +1 -0
  405. package/.local/skills/remove-image-background/SKILL.md +55 -0
  406. package/.local/skills/repl_setup/.fingerprint +1 -0
  407. package/.local/skills/repl_setup/SKILL.md +90 -0
  408. package/.local/skills/repl_setup/references/angular.md +103 -0
  409. package/.local/skills/repl_setup/references/react_vite.md +121 -0
  410. package/.local/skills/repl_setup/references/vue.md +102 -0
  411. package/.local/skills/replit-docs/.fingerprint +1 -0
  412. package/.local/skills/replit-docs/SKILL.md +81 -0
  413. package/.local/skills/revenuecat/.fingerprint +1 -0
  414. package/.local/skills/revenuecat/SKILL.md +133 -0
  415. package/.local/skills/revenuecat/references/initial-setup.md +566 -0
  416. package/.local/skills/revenuecat/references/replit-revenuecat-sdk-docs.md +279 -0
  417. package/.local/skills/revenuecat/references/subsequent-management.md +63 -0
  418. package/.local/skills/security_scan/.fingerprint +1 -0
  419. package/.local/skills/security_scan/SKILL.md +51 -0
  420. package/.local/skills/skill-authoring/.fingerprint +1 -0
  421. package/.local/skills/skill-authoring/SKILL.md +99 -0
  422. package/.local/skills/slides/.fingerprint +1 -0
  423. package/.local/skills/slides/SKILL.md +523 -0
  424. package/.local/skills/slides/references/brand_research.md +86 -0
  425. package/.local/skills/slides/references/export_failures.md +36 -0
  426. package/.local/skills/slides/references/exporting.md +49 -0
  427. package/.local/skills/slides/references/importing.md +40 -0
  428. package/.local/skills/slides/references/visual_qa.md +121 -0
  429. package/.local/skills/slides/templates/90s-board-deck.md +285 -0
  430. package/.local/skills/slides/templates/academic-lecture.md +437 -0
  431. package/.local/skills/slides/templates/adventure-outdoor.md +845 -0
  432. package/.local/skills/slides/templates/analytics-dashboard.md +407 -0
  433. package/.local/skills/slides/templates/annual-report-cover.md +592 -0
  434. package/.local/skills/slides/templates/apple-minimal.md +570 -0
  435. package/.local/skills/slides/templates/architecture-studio.md +339 -0
  436. package/.local/skills/slides/templates/arctic-expedition.md +582 -0
  437. package/.local/skills/slides/templates/arctic-minimal.md +364 -0
  438. package/.local/skills/slides/templates/art-deco.md +308 -0
  439. package/.local/skills/slides/templates/artisan-ceramics.md +659 -0
  440. package/.local/skills/slides/templates/artisan-food.md +709 -0
  441. package/.local/skills/slides/templates/artisanal-chalkboard.md +623 -0
  442. package/.local/skills/slides/templates/astronomy-log.md +562 -0
  443. package/.local/skills/slides/templates/aurora-expedition.md +754 -0
  444. package/.local/skills/slides/templates/automotive-electric.md +339 -0
  445. package/.local/skills/slides/templates/bauhaus-avant-garde.md +443 -0
  446. package/.local/skills/slides/templates/bioluminescent-sea.md +814 -0
  447. package/.local/skills/slides/templates/biophilic-urban.md +565 -0
  448. package/.local/skills/slides/templates/blackboard-chalk.md +517 -0
  449. package/.local/skills/slides/templates/blueprint.md +478 -0
  450. package/.local/skills/slides/templates/botanical-index.md +822 -0
  451. package/.local/skills/slides/templates/botanical-wellness.md +611 -0
  452. package/.local/skills/slides/templates/brand-book-page.md +466 -0
  453. package/.local/skills/slides/templates/brutalist-concrete.md +362 -0
  454. package/.local/skills/slides/templates/brutalist-studio.md +325 -0
  455. package/.local/skills/slides/templates/brutalist-web-punk.md +591 -0
  456. package/.local/skills/slides/templates/celestial-observatory.md +453 -0
  457. package/.local/skills/slides/templates/ceramics-artisan.md +740 -0
  458. package/.local/skills/slides/templates/cinema-verite.md +415 -0
  459. package/.local/skills/slides/templates/claymorphism.md +737 -0
  460. package/.local/skills/slides/templates/collage-zine.md +357 -0
  461. package/.local/skills/slides/templates/copper-sage.md +325 -0
  462. package/.local/skills/slides/templates/coral-reef.md +508 -0
  463. package/.local/skills/slides/templates/corporate-grid.md +331 -0
  464. package/.local/skills/slides/templates/corporate-memphis-flat.md +938 -0
  465. package/.local/skills/slides/templates/cosmos-explorer.md +998 -0
  466. package/.local/skills/slides/templates/cpg-coffee.md +850 -0
  467. package/.local/skills/slides/templates/craft-coffee-roast.md +693 -0
  468. package/.local/skills/slides/templates/creative-agency.md +244 -0
  469. package/.local/skills/slides/templates/creative-director.md +875 -0
  470. package/.local/skills/slides/templates/culinary-brand.md +698 -0
  471. package/.local/skills/slides/templates/de-stijl-construct.md +320 -0
  472. package/.local/skills/slides/templates/desert-dunes-photo.md +483 -0
  473. package/.local/skills/slides/templates/desert-mirror.md +577 -0
  474. package/.local/skills/slides/templates/desert-modernism.md +439 -0
  475. package/.local/skills/slides/templates/developer-api-docs.md +654 -0
  476. package/.local/skills/slides/templates/editorial-magazine.md +694 -0
  477. package/.local/skills/slides/templates/engineering-blueprint.md +730 -0
  478. package/.local/skills/slides/templates/executive-mono.md +363 -0
  479. package/.local/skills/slides/templates/expedition-peak.md +298 -0
  480. package/.local/skills/slides/templates/fashion-campaign.md +681 -0
  481. package/.local/skills/slides/templates/fashion-editorial.md +497 -0
  482. package/.local/skills/slides/templates/figma-geometric.md +420 -0
  483. package/.local/skills/slides/templates/film-noir.md +857 -0
  484. package/.local/skills/slides/templates/fitness-athletics.md +663 -0
  485. package/.local/skills/slides/templates/flat-vector.md +912 -0
  486. package/.local/skills/slides/templates/fluid-luxe.md +665 -0
  487. package/.local/skills/slides/templates/furniture-brand.md +505 -0
  488. package/.local/skills/slides/templates/gallery-modern.md +436 -0
  489. package/.local/skills/slides/templates/gaming-esports.md +410 -0
  490. package/.local/skills/slides/templates/geodesic-future.md +368 -0
  491. package/.local/skills/slides/templates/glass-artisan.md +666 -0
  492. package/.local/skills/slides/templates/glassmorphism.md +320 -0
  493. package/.local/skills/slides/templates/greenhouse-botanical.md +662 -0
  494. package/.local/skills/slides/templates/healthcare-clarity.md +468 -0
  495. package/.local/skills/slides/templates/holographic-drop.md +663 -0
  496. package/.local/skills/slides/templates/hospitality-resort.md +608 -0
  497. package/.local/skills/slides/templates/hypercar-launch.md +557 -0
  498. package/.local/skills/slides/templates/infographic-title.md +306 -0
  499. package/.local/skills/slides/templates/ink-wash.md +244 -0
  500. package/.local/skills/slides/templates/investor-memo.md +509 -0
  501. package/.local/skills/slides/templates/isometric-data.md +703 -0
  502. package/.local/skills/slides/templates/ivory-boardroom.md +439 -0
  503. package/.local/skills/slides/templates/japanese-minimal.md +308 -0
  504. package/.local/skills/slides/templates/jazz-blue-note.md +478 -0
  505. package/.local/skills/slides/templates/kinetic-type.md +206 -0
  506. package/.local/skills/slides/templates/lagoon-luxury.md +320 -0
  507. package/.local/skills/slides/templates/lavender-pastoral.md +577 -0
  508. package/.local/skills/slides/templates/linear-precise.md +460 -0
  509. package/.local/skills/slides/templates/lineart-sketch.md +930 -0
  510. package/.local/skills/slides/templates/lost-temple.md +689 -0
  511. package/.local/skills/slides/templates/luxury-fashion.md +269 -0
  512. package/.local/skills/slides/templates/luxury-watch.md +678 -0
  513. package/.local/skills/slides/templates/marble-elegance.md +673 -0
  514. package/.local/skills/slides/templates/mediterranean-travel.md +811 -0
  515. package/.local/skills/slides/templates/memphis-design.md +426 -0
  516. package/.local/skills/slides/templates/midnight-jazz.md +260 -0
  517. package/.local/skills/slides/templates/minimalist-poster.md +538 -0
  518. package/.local/skills/slides/templates/molten-craft.md +743 -0
  519. package/.local/skills/slides/templates/moroccan-tile.md +738 -0
  520. package/.local/skills/slides/templates/motorsport.md +782 -0
  521. package/.local/skills/slides/templates/mountain-drift.md +311 -0
  522. package/.local/skills/slides/templates/music-label.md +641 -0
  523. package/.local/skills/slides/templates/neo-tokyo.md +637 -0
  524. package/.local/skills/slides/templates/neobrutalism.md +334 -0
  525. package/.local/skills/slides/templates/newspaper-broadsheet.md +687 -0
  526. package/.local/skills/slides/templates/noir-fragrance.md +672 -0
  527. package/.local/skills/slides/templates/non-profit-impact.md +320 -0
  528. package/.local/skills/slides/templates/ocean-breeze.md +398 -0
  529. package/.local/skills/slides/templates/origami-couture.md +636 -0
  530. package/.local/skills/slides/templates/origami-paper.md +308 -0
  531. package/.local/skills/slides/templates/pastel-playground.md +1114 -0
  532. package/.local/skills/slides/templates/perfume-noir.md +646 -0
  533. package/.local/skills/slides/templates/prairie-storm.md +625 -0
  534. package/.local/skills/slides/templates/private-equity-dark.md +506 -0
  535. package/.local/skills/slides/templates/renaissance-florals.md +225 -0
  536. package/.local/skills/slides/templates/retro-print.md +880 -0
  537. package/.local/skills/slides/templates/retro-vinyl-sleeve.md +229 -0
  538. package/.local/skills/slides/templates/riso-zine.md +1094 -0
  539. package/.local/skills/slides/templates/risograph.md +1151 -0
  540. package/.local/skills/slides/templates/saas-product-launch.md +972 -0
  541. package/.local/skills/slides/templates/scandinavian.md +372 -0
  542. package/.local/skills/slides/templates/skater-culture.md +583 -0
  543. package/.local/skills/slides/templates/slate-modern.md +469 -0
  544. package/.local/skills/slides/templates/sneaker-drop.md +1006 -0
  545. package/.local/skills/slides/templates/social-campaign.md +321 -0
  546. package/.local/skills/slides/templates/stained-glass.md +574 -0
  547. package/.local/skills/slides/templates/strategy-one-pager.md +508 -0
  548. package/.local/skills/slides/templates/street-drop.md +677 -0
  549. package/.local/skills/slides/templates/street-mural.md +588 -0
  550. package/.local/skills/slides/templates/studio-noir.md +466 -0
  551. package/.local/skills/slides/templates/sustainability-esg.md +686 -0
  552. package/.local/skills/slides/templates/swiss-archive.md +648 -0
  553. package/.local/skills/slides/templates/swiss-typographic.md +364 -0
  554. package/.local/skills/slides/templates/tea-ceremony.md +456 -0
  555. package/.local/skills/slides/templates/tech-earbuds.md +870 -0
  556. package/.local/skills/slides/templates/terracotta-studio.md +235 -0
  557. package/.local/skills/slides/templates/thesis-defense.md +390 -0
  558. package/.local/skills/slides/templates/travel-aerial.md +648 -0
  559. package/.local/skills/slides/templates/treasury-policy.md +475 -0
  560. package/.local/skills/slides/templates/tropical-lush.md +332 -0
  561. package/.local/skills/slides/templates/underwater-dream.md +627 -0
  562. package/.local/skills/slides/templates/urban-golden.md +342 -0
  563. package/.local/skills/slides/templates/vintage-apothecary.md +552 -0
  564. package/.local/skills/slides/templates/vintage-ticket-stub.md +637 -0
  565. package/.local/skills/slides/templates/vinyl-crate.md +550 -0
  566. package/.local/skills/slides/templates/vision-editorial.md +612 -0
  567. package/.local/skills/slides/templates/volcanic-edge.md +347 -0
  568. package/.local/skills/slides/templates/watercolor-city.md +827 -0
  569. package/.local/skills/slides/templates/wine-spirits.md +203 -0
  570. package/.local/skills/slides/templates/wireframe-prototype.md +718 -0
  571. package/.local/skills/slides/templates/workspace-design.md +782 -0
  572. package/.local/skills/slides/templates/workspace-modern.md +406 -0
  573. package/.local/skills/slides/templates/zen-meditation.md +284 -0
  574. package/.local/skills/slides/templates/zen-void.md +244 -0
  575. package/.local/skills/stripe/.fingerprint +1 -0
  576. package/.local/skills/stripe/SKILL.md +455 -0
  577. package/.local/skills/stripe/references/code-templates.md +588 -0
  578. package/.local/skills/threat_modeling/.fingerprint +1 -0
  579. package/.local/skills/threat_modeling/SKILL.md +240 -0
  580. package/.local/skills/validation/.fingerprint +1 -0
  581. package/.local/skills/validation/SKILL.md +237 -0
  582. package/.local/skills/video-js/.fingerprint +1 -0
  583. package/.local/skills/video-js/SKILL.md +793 -0
  584. package/.local/skills/video-js/references/audio.md +237 -0
  585. package/.local/skills/video-js/references/finalize_playback.md +16 -0
  586. package/.local/skills/video-js/references/first_build.md +87 -0
  587. package/.local/skills/video-js/references/scene_selectors.md +428 -0
  588. package/.local/skills/web-search/.fingerprint +1 -0
  589. package/.local/skills/web-search/SKILL.md +110 -0
  590. package/.local/skills/whop/.fingerprint +1 -0
  591. package/.local/skills/whop/SKILL.md +104 -0
  592. package/.local/skills/whop/references/code-templates.md +66 -0
  593. package/.local/skills/whop/references/whop-api.mjs +22 -0
  594. package/.local/skills/whop/references/whop-mcp.mjs +40 -0
  595. package/.local/skills/whop/references/whopClient.ts +54 -0
  596. package/.local/skills/workflows/.fingerprint +1 -0
  597. package/.local/skills/workflows/SKILL.md +245 -0
  598. package/.local/state/replit/agent/.agent_state_037313043e76b5c652f276153ea014a68570e145.bin +0 -0
  599. package/.local/state/replit/agent/.agent_state_0f5361c2a53ab324b2a941a797f6494891be084c.bin +0 -0
  600. package/.local/state/replit/agent/.agent_state_4272443827dc90eac8c5b1963a34ee86da70bb99.bin +0 -0
  601. package/.local/state/replit/agent/.agent_state_4f14655950cbd611b228b4f0e1f664b66a56af24.bin +0 -0
  602. package/.local/state/replit/agent/.agent_state_ce28955a30856aa3d095b3568c322c8ec098993f.bin +0 -0
  603. package/.local/state/replit/agent/.agent_state_ec5347d04ebfbf6cf850fe04e15590d423e96d1d.bin +0 -0
  604. package/.local/state/replit/agent/.agent_state_f68f8c104d815ccc387290f0fba2c87c818d29f1.bin +0 -0
  605. package/.local/state/replit/agent/.agent_state_f87c1803a179510408c57c7a380c26f5c2197a30.bin +0 -0
  606. package/.local/state/replit/agent/.agent_state_main.bin +0 -0
  607. package/.local/state/replit/agent/.latest.json +1 -0
  608. package/.local/state/replit/agent/repl_state.bin +0 -0
  609. package/.local/state/scribe/scribe.db +0 -0
  610. package/.local/state/scribe/scribe.db-shm +0 -0
  611. package/.local/state/scribe/scribe.db-wal +0 -0
  612. package/.local/state/workflow-logs/2tfQP52ibxJTy4lpZ7_JX/start_application.shell.exec.0 +27 -0
  613. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.external.managed.0 +31 -0
  614. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.json +1 -0
  615. package/.local/state/workflow-logs/85n-z_SHy4JSGaUeJIcxy/start_application.shell.exec.0 +18 -0
  616. package/.local/state/workflow-logs/GIL2Ql5124lrEqGrfRO4k/start_application.shell.exec.0 +222 -0
  617. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.external.managed.0 +45 -0
  618. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.json +1 -0
  619. package/.local/state/workflow-logs/OKp1t-fEO5U_zQi1SKOQ-/start_application.shell.exec.0 +10 -0
  620. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.external.managed.0 +43 -0
  621. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.json +1 -0
  622. package/.local/state/workflow-logs/UDYycRqPV-N4B7whZP-yX/start_application.shell.exec.0 +252 -0
  623. package/.local/state/workflow-logs/V8Anmvz-HuvAztflZ8yCo/start_application.shell.exec.0 +87 -0
  624. package/.local/state/workflow-logs/a5fMnjr9tCwoaFY93pYuN/start_application.shell.exec.0 +2519 -0
  625. package/.local/state/workflow-logs/ggFzYcdHfIlW0owP2pb0U/start_application.shell.exec.0 +28 -0
  626. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.external.managed.0 +41 -0
  627. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.json +1 -0
  628. package/.local/state/workflow-logs/nbLvtuGJXB0wPmnruB3BE/start_application.shell.exec.0 +199 -0
  629. package/.local/state/workflow-logs/uDhN6S0ypUEh0MphXaFGY/start_application.shell.exec.0 +73 -0
  630. package/.local/state/workflow-logs/xZqU5CdTivcY6KEDEcVmD/start_application.shell.exec.0 +17 -0
  631. package/.local/tasks/breadcrumb-component.md +89 -0
  632. package/.local/tasks/calendar-component.md +93 -0
  633. package/.local/tasks/invoicing-design-system-app.md +39 -0
  634. package/.local/tasks/task-1.md +42 -0
  635. package/.local/tasks/task-7.md +92 -0
  636. package/.local/tasks/task-8.md +96 -0
  637. package/.replit +34 -0
  638. package/.upm/store.json +1 -0
  639. package/README.md +121 -0
  640. package/app/dashboard/page.tsx +10 -0
  641. package/app/design-system/page.tsx +802 -0
  642. package/app/invoices/page.tsx +10 -0
  643. package/app/layout.tsx +28 -0
  644. package/app/login/page.tsx +5 -0
  645. package/app/page.tsx +93 -0
  646. package/app/signup/page.tsx +5 -0
  647. package/attached_assets/Colors_1779781016394.png +0 -0
  648. package/attached_assets/Navy_1779781016404.png +0 -0
  649. package/attached_assets/Orange_1779781016405.png +0 -0
  650. package/attached_assets/Screenshot_2026-05-26_at_1.14.29_PM_1779781472515.png +0 -0
  651. package/attached_assets/Screenshot_2026-05-26_at_11.28.20_AM_1779775171071.png +0 -0
  652. package/attached_assets/Screenshot_2026-05-26_at_2.04.42_PM_1779784485318.png +0 -0
  653. package/attached_assets/Typography_1779781016406.png +0 -0
  654. package/design-system/components/avatar.tsx +46 -0
  655. package/design-system/components/badge.tsx +34 -0
  656. package/design-system/components/breadcrumb.tsx +149 -0
  657. package/design-system/components/button.tsx +57 -0
  658. package/design-system/components/calendar.tsx +77 -0
  659. package/design-system/components/card.tsx +62 -0
  660. package/design-system/components/checkbox.tsx +27 -0
  661. package/design-system/components/date-picker.tsx +153 -0
  662. package/design-system/components/dialog.tsx +106 -0
  663. package/design-system/components/dropdown-menu.tsx +88 -0
  664. package/design-system/components/form-field.tsx +78 -0
  665. package/design-system/components/input.tsx +25 -0
  666. package/design-system/components/label.tsx +25 -0
  667. package/design-system/components/popover.tsx +30 -0
  668. package/design-system/components/radio-group.tsx +35 -0
  669. package/design-system/components/select.tsx +84 -0
  670. package/design-system/components/separator.tsx +24 -0
  671. package/design-system/components/switch.tsx +28 -0
  672. package/design-system/components/table.tsx +80 -0
  673. package/design-system/components/tabs.tsx +54 -0
  674. package/design-system/components/textarea.tsx +25 -0
  675. package/design-system/components/toast.tsx +118 -0
  676. package/design-system/components/toaster.tsx +38 -0
  677. package/design-system/components/tooltip.tsx +27 -0
  678. package/design-system/hooks/index.ts +2 -0
  679. package/design-system/hooks/use-media-query.ts +27 -0
  680. package/design-system/hooks/use-toast.ts +91 -0
  681. package/design-system/index.ts +36 -0
  682. package/design-system/lib/cn.ts +6 -0
  683. package/design-system/styles.css +142 -0
  684. package/design-system/tokens/tokens.css +149 -0
  685. package/design-system/tokens/tokens.ts +190 -0
  686. package/next.config.mjs +6 -0
  687. package/package.json +46 -0
  688. package/postcss.config.mjs +6 -0
  689. package/screens/_shared/app-shell.tsx +145 -0
  690. package/screens/auth/auth-screen.tsx +156 -0
  691. package/screens/dashboard/dashboard-screen.tsx +207 -0
  692. package/screens/index.ts +17 -0
  693. package/screens/invoices/invoices-screen.tsx +317 -0
  694. package/tailwind.config.ts +110 -0
  695. package/tsconfig.json +26 -0
@@ -0,0 +1,1207 @@
1
+ ---
2
+ name: programmatic-seo
3
+ description: Build SEO-optimized pages at scale using templates and data.
4
+ ---
5
+
6
+ # Programmatic SEO
7
+
8
+ Build SEO-optimized pages at scale using templates and data. Create page generators that target keyword patterns and produce unique, valuable content for each variation.
9
+
10
+ ## When to Use
11
+
12
+ - User wants to create many SEO-driven pages from a template (e.g., "[product] vs [competitor]", "[service] in [city]")
13
+ - User mentions programmatic SEO, template pages, directory pages, location pages, or comparison pages at scale
14
+
15
+ - User wants to build an "alternatives to X" page set, integrations directory, or glossary
16
+ - User has a data set they want to turn into individual landing pages
17
+
18
+ ## When NOT to Use
19
+
20
+ - Auditing existing SEO issues (use seo-auditor skill)
21
+ - Writing a single blog post or landing page (use content-machine skill)
22
+
23
+ - One-off competitive analysis (use competitive-analysis skill)
24
+
25
+ ## Core Principles
26
+
27
+ 1. **Information gain is everything** — Every page must contain information the user cannot find on existing top-10 results. Proper H1s, keyword density, and clean structure are baseline hygiene, not a ranking advantage. Pages that "look like SEO" but add no new information are what Google's spam systems now target.
28
+ 2. **Unique value per page** — Every page must provide value specific to that page, not just swapped variables in a template. If you removed the entity name, would two pages be indistinguishable? If yes, don't publish.
29
+
30
+ 3. **Proprietary data wins** — Hierarchy: proprietary > product-derived > user-generated > licensed > public (weakest). The strongest pSEO pages contain data no one else has — original tests, first-party metrics, real user reviews, proprietary calculations.
31
+ 4. **Subfolders, not subdomains** — `yoursite.com/templates/resume/`not`templates.yoursite.com/resume/`
32
+
33
+ 5. **Match search intent precisely** — Pages must match the intent behind the query, not just contain the keywords. This means choosing the right page type (blog post vs. comparison table vs. tool vs. directory listing), answering the actual question, and structuring content the way users expect for that query type.
34
+ 6. **Quality over quantity** — 100 great pages beat 10,000 thin ones. Scale without information gain is just industrialized noise. Google has more content than it needs — your pages must earn their place by being genuinely better than what already ranks.
35
+
36
+ 7. **Topical authority compounds** — A site that demonstrates deep expertise in a specific topic earns trust signals that lift all pages in that topic cluster. Scattered, shallow coverage across unrelated topics builds no authority.
37
+
38
+ ---
39
+
40
+ ## ⚠️ CRITICAL: Check the App's Rendering Strategy First
41
+
42
+ **Before writing a single line of code**, determine whether the existing application is a Single Page Application (SPA).
43
+
44
+ **SPAs (React, Vue, Angular, Svelte) are invisible to Googlebot.** Googlebot fetches raw HTML and does not execute client-side JavaScript. A React component that renders `<h1>Currency Converter</h1>`only works in a browser — Googlebot sees an empty`<div id="root"></div>`.
45
+
46
+ ### Decision Tree
47
+
48
+ ```text
49
+
50
+ Is the app a SPA (React/Vue/Angular)?
51
+
52
+
53
+
54
+ ├── YES → SEO pages MUST be server-rendered (SSR)
55
+
56
+ │ Options:
57
+
58
+ │ A. Express/Fastify route returning a complete HTML string ← simplest for existing SPAs
59
+
60
+ │ B. Migrate to Next.js/Nuxt/SvelteKit with SSR support
61
+
62
+ │ C. Add a static site generator (Astro) alongside the SPA for SEO pages only
63
+
64
+
65
+
66
+ └── NO (already Next.js, Nuxt, etc.) → Use the framework's built-in SSR/SSG/ISR patterns (see Step 6)
67
+
68
+ ```
69
+
70
+ **The SPA trap:** The most common pSEO mistake is adding routes to a React Router / Wouter / Vue Router app and assuming they will be indexed. They will not. Always verify by `curl`-ing the URL and checking if the content is present in the raw HTML response:
71
+
72
+ ```bash
73
+
74
+ curl -s https://yoursite.com/your-seo-page | grep "target keyword"
75
+
76
+ # If empty or only returns <div id="root"></div> → not crawlable
77
+
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Content Authenticity — Don't Hallucinate Business Data
83
+
84
+ When building programmatic SEO for **the user's own company**, you will not have access to their internal data (customer stories, case studies, testimonials, product metrics, pricing, team bios, etc.). **Do not fabricate this information.**
85
+
86
+ ### Before generating any company-specific content, ask the user for
87
+
88
+ - Customer names, logos, or testimonials they want featured
89
+ - Case study data (metrics, outcomes, quotes)
90
+
91
+ - Product-specific details (features, pricing tiers, integrations list)
92
+ - Any proprietary data that should populate template variables
93
+
94
+ #### If the user hasn't provided this data, default to safe content patterns
95
+
96
+ - Industry research and statistics (sourced via `webSearch`)
97
+ - General descriptions of the problem/solution category
98
+
99
+ - Feature explanations based on what's publicly visible on their site (use `webFetch` on their domain)
100
+ - Placeholder blocks clearly marked `[INSERT: customer testimonial]`or`[INSERT: case study metrics]`
101
+
102
+ - Comparison data pulled from public sources (G2, Capterra reviews via `webSearch`)
103
+
104
+ **Never generate:** fake customer quotes, fabricated ROI numbers, invented case studies, made-up testimonials, or fictional company metrics. These damage trust and can create legal liability.
105
+
106
+ For **generic/research topics** (e.g., "[city] cost of living", "[tool A] vs [tool B]", glossary terms), use `webSearch` to gather real data and cite sources.
107
+
108
+ ---
109
+
110
+ ## ⚠️ Strategic Judgment — What AI Cannot Do For You
111
+
112
+ **This is the most important section in this skill.** AI excels at scaling execution — drafting content, structuring pages, generating variations. But it cannot make the strategic decisions that determine whether a pSEO campaign succeeds or fails. These decisions must come from the user (or a human SEO strategist), and the agent must actively prompt for them rather than making assumptions.
113
+
114
+ ### Decisions that require human judgment
115
+
116
+ Before building anything, the user must answer (or the agent must ask):
117
+
118
+ 1. **Is this keyword worth a page at all?** Not every keyword with search volume deserves a page. If the top 10 results are dominated by high-authority brands and the user's site has no topical authority, building 500 pages won't help.
119
+ 2. **What page type matches the query intent?** The same topic might need a blog post, a comparison table, an interactive tool, a directory listing, or a data profile. Getting the page type wrong means the page will never rank, regardless of content quality. For example:
120
+
121
+ - "best CRM for real estate" → listicle/comparison (not a product page)
122
+ - "HubSpot vs Salesforce" → head-to-head comparison (not a blog post)
123
+
124
+ - "what is a CRM" → educational/glossary (not a product page)
125
+ - "CRM pricing" → pricing table with real numbers (not a blog post about pricing)
126
+
127
+ 1. **What information gain does this page offer over the current top 10?** If the answer is "nothing — we're just rewriting what's already there with AI," do not build the page. Specifically ask: do we have original data, unique analysis, proprietary metrics, real case studies, or first-hand experience that the current results lack?
128
+ 2. **Does the user's site have topical authority in this area?** A brand-new domain publishing 200 glossary pages on a topic it has no track record in will be ignored. Topical authority is built through depth (many related, high-quality pages), external trust signals (backlinks from relevant sites), and user engagement over time.
129
+
130
+ 3. **What is the commercial intent and conversion path?** Pages that attract traffic but have no clear next step for the user waste crawl budget and dilute site quality. Every pSEO page should have a purpose beyond "get impressions."
131
+
132
+ ### What the agent should do
133
+
134
+ - **Always ask the user** what unique data, experience, or perspective they can bring to the topic before generating content. If they say "just write something about X," push back and explain that pages without information gain will not rank.
135
+ - **Never assume scale equals strategy.** If the user asks for "500 SEO articles," the correct response is to first validate whether 500 pages is the right number, whether the topics have demand, and whether the user has enough unique data to make each page valuable.
136
+
137
+ - **Recommend starting small.** Build 10-20 high-quality pages first, validate they get indexed and earn impressions, then scale what works. This is the opposite of the "blast 500 pages and hope" approach.
138
+ - **Be explicit about what AI is doing vs. what requires human input.** AI writes the page. The human decides whether the page should exist.
139
+
140
+ ### The "SEO cosplay" trap
141
+
142
+ A page can have perfect H1 tags, clean H2/H3 hierarchy, optimized meta descriptions, proper schema markup, good keyword density, and fast load times — and still rank nowhere. These are table stakes, not differentiators. Google's ranking systems evaluate whether a page genuinely satisfies the user's query better than alternatives. Structure without substance is what practitioners call "SEO cosplay" — it looks like SEO but doesn't perform.
143
+
144
+ **The agent must not conflate technical SEO hygiene with content quality.** Both are necessary. Neither is sufficient alone.
145
+
146
+ ---
147
+
148
+ ## Information Gain — The Core Quality Signal
149
+
150
+ Google's systems increasingly evaluate "information gain" — whether a page adds something new to the corpus of existing results for a query. This is the single most important concept in modern pSEO.
151
+
152
+ ### What counts as information gain
153
+
154
+ | Source of gain | Example | Strength |
155
+
156
+ |---|---|---|
157
+
158
+ | **Original data / metrics** | Your own A/B test results, proprietary benchmarks, internal analytics | Strongest — impossible to replicate |
159
+
160
+ | **First-hand experience** | Actual product reviews you conducted, real case studies with named clients | Very strong — hard to fake |
161
+
162
+ | **Unique analysis** | Novel comparisons, calculated scores, derived insights from raw data | Strong — requires expertise |
163
+
164
+ | **Curated judgment** | Expert picks, opinionated rankings with reasoning, "here's what we'd actually use" | Moderate — requires credibility |
165
+
166
+ | **Structured aggregation** | Data from multiple sources combined into a single useful view (with attribution) | Moderate — useful but reproducible |
167
+
168
+ | **Rewritten common knowledge** | The same information available on 50 other sites, just rephrased | Zero — this is what gets penalized |
169
+
170
+ ### The information gain test
171
+
172
+ Before publishing any pSEO page set, run this test on 5 random pages:
173
+
174
+ 1. Search Google for the target keyword
175
+ 2. Read the top 3 results
176
+
177
+ 3. Read your generated page
178
+ 4. Ask: **"Does our page contain at least one piece of information, data point, or insight that none of the top 3 results have?"**
179
+
180
+ 5. If no → do not publish. Improve the data source or reduce the page set to only pages where you have genuine information gain.
181
+
182
+ ### Scaled content abuse (Google's 2024+ spam policy)
183
+
184
+ Google now explicitly targets "scaled content abuse" — content produced at scale (whether by AI, humans, or automation) that exists primarily to manipulate rankings rather than help users. The pattern Google detects is:
185
+
186
+ - Many pages with similar structure
187
+ - Smooth, readable prose with no new information
188
+
189
+ - Comprehensive coverage that is really just reorganized common knowledge
190
+ - High page count with no corresponding trust signals or user engagement
191
+
192
+ - Each page is readable, but after reading it you've learned nothing new
193
+
194
+ **This pattern triggers penalties regardless of whether AI wrote the content.** A human content farm producing the same pattern gets the same treatment. The issue is not AI — it is the absence of value at scale.
195
+
196
+ ---
197
+
198
+ ## Proven Playbooks (Real Traffic Numbers)
199
+
200
+ | Playbook | URL pattern | Who does it | Scale |
201
+
202
+ |---|---|---|---|
203
+
204
+ | **Integrations** | `/apps/[A]/integrations/[B]` | **Zapier** — ~56k pages, 5.8M+ monthly organic visits, ranks for 1.3M keywords. Proprietary data (triggers/templates per app pair) no one else can replicate. | N² combinations |
205
+
206
+ | **Conversions** | `/currency-converter/[from]-to-[to]-rate` | **Wise** — 8.5M pages across locale subfolders, 60M+ monthly visits. Live exchange-rate data + fee calculators = unique value per page. | N² × locales |
207
+
208
+ | **Locations** | `/Restaurants-[city]`,`/[cuisine]-Restaurants-[city]`,`/Restaurants-[neighborhood]` | **Tripadvisor** — 700M+ pages, 226M+ monthly visits. UGC reviews keep pages fresh; layered matrix (city × cuisine × neighborhood). | city × category × modifier |
209
+
210
+ | **Data profiles** | `/[city-slug]` | **Nomad List** — cost-of-living, internet speed, safety scores per city. Pages are pure data tables — minimal prose, high value. | N entities |
211
+
212
+ | **Comparisons** | `/[A]-vs-[B]`,`/alternatives/[A]` | **G2, Capterra** — "vs" pages + "alternatives" pages, populated by user reviews. | N² / 2 |
213
+
214
+ | **Templates** | `/templates/[type]` | **Canva, Notion** — each template is a landing page. | N types |
215
+
216
+ | **Glossary** | `/learn/[term]` | **Ahrefs, HubSpot** — definition pages cluster topical authority. | N terms |
217
+
218
+ | **How-to guides** | `/guides/[task]-with-[tool]` | Documentation sites — step-by-step guides, HowTo schema | N tasks × M tools |
219
+
220
+ | **Personas** | `/[product]-for-[audience]` | "CRM for real estate agents" | N × M |
221
+
222
+ **The test:** If your data doesn't meaningfully change between page variations, don't build it. Zapier works because Slack+Asana genuinely differs from Slack+Trello. "Plumber in Austin" vs "Plumber in Dallas" with identical boilerplate = thin content penalty.
223
+
224
+ Layer playbooks for long-tail: Tripadvisor's "Best Italian Restaurants in Chinatown NYC" = curation × cuisine × neighborhood.
225
+
226
+ ### Why these playbooks work — and why copycats fail
227
+
228
+ Every successful pSEO example above shares one trait: **the data genuinely changes between pages.** Zapier's Slack+Asana page has different triggers, different actions, and different templates than Slack+Trello. Wise's USD-to-EUR page has a different exchange rate, different fee structure, and different historical chart than USD-to-GBP. Tripadvisor's pages have different restaurants, different reviews, and different ratings per city.
229
+
230
+ Copycats fail because they replicate the URL structure without replicating the information gain. Creating 500 "/service-in-city" pages where only the city name changes and the rest is identical prose is not programmatic SEO — it is spam at scale. Google's systems detect this pattern reliably: many pages, similar structure, no meaningful data variation.
231
+
232
+ **Before choosing a playbook, ask:** "Do I have genuinely different data for each page variation, or am I just swapping one variable into the same template?" If the latter, reduce the page count to only variations where you have real data, or choose a different playbook entirely.
233
+
234
+ ---
235
+
236
+ ## Implementation
237
+
238
+ ### Step 1: Keyword Pattern Research
239
+
240
+ - Identify the repeating structure and variables
241
+ - Count how many unique combinations exist
242
+
243
+ - Validate demand: aggregate search volume, distribution (head vs. long tail), trend direction
244
+
245
+ ### Step 2: Data Requirements
246
+
247
+ - What data populates each page?
248
+ - Is it first-party, scraped, licensed, or public?
249
+
250
+ - How is it updated and maintained?
251
+
252
+ ### Step 3: Template Design
253
+
254
+ #### Page structure
255
+
256
+ - H1 with target keyword
257
+ - Unique intro (not just variables swapped — conditional content based on data)
258
+
259
+ - Data-driven sections with original insights/analysis per page
260
+ - Related pages / internal links
261
+
262
+ - CTAs appropriate to intent
263
+
264
+ ##### Ensuring uniqueness — critical to avoid thin content penalties
265
+
266
+ - Conditional content blocks that vary based on data attributes
267
+ - Calculated or derived data (not just raw display)
268
+
269
+ - Editorial commentary unique to each entity
270
+ - User-generated content where possible
271
+
272
+ ### Step 4: Internal Linking Architecture
273
+
274
+ #### Hub and spoke model
275
+
276
+ - Hub: Main category page (e.g., "/integrations/")
277
+ - Spokes: Individual programmatic pages (e.g., "/integrations/slack-asana/")
278
+
279
+ - Cross-links between related spokes
280
+
281
+ Every page must be reachable from the main site. **Update the main app's footer and navigation to include links to SEO hub pages** — SEO pages that aren't linked from the main site are orphan pages that Google may never discover or trust.
282
+
283
+ Include XML sitemap and breadcrumbs with structured data.
284
+
285
+ ### Step 5: Indexation Strategy
286
+
287
+ - Prioritize high-volume patterns for initial crawling
288
+ - Noindex very thin variations rather than publishing them
289
+
290
+ - Manage crawl budget (separate sitemaps by page type)
291
+ - Monitor indexation rate in Search Console
292
+
293
+ ### Step 6: Build the Page Generator
294
+
295
+ #### Rendering strategy decision
296
+
297
+ | Page count | Data freshness | Strategy |
298
+
299
+ |---|---|---|
300
+
301
+ | <1,000 | Rarely changes | **SSG** — pre-render everything at build |
302
+
303
+ | 1,000-100,000 | Changes daily/weekly | **ISR** — pre-render popular subset, generate rest on-demand + cache |
304
+
305
+ | 100,000+ or live data | Real-time (prices, rates) | **ISR with short revalidate** or SSR |
306
+
307
+ SSG is fastest but build time scales linearly — 50k pages can mean 30+ min builds. ISR is the pSEO sweet spot: instant deploys, pages generate on first request then cache.
308
+
309
+ #### For SPAs: Express SSR pattern
310
+
311
+ When adding pSEO to an existing SPA, the simplest approach is adding Express routes that return complete HTML strings. Organize into three layers:
312
+
313
+ ##### 1. Shared HTML shell (create this first)
314
+
315
+ ```typescript
316
+
317
+ // server/ssrShared.ts — create before writing any individual page
318
+
319
+ export function ssrHtmlShell({ title, description, canonical, schemaJson, css, body, ...}): string {
320
+
321
+ return `<!DOCTYPE html>
322
+
323
+ <html lang="...">
324
+
325
+ <head>
326
+
327
+ <meta charset="UTF-8" />
328
+
329
+ <title>${title}</title>
330
+
331
+ <meta name="description" content="${description}" />
332
+
333
+ <link rel="canonical" href="${canonical}" />
334
+
335
+ <!-- OG tags, fonts, schema -->
336
+
337
+ <style>${sharedCss()}${css ?? ""}</style>
338
+
339
+ </head>
340
+
341
+ <body>
342
+
343
+ ${header()}
344
+
345
+ ${body}
346
+
347
+ ${footer()}
348
+
349
+ </body>
350
+
351
+ </html>`;
352
+
353
+ }
354
+
355
+ ```
356
+
357
+ Create this shared shell **before** writing any individual page. Every new SEO page reuses it. This ensures consistent branding (header, footer, fonts, base CSS) across all SSR pages without duplication.
358
+
359
+ ###### 2. Data + page generator modules (one per playbook)
360
+
361
+ ```typescript
362
+
363
+ // server/glossary.ts
364
+
365
+ export const TERMS: GlossaryTerm[] = [ /* structured data */ ];
366
+
367
+ export function getTermHtml(slug: string, logoBase64: string): string | null { ... }
368
+
369
+ export function getTermIndexHtml(logoBase64: string): string { ... }
370
+
371
+ ```
372
+
373
+ Keep data as typed arrays/objects in the same file as the generator. This makes content easy to update without touching routing logic.
374
+
375
+ ###### 3. Routes (thin, just wiring)
376
+
377
+ ```typescript
378
+
379
+ // in routes.ts
380
+
381
+ app.get("/glossary/:slug", (req, res) => {
382
+
383
+ const html = getTermHtml(req.params.slug, LOGO_BASE64);
384
+
385
+ if (!html) { res.status(404).end(); return; }
386
+
387
+ res.setHeader("Cache-Control", "public, max-age=86400");
388
+
389
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
390
+
391
+ res.send(html);
392
+
393
+ });
394
+
395
+ ```
396
+
397
+ #### Cache headers per page type
398
+
399
+ Set cache headers based on data freshness — not one-size-fits-all:
400
+
401
+ | Page type | Recommended header | Reason |
402
+
403
+ |---|---|---|
404
+
405
+ | Static content (glossary, guides) | `public, max-age=86400` | Content rarely changes; CDN can serve |
406
+
407
+ | Live data (exchange rates, prices) | `no-cache`or`s-maxage=60` | Must be fresh; stale data damages credibility |
408
+
409
+ | Semi-dynamic (weekly updates) | `public, s-maxage=3600, stale-while-revalidate=86400` | Balance freshness vs. load |
410
+
411
+ #### For Next.js App Router
412
+
413
+ ```tsx
414
+
415
+ export async function generateStaticParams() {
416
+
417
+ const popular = await db.query('SELECT slug FROM entities ORDER BY search_volume DESC LIMIT 500');
418
+
419
+ return popular.map(e => ({ slug: e.slug }));
420
+
421
+ }
422
+
423
+ export const dynamicParams = true;
424
+
425
+ export const revalidate = 3600;
426
+
427
+ export async function generateMetadata({ params }) {
428
+
429
+ const { slug } = await params;
430
+
431
+ const entity = await getEntity(slug);
432
+
433
+ return {
434
+
435
+ title: `${entity.name} — ${entity.category} | Brand`,
436
+
437
+ description: entity.summary,
438
+
439
+ alternates: { canonical: `https://site.com/${entity.category}/${slug}` },
440
+
441
+ };
442
+
443
+ }
444
+
445
+ export default async function Page({ params }) {
446
+
447
+ const { slug } = await params;
448
+
449
+ const entity = await getEntity(slug);
450
+
451
+ if (!entity) notFound();
452
+
453
+ }
454
+
455
+ ```
456
+
457
+ **Critical ISR rules:** `generateStaticParams`is NOT re-run on revalidation. Must return an array (even`[]`) or the route becomes fully dynamic. Set`dynamicParams = false` only if you want 404s for anything not pre-generated.
458
+
459
+ #### Astro alternative
460
+
461
+ Better for content-heavy, less-interactive pages. Ships zero JS by default — better Core Web Vitals.
462
+
463
+ ```js
464
+
465
+ export async function getStaticPaths() {
466
+
467
+ const entities = await loadEntities();
468
+
469
+ return entities.map(e => ({ params: { slug: e.slug }, props: { entity: e } }));
470
+
471
+ }
472
+
473
+ ```
474
+
475
+ No native ISR; use on-demand rendering + `Cache-Control: s-maxage=3600, stale-while-revalidate`.
476
+
477
+ #### Sitemaps at scale
478
+
479
+ Google's limit is 50,000 URLs per sitemap file. Shard into `sitemap-1.xml`,`sitemap-2.xml`... referenced by a sitemap index. For ISR/SSR sites, generate sitemaps server-side from the DB, not at build time. **Warning:** Google will NOT index all pages immediately — indexation at scale takes weeks/months. Prioritize high-volume slugs in the first sitemap.
480
+
481
+ ---
482
+
483
+ ## SSR-Specific Implementation Notes
484
+
485
+ ### Asset handling in SSR
486
+
487
+ Frontend assets (images, fonts) processed by Vite/webpack/esbuild are **not** directly accessible to server-side routes. Common problems:
488
+
489
+ - Images imported with `import logo from "@assets/logo.png"` work in React but not in Express route handlers
490
+ - Files copied to `public/` by the build tool may not be served correctly in development
491
+
492
+ - Files with restricted permissions (`rw-------`) will throw EACCES errors when read from disk
493
+
494
+ #### Solutions by asset type
495
+
496
+ | Asset | Recommended approach |
497
+
498
+ |---|---|
499
+
500
+ | Logo / brand images | Base64-encode at server startup; embed inline in `<img src="data:...">` |
501
+
502
+ | Small icons | Inline SVG string in the HTML template |
503
+
504
+ | External fonts | Google Fonts CDN link in `<head>` |
505
+
506
+ | Background images | Use CSS gradients or CDN URLs |
507
+
508
+ ```typescript
509
+
510
+ // Base64 encode logo once at startup — safe for all SSR pages
511
+
512
+ import fs from "fs";
513
+
514
+ const logoBuffer = fs.readFileSync("./attached_assets/logo.png");
515
+
516
+ const LOGO_BASE64 = `data:image/png;base64,${logoBuffer.toString("base64")}`;
517
+
518
+ ```
519
+
520
+ ### Header/footer consistency
521
+
522
+ SSR pages and the React/Vue/SPA app will share the same domain. Users will navigate between them. **Brand consistency is critical** — a mismatch between the main app's header and the SSR page's header breaks trust.
523
+
524
+ Steps:
525
+
526
+ 1. Study the main app's header/footer colors, logo treatment, link structure, and typography
527
+ 2. Replicate them in the shared `ssrShared.ts` shell functions — not approximations, pixel-for-pixel matches
528
+
529
+ 3. When the main app's footer is updated (new links, new columns), update the SSR footer function too
530
+ 4. Conversely, when new SSR hub pages are added (e.g., `/glossary`,`/guides`), add them to the main app's footer navigation
531
+
532
+ ### Logo rendering in SSR
533
+
534
+ If the logo image has a non-standard aspect ratio or significant whitespace, a plain `height: 48px` will render it incorrectly. Inspect how the main React app clips and positions the logo, then replicate exactly:
535
+
536
+ ```html
537
+
538
+ <!-- If the main app uses overflow-hidden clipping to show only part of the image: -->
539
+
540
+ <div style="height:56px; width:160px; overflow:hidden; display:flex; align-items:center; justify-content:center;">
541
+
542
+ <img src="${LOGO_BASE64}" style="width:auto; height:250%; object-fit:contain; margin-top:-5%;" />
543
+
544
+ </div>
545
+
546
+ ```
547
+
548
+ Don't guess — read the main app's logo component before writing the SSR equivalent.
549
+
550
+ ### Breadcrumb placement and negative margins
551
+
552
+ A common hero design pattern uses negative `margin-top` on the content section to create a "card floating up into the hero" visual effect:
553
+
554
+ ```css
555
+
556
+ .hero { padding-bottom: 72px; }
557
+
558
+ .main { margin-top: -32px; } /* pulls first card up into hero */
559
+
560
+ ```
561
+
562
+ **This breaks breadcrumbs.** If a breadcrumb element sits between the hero and `.main`in the HTML, the negative margin on`.main` will pull the main content over the breadcrumb, hiding it.
563
+
564
+ **Rule: breadcrumbs must always be the first child inside `.main`**, never between`.main` and the preceding section.
565
+
566
+ ```html
567
+
568
+ <!-- WRONG: breadcrumb between hero and main -->
569
+
570
+ <div class="hero">...</div>
571
+
572
+ <nav class="breadcrumb">...</nav> <!-- will be covered by .main -->
573
+
574
+ <div class="main">...</div>
575
+
576
+ <!-- CORRECT: breadcrumb inside main -->
577
+
578
+ <div class="hero">...</div>
579
+
580
+ <div class="main">
581
+
582
+ <nav class="breadcrumb">...</nav> <!-- safely in the content flow -->
583
+
584
+ <div class="card">...</div>
585
+
586
+ </div>
587
+
588
+ ```
589
+
590
+ Additionally, if a page has a breadcrumb and the hero uses large `padding-bottom` (designed to pair with negative margin), that padding becomes wasted dark space. Override it on breadcrumb pages:
591
+
592
+ ```html
593
+
594
+ <div class="hero" style="padding-bottom: 32px;">
595
+
596
+ ```
597
+
598
+ ---
599
+
600
+ ## Schema Markup by Playbook
601
+
602
+ Match schema type to content type — don't use a generic WebPage schema when a more specific type exists:
603
+
604
+ | Playbook | Schema type | Key properties |
605
+
606
+ |---|---|---|
607
+
608
+ | Glossary / definitions | `DefinedTerm`+`DefinedTermSet`|`name`,`description`,`inDefinedTermSet` |
609
+
610
+ | How-to guides | `HowTo`|`step[]`with`HowToStep`,`tool`,`supply` |
611
+
612
+ | FAQ sections | `FAQPage`|`mainEntity[]`with`Question`+`Answer` |
613
+
614
+ | Comparisons | `ItemList`or`Review`|`itemListElement[]`,`ratingValue` |
615
+
616
+ | Data profiles | `Dataset`or`Place`|`name`,`description`,`spatialCoverage` |
617
+
618
+ | Recipes/templates | `CreativeWork`|`name`,`description`,`genre` |
619
+
620
+ Multiple schema types can appear on the same page (e.g., a HowTo guide can also have a FAQPage block at the bottom).
621
+
622
+ ---
623
+
624
+ ## Internationalization and Locale Handling
625
+
626
+ Only add multilingual pSEO when you have **genuinely translated data** — not machine-translated boilerplate. Machine-translating 10,000 thin pages at once is one of the fastest ways to trigger a spam manual action.
627
+
628
+ ### URL structure — subfolders win
629
+
630
+ | Approach | Example | SEO verdict |
631
+
632
+ |---|---|---|
633
+
634
+ | Subfolder | `yoursite.com/es/glosario/presupuesto` | **Preferred** — consolidates domain authority |
635
+
636
+ | ccTLD | `yoursite.es/glosario/presupuesto` | Strong signal but costly to maintain |
637
+
638
+ | Subdomain | `es.yoursite.com/...` | Treated as separate site; avoid for pSEO |
639
+
640
+ | Query param | `yoursite.com/glossary?lang=es` | Not crawlable reliably; never use |
641
+
642
+ ### hreflang implementation
643
+
644
+ Every page that has a locale variant must declare all variants (including `x-default`) in`<head>`:
645
+
646
+ ```html
647
+
648
+ <link rel="alternate" hreflang="en" href="https://site.com/glossary/budget" />
649
+
650
+ <link rel="alternate" hreflang="es" href="https://site.com/es/glosario/presupuesto" />
651
+
652
+ <link rel="alternate" hreflang="x-default" href="https://site.com/glossary/budget" />
653
+
654
+ ```
655
+
656
+ Rules:
657
+
658
+ - Every page in the set must list **all** pages in the set (bidirectional)
659
+ - Omitting a language from even one page breaks the cluster for Google
660
+
661
+ - `x-default` should point to the most general version (usually English or a language-selector page)
662
+ - Validate with Google Search Console → Enhancements → International targeting
663
+
664
+ ### Data structure for multilingual pages
665
+
666
+ Store translations as a map keyed by locale so the generator stays clean:
667
+
668
+ ```typescript
669
+
670
+ const TERM = {
671
+
672
+ slug: { en: "budget", es: "presupuesto" },
673
+
674
+ name: { en: "Budget", es: "Presupuesto" },
675
+
676
+ definition: { en: "...", es: "..." },
677
+
678
+ };
679
+
680
+ function getTermHtml(slug: string, locale: "en" | "es"): string { ... }
681
+
682
+ ```
683
+
684
+ ### Machine-translation risk
685
+
686
+ Machine-translated prose is detectable by Google and often results in near-duplicate content across locales. Only translate if:
687
+
688
+ - A human reviews/edits the output, OR
689
+ - The page is primarily structured data (tables, numbers, steps) with minimal prose
690
+
691
+ ---
692
+
693
+ ## Content Freshness Signals
694
+
695
+ Google rewards pages that are genuinely kept up to date. Stale pSEO pages — especially data-driven ones — gradually lose rankings as fresher competitors appear.
696
+
697
+ ### `dateModified` in schema
698
+
699
+ Every page with structured data should carry a timestamp:
700
+
701
+ ```json
702
+
703
+ {
704
+
705
+ "@type": "WebPage",
706
+
707
+ "datePublished": "2024-01-15",
708
+
709
+ "dateModified": "2025-03-01"
710
+
711
+ }
712
+
713
+ ```
714
+
715
+ **Only update `dateModified`when content actually changes.** Bumping it on a schedule without real changes is a deception signal that Google penalises. If you auto-regenerate pages, tie`dateModified`to the data source's`updatedAt`, not the deploy timestamp.
716
+
717
+ ### When and how to regenerate
718
+
719
+ | Data type | Trigger strategy |
720
+
721
+ |---|---|
722
+
723
+ | Exchange rates / prices | SSR with short cache (`s-maxage=60`); no static generation |
724
+
725
+ | Product/company data | Webhook from data source on change → re-render and invalidate CDN cache |
726
+
727
+ | Weekly-updated datasets | Nightly cron job → regenerate changed pages → update sitemap `<lastmod>` |
728
+
729
+ | Static reference content (glossary, guides) | Regenerate on code deploy only |
730
+
731
+ For Express SSR, the page is always fresh — no regeneration needed. The cost is latency; mitigate with a CDN in front.
732
+
733
+ For ISR (Next.js), trigger on-demand revalidation via the revalidation API when upstream data changes:
734
+
735
+ ```typescript
736
+
737
+ // When data changes, invalidate the specific path
738
+
739
+ await fetch(`/api/revalidate?secret=TOKEN&path=/glossary/${slug}`, { method: "POST" });
740
+
741
+ ```
742
+
743
+ ### Signals that indicate staleness to Google
744
+
745
+ - Dates in page content (e.g., "Updated January 2022") that are old
746
+ - Prices or rates that no longer match the live source
747
+
748
+ - Links to pages that now 404
749
+ - Schema `dateModified` older than 12 months for competitive queries
750
+
751
+ ---
752
+
753
+ ## Crawl Budget Management at Scale
754
+
755
+ Crawl budget is the number of pages Googlebot will crawl on your site per day. For sites with 10k+ URLs it becomes a real constraint — Googlebot will simply stop crawling before it reaches all your pages, and newly added pages may take weeks to be discovered.
756
+
757
+ ### What wastes crawl budget
758
+
759
+ - **Faceted navigation**: Filter/sort URLs like `?color=red&size=M` that produce near-duplicate pages
760
+ - **Pagination**: `/page/2`,`/page/3`... where the same products appear on multiple pages
761
+
762
+ - **Session IDs / tracking params**: `?sessionid=abc123` creating millions of unique URLs
763
+ - **Internal search results**: `/search?q=anything` — never crawlable, always thin
764
+
765
+ ### Solutions
766
+
767
+ **Block via `robots.txt`** (prevents crawling, doesn't affect indexation of already-indexed pages):
768
+
769
+ ```text
770
+
771
+ User-agent: Googlebot
772
+
773
+ Disallow: /search
774
+
775
+ Disallow: /*?sessionid=
776
+
777
+ ```
778
+
779
+ **`noindex` on parameterized URLs** (crawled but not indexed — use when the URL must exist for users):
780
+
781
+ ```html
782
+
783
+ <meta name="robots" content="noindex, follow" />
784
+
785
+ ```
786
+
787
+ **Canonical for near-duplicates** (one sorted/filtered variant is canonical; others point to it):
788
+
789
+ ```html
790
+
791
+ <!-- On /products?sort=price-asc -->
792
+
793
+ <link rel="canonical" href="https://site.com/products" />
794
+
795
+ ```
796
+
797
+ **Pagination**: Use `rel="next"`/`rel="prev"` or consolidate paginated content into one long page. Don't noindex paginated pages if they contain unique products not on page 1.
798
+
799
+ ### Diagnosing crawl budget problems
800
+
801
+ In Google Search Console → Settings → Crawl stats:
802
+
803
+ - **Crawled pages/day declining** → Googlebot is throttling due to slow responses or crawl errors
804
+ - **Response codes: high 404 rate** → fix broken links; they waste crawl budget
805
+
806
+ - **Crawled but not indexed** rising → thin content or crawl budget exhausted before quality assessment
807
+
808
+ For large sites, use separate sitemaps per page type (`sitemap-glossary.xml`,`sitemap-guides.xml`) and prioritize high-value pages in the first sitemap.
809
+
810
+ ---
811
+
812
+ ## AI-Generated Content Policy
813
+
814
+ ### What Google actually detects
815
+
816
+ Google does not need to determine whether content was written by AI or a human. It identifies a **pattern**: low-cost mass production where pages look different on the surface but are essentially repetitive underneath. The signals of this pattern include:
817
+
818
+ - Many pages with similar titles and angles
819
+ - Smooth, grammatically correct prose with no new information
820
+
821
+ - Comprehensive coverage that is really just reorganized common knowledge
822
+ - Each page is readable, but after reading it you've learned nothing new
823
+
824
+ - High page count with no corresponding user engagement or trust signals
825
+
826
+ **This pattern triggers penalties regardless of authorship.** A human content farm producing the same pattern gets the same treatment. The issue is never "AI wrote this" — it is "this adds nothing."
827
+
828
+ ### The correct framing
829
+
830
+ The question is not: "Is it safe to use AI for SEO content?"
831
+
832
+ The question is: **"Does this page contain enough information gain, search intent match, and trust signals that Google would rank it — regardless of how it was produced?"**
833
+
834
+ If yes, AI is a powerful accelerator. If no, AI just lets you produce worthless pages faster.
835
+
836
+ ### Where AI helps in pSEO
837
+
838
+ | Use case | Why it works |
839
+
840
+ |---|---|
841
+
842
+ | Summarising structured data into readable prose | Each page's data is unique → output is unique |
843
+
844
+ | Generating FAQ blocks from a data object | Templated but data-driven → not boilerplate |
845
+
846
+ | Translating + adapting content (with review) | Saves time; review catches errors |
847
+
848
+ | Writing meta descriptions from page data | Short, formula-driven → low risk |
849
+
850
+ | Structuring raw data into tables and comparisons | Saves formatting time; data does the heavy lifting |
851
+
852
+ | Drafting initial content for human review and enrichment | Faster starting point; human adds the information gain |
853
+
854
+ ### Where AI hurts in pSEO
855
+
856
+ | Anti-pattern | Risk |
857
+
858
+ |---|---|
859
+
860
+ | Generic "overview" paragraphs with no data | Identical across all pages → thin content |
861
+
862
+ | AI-expanded boilerplate ("X is a type of Y that...") | Detectable by pattern; no unique value |
863
+
864
+ | Mass-generating content without data variation | Amplifies the thin content problem at scale |
865
+
866
+ | Fabricating entity-specific facts | Hallucinations become trust/legal liabilities |
867
+
868
+ | Using AI to "rewrite the top 10 results" for a keyword | Produces content with zero information gain — just reshuffled common knowledge |
869
+
870
+ | Letting AI make strategic decisions (keyword selection, page type, whether to publish) | AI will confidently produce content for keywords where the user has no chance of ranking |
871
+
872
+ ### The role boundary
873
+
874
+ **AI is an execution tool, not a strategy tool for SEO.** AI should:
875
+
876
+ - ✅ Draft content from structured data the user provides
877
+ - ✅ Format, structure, and polish pages
878
+
879
+ - ✅ Generate meta descriptions, FAQ blocks, schema markup
880
+ - ✅ Help with technical implementation (SSR, sitemaps, caching)
881
+
882
+ AI should NOT:
883
+
884
+ - ❌ Decide which keywords to target
885
+ - ❌ Determine whether a page has enough information gain to publish
886
+
887
+ - ❌ Replace competitive analysis and intent matching
888
+ - ❌ Assess whether the user's site has enough authority to compete
889
+
890
+ - ❌ Generate "content" without underlying data that varies per page
891
+
892
+ When the user asks for "SEO content," the agent's first job is to ensure there is a real data source and strategic rationale — not to start generating pages.
893
+
894
+ ### Practical checklist before publishing AI-assisted content
895
+
896
+ - [ ] Does each page's AI output differ meaningfully from every other page? (run a diff on 5 random pages)
897
+ - [ ] Is the AI prose grounded in real data from the data source, or is it freestanding prose?
898
+
899
+ - [ ] Does each page contain at least one data point or insight not found in the current top 10 results?
900
+ - [ ] Could a human reviewer catch factual errors before publish? (build a review step for high-stakes verticals)
901
+
902
+ - [ ] Would a user who arrived from Google find this page more useful than the search results they came from?
903
+ - [ ] Has the page type been matched to the query intent (not just a blog post by default)?
904
+
905
+ If all answers are yes, the content is likely safe. If any is no, rethink the content strategy before scaling.
906
+
907
+ ---
908
+
909
+ ## Performance and Core Web Vitals for SSR Pages
910
+
911
+ pSEO pages are often deprioritized for performance work because they're "just content pages." But Core Web Vitals are a confirmed ranking factor, and a slow pSEO page competes against well-optimized competitors who target the same keyword.
912
+
913
+ ### The three metrics that matter
914
+
915
+ | Metric | Threshold | Common cause in pSEO |
916
+
917
+ |---|---|---|
918
+
919
+ | **LCP** (Largest Contentful Paint) | < 2.5s | Hero image without dimensions/preload; render-blocking CSS |
920
+
921
+ | **CLS** (Cumulative Layout Shift) | < 0.1 | Images without `width`/`height`; fonts causing FOUT |
922
+
923
+ | **INP** (Interaction to Next Paint) | < 200ms | Large JS bundles blocking the main thread |
924
+
925
+ ### For SSR Express pages specifically
926
+
927
+ #### Eliminate render-blocking resources
928
+
929
+ ```html
930
+
931
+ <!-- WRONG: blocks render until stylesheet loads -->
932
+
933
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter" />
934
+
935
+ <!-- CORRECT: preconnect + async load -->
936
+
937
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
938
+
939
+ <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter&display=swap" />
940
+
941
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter&display=swap" media="print" onload="this.media='all'" />
942
+
943
+ ```
944
+
945
+ **Inline critical CSS** (the styles needed to render above-the-fold content):
946
+
947
+ - Inline it in `<style>`tags in`<head>` — eliminates one round trip
948
+ - Load remaining CSS asynchronously or omit it (pSEO pages rarely need large stylesheets)
949
+
950
+ **Images must have explicit dimensions** to prevent CLS:
951
+
952
+ ```html
953
+
954
+ <!-- WRONG: browser doesn't know height → layout shift on load -->
955
+
956
+ <img src="${hero}" alt="..." />
957
+
958
+ <!-- CORRECT -->
959
+
960
+ <img src="${hero}" width="1200" height="630" alt="..." loading="lazy" />
961
+
962
+ ```
963
+
964
+ **No JavaScript is ideal.** SSR content pages need zero client-side JS. If you must include JS (analytics, interactivity), load it `defer`or`async`.
965
+
966
+ ### Measuring pages not yet in Chrome UX Report
967
+
968
+ New pages have no real-user data (CrUX) for 28 days. Use:
969
+
970
+ - **Lighthouse** (Chrome DevTools or CLI): `lighthouse https://yoursite.com/glossary/term --only-categories=performance`
971
+ - **PageSpeed Insights API**: programmatic scoring for a batch of URLs
972
+
973
+ - **WebPageTest**: detailed waterfall view to identify bottlenecks
974
+
975
+ Run Lighthouse on a representative sample of pages (hub, high-volume spoke, low-volume spoke) — don't assume all pages perform equally.
976
+
977
+ ---
978
+
979
+ ## Monitoring and Iteration Loop
980
+
981
+ Shipping pSEO pages is not a one-time event. The standard pattern is: launch → wait 4-8 weeks → analyze → iterate. Most pSEO playbooks fail because teams skip the iteration step.
982
+
983
+ ### What to track in Search Console (per page type)
984
+
985
+ Open the **Performance** report, filter by URL prefix for each playbook (`/glossary/`,`/guides/`, etc.):
986
+
987
+ | Signal | Healthy | Problem indicator |
988
+
989
+ |---|---|---|
990
+
991
+ | **Impressions growing** | Steady week-over-week increase | Flat after 8 weeks → pages not indexed or no demand |
992
+
993
+ | **CTR** | >2% for informational, >5% for navigational | Low CTR → title/description not compelling |
994
+
995
+ | **Average position** | Trending toward <20 | Stuck at 30-50 → content quality or authority issue |
996
+
997
+ | **Coverage: Crawled, not indexed** | Decreasing | Increasing → thin content signal |
998
+
999
+ | **Coverage: Excluded (noindex)** | Matches intentional noindex count | Higher than expected → template accidentally sets noindex |
1000
+
1001
+ ### Decision framework per page set
1002
+
1003
+ ```text
1004
+
1005
+ 8 weeks post-launch:
1006
+
1007
+
1008
+
1009
+ ├── Indexed AND getting impressions?
1010
+
1011
+ │ ├── YES, position <10 → monitor; optimize title/meta for CTR
1012
+
1013
+ │ ├── YES, position 11-30 → improve content depth, add internal links
1014
+
1015
+ │ └── YES, position >30 → thin content; merge with a stronger page or rewrite
1016
+
1017
+
1018
+
1019
+ ├── Not indexed (Crawled, not indexed)?
1020
+
1021
+ │ ├── Low page count (<100) → submit to Search Console for inspection
1022
+
1023
+ │ └── High page count (100+) → thin content; noindex worst pages, improve rest
1024
+
1025
+
1026
+
1027
+ └── Not even crawled?
1028
+
1029
+ ├── Check sitemap submission
1030
+
1031
+ ├── Check robots.txt for accidental blocks
1032
+
1033
+ └── Check crawl budget — too many thin pages may be crowding out good ones
1034
+
1035
+ ```
1036
+
1037
+ ### When to kill a playbook
1038
+
1039
+ Kill it (noindex + 301 redirect survivors to a hub) when after 6 months:
1040
+
1041
+ - Zero pages from the set are in the top 50 for any target keyword, AND
1042
+ - Impressions are flat or declining, AND
1043
+
1044
+ - The page type is consuming crawl budget (visible in crawl stats)
1045
+
1046
+ Keeping dead pages alive harms the rest of the site — Google distributes trust across the whole domain. A smaller set of high-quality pages consistently outperforms a large set of mediocre ones.
1047
+
1048
+ ### Iteration cadence
1049
+
1050
+ | Frequency | Action |
1051
+
1052
+ |---|---|
1053
+
1054
+ | Weekly | Check indexation coverage for errors |
1055
+
1056
+ | Monthly | Review impressions/CTR per playbook; update titles on underperformers |
1057
+
1058
+ | Quarterly | Full content audit — merge, improve, or kill underperforming page sets |
1059
+
1060
+ | On data change | Regenerate affected pages; update `dateModified` in schema |
1061
+
1062
+ ---
1063
+
1064
+ ## Quality Checks
1065
+
1066
+ ### Pre-Strategy (before writing any code)
1067
+
1068
+ - [ ] User has identified unique data source that varies meaningfully per page
1069
+ - [ ] Page type matches query intent (blog vs. comparison vs. tool vs. directory)
1070
+
1071
+ - [ ] Information gain validated: each page offers something the current top 10 results don't have
1072
+ - [ ] Competitive viability assessed: user's site has (or is building) topical authority in this area
1073
+
1074
+ - [ ] Starting with a small batch (10-20 pages) before scaling to hundreds
1075
+ - [ ] Human has made the strategic decisions; AI is handling execution only
1076
+
1077
+ ### Pre-Launch (technical and content)
1078
+
1079
+ - [ ] `curl` the URL and verify target keywords appear in raw HTML (not rendered by JS)
1080
+ - [ ] Each page provides unique value beyond variable substitution — if you removed the entity name, pages would NOT be indistinguishable
1081
+
1082
+ - [ ] Information gain test passed: 5 random pages each contain data/insights not in the current top 10 results
1083
+ - [ ] Answers search intent for the target keyword with the correct page type
1084
+
1085
+ - [ ] Unique titles and meta descriptions per page
1086
+ - [ ] Proper heading structure (one H1, logical H2/H3 hierarchy)
1087
+
1088
+ - [ ] Correct schema markup with no validation errors (test at schema.org/validator)
1089
+ - [ ] Page speed acceptable — LCP <2.5s, CLS <0.1, no render-blocking resources
1090
+
1091
+ - [ ] Images have explicit `width`and`height` attributes
1092
+ - [ ] Connected to site architecture (footer/nav links to hub pages; hub links to spokes)
1093
+
1094
+ - [ ] Breadcrumbs render correctly and are not obscured
1095
+ - [ ] Logo and branding match the main application exactly
1096
+
1097
+ - [ ] In XML sitemap and crawlable (no `noindex` accidentally set)
1098
+ - [ ] 404s return proper status codes (no pages for invalid slugs)
1099
+
1100
+ - [ ] Cache headers set appropriately per page type (live data: no-cache; static: max-age=86400)
1101
+ - [ ] Faceted/filtered URLs blocked via `robots.txt`or marked`noindex`
1102
+
1103
+ - [ ] Multilingual pages: hreflang tags present, bidirectional, with `x-default`
1104
+ - [ ] AI-assisted content: each page's output meaningfully differs from every other page
1105
+
1106
+ - [ ] `dateModified` in schema tied to actual data change, not deploy date
1107
+
1108
+ ### Post-Launch Monitoring
1109
+
1110
+ Track (per playbook URL prefix in Search Console): indexation rate, impressions, average position, CTR
1111
+
1112
+ 8-week review: assess which page sets are indexed and gaining impressions, which are stuck, which are excluded. Apply the decision framework above.
1113
+
1114
+ Watch for: "Crawled, not indexed" count rising (thin content), crawl budget errors, manual actions, ranking drops after content updates.
1115
+
1116
+ ---
1117
+
1118
+ ## Common Mistakes
1119
+
1120
+ ### Strategic mistakes (most damaging)
1121
+
1122
+ - **Confusing scale with strategy**: Believing "more pages = more traffic" without validating that each page has information gain. This is the single most common pSEO failure mode in 2025+.
1123
+ - **SEO cosplay**: Pages with perfect technical structure (H1, H2, meta tags, schema) but zero information gain over existing results. Structure is table stakes, not a ranking advantage.
1124
+
1125
+ - **No information gain audit**: Publishing pages without checking whether they add anything the current top 10 results don't already have.
1126
+ - **Skipping intent matching**: Building blog posts when the query demands a comparison table, or building a product page when the query demands educational content. Wrong page type = won't rank regardless of quality.
1127
+
1128
+ - **Ignoring topical authority**: Publishing hundreds of pages in a domain where the site has no track record. Authority is earned through depth and trust signals, not page count.
1129
+ - **Letting AI make strategic decisions**: AI generates confidently even when the keyword is unwinnable, the page type is wrong, or the content has no unique value. Human judgment is required for: keyword selection, page type, competitive viability, and publish/no-publish decisions.
1130
+
1131
+ - **Treating AI output as finished content**: AI drafts need human enrichment — original data, case studies, expert judgment, first-hand experience. Raw AI output is a starting point, not a final product.
1132
+
1133
+ ### Content mistakes
1134
+
1135
+ - **Thin content**: Just swapping entity names in identical boilerplate (Google will deindex)
1136
+ - **AI prose with no data variation**: All pages share the same generic paragraphs — amplifies thin content at scale. If you removed the entity name, pages would be indistinguishable.
1137
+
1138
+ - **Rewriting the top 10 results**: Using AI to rephrase what already ranks is zero information gain. Google doesn't need another version of existing content.
1139
+ - **Keyword cannibalization**: Multiple pages targeting the same keyword
1140
+
1141
+ - **Over-generation**: Creating pages with no search demand
1142
+ - **Poor data quality**: Outdated or incorrect information erodes trust
1143
+
1144
+ ### Technical mistakes
1145
+
1146
+ - **SPA without SSR**: Adding pSEO pages to a React/Vue app without server-rendering — Google sees nothing
1147
+ - **Orphan pages**: New SEO pages not linked from anywhere in the main site's navigation or footer
1148
+
1149
+ - **Inconsistent branding**: SSR pages that look different from the main app break user trust
1150
+ - **Breadcrumb obscured by layout tricks**: Negative margin patterns hiding breadcrumb navigation
1151
+
1152
+ - **Wrong cache headers**: Live-data pages cached for 24h showing stale rates; static pages uncached causing unnecessary server load
1153
+ - **Asset permission errors**: Referencing frontend assets from SSR routes that can't read them
1154
+
1155
+ - **Machine-translating pSEO content at scale**: Produces near-duplicate content across locales; triggers spam signals
1156
+ - **Missing or asymmetric hreflang**: One page in the set not listing all variants breaks the entire locale cluster
1157
+
1158
+ - **Bumping `dateModified` without real content changes**: Deception signal; Google can detect and penalise it
1159
+ - **Faceted navigation URLs not blocked**: Filter/sort param combinations create thousands of near-duplicate crawlable URLs, wasting crawl budget
1160
+
1161
+ - **No crawl budget monitoring**: Teams discover Googlebot stopped crawling new pages only after rankings plateau
1162
+ - **Skipping Core Web Vitals on pSEO pages**: Slow LCP or high CLS on "just content" pages loses rankings to faster competitors
1163
+
1164
+ - **Images without dimensions**: Causes CLS on SSR pages (browser doesn't know reserved height until image loads)
1165
+
1166
+ ### Process mistakes
1167
+
1168
+ - **Blasting hundreds of pages at once**: Instead of starting with 10-20 pages, validating indexation and impressions, then scaling what works
1169
+ - **No iteration loop**: Shipping pSEO and never reviewing Search Console — dead pages accumulate and drag down domain trust
1170
+
1171
+ - **No freshness strategy for live-data pages**: Exchange rates or prices cached for 24h showing stale data destroys credibility
1172
+ - **Ignoring UX**: Pages that exist for Google but not for users — no conversion path, no value to visitors
1173
+
1174
+ ---
1175
+
1176
+ ## Output Format
1177
+
1178
+ Deliver strategy validation first, then implementation. **Do not skip straight to building pages.**
1179
+
1180
+ 1. **Strategic validation** (before any code):
1181
+
1182
+ - What unique data does the user have that varies per page?
1183
+ - What page type matches the query intent?
1184
+
1185
+ - What information gain does each page offer over current top 10 results?
1186
+ - Does the user's site have topical authority in this area?
1187
+
1188
+ - Recommended initial batch size (start small, validate, then scale)
1189
+
1190
+ 1. **Rendering audit**: Confirm whether the app is a SPA and what SSR approach to use
1191
+ 2. **Strategy**: Opportunity analysis, chosen playbook(s), keyword patterns, data sources, page count estimate
1192
+
1193
+ 3. **Shared infrastructure**: `ssrShared.ts` (or equivalent) HTML shell before any individual pages
1194
+ 4. **Template**: URL structure, title/meta templates, content outline, schema markup
1195
+
1196
+ 5. **Implementation**: Working server-rendered pages that return full HTML to `curl`
1197
+ 6. **Integration**: Footer/nav updates in the main app linking to the new hub pages
1198
+
1199
+ 7. **Validation plan**: How to verify pages are indexed, earning impressions, and when to scale or kill the campaign
1200
+
1201
+ ## Limitations
1202
+
1203
+ - Cannot access Search Console data to monitor indexation
1204
+ - Cannot check existing backlink profiles
1205
+
1206
+ - Data quality depends on the source — always validate before publishing
1207
+ - Cannot guarantee rankings — SEO involves many factors beyond on-page optimization