vybekiit 0.4.0 → 0.6.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 (665) hide show
  1. package/dist/bin.js +840 -296
  2. package/dist/global-skills/add-ai/SKILL.md +53 -0
  3. package/dist/global-skills/add-analytics/SKILL.md +65 -0
  4. package/dist/global-skills/add-app-clip/SKILL.md +280 -0
  5. package/dist/global-skills/add-app-clip/agents/openai.yaml +4 -0
  6. package/dist/global-skills/add-app-clip/references/native-module.md +96 -0
  7. package/dist/global-skills/add-blog/SKILL.md +49 -0
  8. package/dist/global-skills/add-crud/SKILL.md +28 -0
  9. package/dist/global-skills/add-files/SKILL.md +65 -0
  10. package/dist/global-skills/add-images/SKILL.md +64 -0
  11. package/dist/global-skills/add-language/SKILL.md +44 -0
  12. package/dist/global-skills/add-notifications/SKILL.md +61 -0
  13. package/dist/global-skills/add-realtime/SKILL.md +49 -0
  14. package/dist/global-skills/add-route/SKILL.md +28 -0
  15. package/dist/global-skills/add-search/SKILL.md +43 -0
  16. package/dist/global-skills/add-signin/SKILL.md +78 -0
  17. package/dist/global-skills/add-teams/SKILL.md +64 -0
  18. package/dist/global-skills/add-upload/SKILL.md +27 -0
  19. package/dist/global-skills/aws-cdk/SKILL.md +72 -0
  20. package/dist/global-skills/aws-cdk/references/bootstrap-and-project-setup.md +257 -0
  21. package/dist/global-skills/aws-cdk/references/compliance-and-drift.md +193 -0
  22. package/dist/global-skills/aws-cdk/references/construct-patterns.md +315 -0
  23. package/dist/global-skills/aws-cdk/references/import-and-migrate.md +184 -0
  24. package/dist/global-skills/aws-cdk/references/refactor-and-prevent-replacement.md +198 -0
  25. package/dist/global-skills/aws-cdk/references/troubleshooting-credentials.md +183 -0
  26. package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +293 -0
  27. package/dist/global-skills/aws-cdk/references/troubleshooting-synth.md +274 -0
  28. package/dist/global-skills/aws-cdk/references/v1-to-v2-migration.md +119 -0
  29. package/dist/global-skills/aws-cloudformation/SKILL.md +88 -0
  30. package/dist/global-skills/aws-cloudformation/references/author-cloudformation-best-practices.script.md +179 -0
  31. package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +159 -0
  32. package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +217 -0
  33. package/dist/global-skills/aws-cloudformation/references/deploy-with-express-mode.script.md +271 -0
  34. package/dist/global-skills/aws-cloudformation/references/lookup-resource-properties.script.md +130 -0
  35. package/dist/global-skills/aws-cloudformation/references/troubleshoot-deployment.script.md +200 -0
  36. package/dist/global-skills/aws-cloudformation/references/validate-cloudformation-template.script.md +135 -0
  37. package/dist/global-skills/aws-serverless/SKILL.md +51 -0
  38. package/dist/global-skills/aws-serverless/assets/powertools-handler.py +49 -0
  39. package/dist/global-skills/aws-serverless/references/api-gateway.md +553 -0
  40. package/dist/global-skills/aws-serverless/references/architecture.md +262 -0
  41. package/dist/global-skills/aws-serverless/references/concurrency.md +200 -0
  42. package/dist/global-skills/aws-serverless/references/deployment.md +94 -0
  43. package/dist/global-skills/aws-serverless/references/event-sources.md +484 -0
  44. package/dist/global-skills/aws-serverless/references/lambda.md +548 -0
  45. package/dist/global-skills/aws-serverless/references/orchestration.md +449 -0
  46. package/dist/global-skills/aws-serverless/references/production.md +493 -0
  47. package/dist/global-skills/aws-serverless/references/troubleshooting.md +711 -0
  48. package/dist/global-skills/back-up-my-code/SKILL.md +48 -0
  49. package/dist/global-skills/better-auth-best-practices/SKILL.md +182 -0
  50. package/dist/global-skills/better-auth-security-best-practices/SKILL.md +432 -0
  51. package/dist/global-skills/building-native-ui/SKILL.md +377 -0
  52. package/dist/global-skills/building-native-ui/agents/openai.yaml +4 -0
  53. package/dist/global-skills/building-native-ui/references/animations.md +220 -0
  54. package/dist/global-skills/building-native-ui/references/controls.md +270 -0
  55. package/dist/global-skills/building-native-ui/references/form-sheet.md +253 -0
  56. package/dist/global-skills/building-native-ui/references/gradients.md +106 -0
  57. package/dist/global-skills/building-native-ui/references/icons.md +213 -0
  58. package/dist/global-skills/building-native-ui/references/media.md +198 -0
  59. package/dist/global-skills/building-native-ui/references/route-structure.md +229 -0
  60. package/dist/global-skills/building-native-ui/references/search.md +248 -0
  61. package/dist/global-skills/building-native-ui/references/storage.md +121 -0
  62. package/dist/global-skills/building-native-ui/references/tabs.md +433 -0
  63. package/dist/global-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
  64. package/dist/global-skills/building-native-ui/references/visual-effects.md +197 -0
  65. package/dist/global-skills/building-native-ui/references/webgpu-three.md +605 -0
  66. package/dist/global-skills/building-native-ui/references/zoom-transitions.md +158 -0
  67. package/dist/global-skills/buy-domain/SKILL.md +64 -0
  68. package/dist/global-skills/check-safety/SKILL.md +94 -0
  69. package/dist/global-skills/claimable-postgres/SKILL.md +249 -0
  70. package/dist/global-skills/configure-capabilities/SKILL.md +38 -0
  71. package/dist/global-skills/connect-account/SKILL.md +64 -0
  72. package/dist/global-skills/connect-account-backend/SKILL.md +41 -0
  73. package/dist/global-skills/create-auth-skill/SKILL.md +321 -0
  74. package/dist/global-skills/design-my-data/SKILL.md +48 -0
  75. package/dist/global-skills/doctor/SKILL.md +84 -0
  76. package/dist/global-skills/eas-app-stores/SKILL.md +152 -0
  77. package/dist/global-skills/eas-app-stores/agents/openai.yaml +4 -0
  78. package/dist/global-skills/eas-app-stores/references/app-store-metadata.md +497 -0
  79. package/dist/global-skills/eas-app-stores/references/ios-app-store.md +371 -0
  80. package/dist/global-skills/eas-app-stores/references/play-store.md +246 -0
  81. package/dist/global-skills/eas-app-stores/references/testflight.md +58 -0
  82. package/dist/global-skills/eas-app-stores/references/workflows.md +120 -0
  83. package/dist/global-skills/eas-hosting/SKILL.md +423 -0
  84. package/dist/global-skills/eas-hosting/agents/openai.yaml +4 -0
  85. package/dist/global-skills/eas-observe/SKILL.md +32 -0
  86. package/dist/global-skills/eas-observe/agents/openai.yaml +4 -0
  87. package/dist/global-skills/eas-observe/references/metrics.md +47 -0
  88. package/dist/global-skills/eas-observe/references/queries.md +342 -0
  89. package/dist/global-skills/eas-observe/references/setup.md +317 -0
  90. package/dist/global-skills/eas-simulator/SKILL.md +156 -0
  91. package/dist/global-skills/eas-simulator/agents/openai.yaml +4 -0
  92. package/dist/global-skills/eas-simulator/references/controllers.md +67 -0
  93. package/dist/global-skills/eas-simulator/references/run-your-app.md +185 -0
  94. package/dist/global-skills/eas-simulator/references/troubleshooting.md +38 -0
  95. package/dist/global-skills/eas-update-insights/SKILL.md +230 -0
  96. package/dist/global-skills/eas-update-insights/agents/openai.yaml +4 -0
  97. package/dist/global-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  98. package/dist/global-skills/eas-update-insights/references/update-insights-schema.md +69 -0
  99. package/dist/global-skills/eas-workflows/SKILL.md +94 -0
  100. package/dist/global-skills/eas-workflows/agents/openai.yaml +4 -0
  101. package/dist/global-skills/eas-workflows/scripts/fetch.js +109 -0
  102. package/dist/global-skills/eas-workflows/scripts/package.json +11 -0
  103. package/dist/global-skills/eas-workflows/scripts/validate.js +84 -0
  104. package/dist/global-skills/email-best-practices/SKILL.md +73 -0
  105. package/dist/global-skills/expo-api-routes/SKILL.md +368 -0
  106. package/dist/global-skills/expo-api-routes/agents/openai.yaml +4 -0
  107. package/dist/global-skills/expo-app-clip/SKILL.md +282 -0
  108. package/dist/global-skills/expo-app-clip/agents/openai.yaml +4 -0
  109. package/dist/global-skills/expo-app-clip/references/native-module.md +96 -0
  110. package/dist/global-skills/expo-brownfield/SKILL.md +54 -0
  111. package/dist/global-skills/expo-brownfield/agents/openai.yaml +4 -0
  112. package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
  113. package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
  114. package/dist/global-skills/expo-brownfield/references/comparison.md +63 -0
  115. package/dist/global-skills/expo-brownfield/references/troubleshooting.md +88 -0
  116. package/dist/global-skills/expo-cicd-workflows/SKILL.md +92 -0
  117. package/dist/global-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
  118. package/dist/global-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
  119. package/dist/global-skills/expo-cicd-workflows/scripts/package.json +11 -0
  120. package/dist/global-skills/expo-cicd-workflows/scripts/validate.js +84 -0
  121. package/dist/global-skills/expo-data-fetching/SKILL.md +449 -0
  122. package/dist/global-skills/expo-data-fetching/agents/openai.yaml +4 -0
  123. package/dist/global-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  124. package/dist/global-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  125. package/dist/global-skills/expo-deployment/SKILL.md +167 -0
  126. package/dist/global-skills/expo-deployment/agents/openai.yaml +4 -0
  127. package/dist/global-skills/expo-deployment/references/app-store-metadata.md +497 -0
  128. package/dist/global-skills/expo-deployment/references/ios-app-store.md +371 -0
  129. package/dist/global-skills/expo-deployment/references/play-store.md +246 -0
  130. package/dist/global-skills/expo-deployment/references/testflight.md +58 -0
  131. package/dist/global-skills/expo-deployment/references/workflows.md +160 -0
  132. package/dist/global-skills/expo-dev-client/SKILL.md +174 -0
  133. package/dist/global-skills/expo-dev-client/agents/openai.yaml +4 -0
  134. package/dist/global-skills/expo-dom/SKILL.md +417 -0
  135. package/dist/global-skills/expo-dom/agents/openai.yaml +4 -0
  136. package/dist/global-skills/expo-examples/SKILL.md +99 -0
  137. package/dist/global-skills/expo-examples/agents/openai.yaml +4 -0
  138. package/dist/global-skills/expo-examples/references/catalog.md +105 -0
  139. package/dist/global-skills/expo-module/SKILL.md +141 -0
  140. package/dist/global-skills/expo-module/agents/openai.yaml +4 -0
  141. package/dist/global-skills/expo-module/references/config-plugin.md +90 -0
  142. package/dist/global-skills/expo-module/references/create-expo-module.md +206 -0
  143. package/dist/global-skills/expo-module/references/lifecycle.md +127 -0
  144. package/dist/global-skills/expo-module/references/module-config.md +48 -0
  145. package/dist/global-skills/expo-module/references/native-module.md +286 -0
  146. package/dist/global-skills/expo-module/references/native-view.md +171 -0
  147. package/dist/global-skills/expo-native-ui/SKILL.md +181 -0
  148. package/dist/global-skills/expo-native-ui/agents/openai.yaml +4 -0
  149. package/dist/global-skills/expo-native-ui/references/animations.md +220 -0
  150. package/dist/global-skills/expo-native-ui/references/controls.md +270 -0
  151. package/dist/global-skills/expo-native-ui/references/gradients.md +106 -0
  152. package/dist/global-skills/expo-native-ui/references/icons.md +213 -0
  153. package/dist/global-skills/expo-native-ui/references/media.md +198 -0
  154. package/dist/global-skills/expo-native-ui/references/storage.md +121 -0
  155. package/dist/global-skills/expo-native-ui/references/visual-effects.md +197 -0
  156. package/dist/global-skills/expo-native-ui/references/webgpu-three.md +605 -0
  157. package/dist/global-skills/expo-observe/SKILL.md +30 -0
  158. package/dist/global-skills/expo-observe/references/metrics.md +47 -0
  159. package/dist/global-skills/expo-observe/references/queries.md +342 -0
  160. package/dist/global-skills/expo-observe/references/setup.md +317 -0
  161. package/dist/global-skills/expo-router/SKILL.md +230 -0
  162. package/dist/global-skills/expo-router/agents/openai.yaml +4 -0
  163. package/dist/global-skills/expo-router/references/form-sheet.md +253 -0
  164. package/dist/global-skills/expo-router/references/route-structure.md +229 -0
  165. package/dist/global-skills/expo-router/references/search.md +248 -0
  166. package/dist/global-skills/expo-router/references/tabs.md +433 -0
  167. package/dist/global-skills/expo-router/references/toolbar-and-headers.md +284 -0
  168. package/dist/global-skills/expo-router/references/zoom-transitions.md +158 -0
  169. package/dist/global-skills/expo-skill-eval/SKILL.md +314 -0
  170. package/dist/global-skills/expo-skill-eval/agents/visual-grader.md +52 -0
  171. package/dist/global-skills/expo-skill-eval/references/design-rubric.md +45 -0
  172. package/dist/global-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  173. package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +64 -0
  174. package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  175. package/dist/global-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  176. package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  177. package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  178. package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  179. package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  180. package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  181. package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  182. package/dist/global-skills/expo-skill-feedback/SKILL.md +54 -0
  183. package/dist/global-skills/expo-skill-feedback/agents/openai.yaml +4 -0
  184. package/dist/global-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
  185. package/dist/global-skills/expo-skill-feedback/scripts/skill-feedback.cjs +118 -0
  186. package/dist/global-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
  187. package/dist/global-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
  188. package/dist/global-skills/expo-tailwind-setup/SKILL.md +480 -0
  189. package/dist/global-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
  190. package/dist/global-skills/expo-ui/SKILL.md +47 -0
  191. package/dist/global-skills/expo-ui/agents/openai.yaml +4 -0
  192. package/dist/global-skills/expo-ui/references/drop-in-replacements.md +27 -0
  193. package/dist/global-skills/expo-ui/references/jetpack-compose.md +73 -0
  194. package/dist/global-skills/expo-ui/references/swift-ui.md +73 -0
  195. package/dist/global-skills/expo-ui/references/universal.md +73 -0
  196. package/dist/global-skills/expo-ui/scripts/list-components.js +193 -0
  197. package/dist/global-skills/expo-upgrade/SKILL.md +134 -0
  198. package/dist/global-skills/expo-upgrade/agents/openai.yaml +4 -0
  199. package/dist/global-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  200. package/dist/global-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  201. package/dist/global-skills/expo-upgrade/references/native-tabs.md +124 -0
  202. package/dist/global-skills/expo-upgrade/references/new-architecture.md +79 -0
  203. package/dist/global-skills/expo-upgrade/references/react-19.md +79 -0
  204. package/dist/global-skills/expo-upgrade/references/react-compiler.md +59 -0
  205. package/dist/global-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  206. package/dist/global-skills/expo-web-to-native/SKILL.md +83 -0
  207. package/dist/global-skills/expo-web-to-native/agents/openai.yaml +4 -0
  208. package/dist/global-skills/expo-web-to-native/references/false-friends.md +119 -0
  209. package/dist/global-skills/expo-web-to-native/references/native-patterns.md +39 -0
  210. package/dist/global-skills/expo-web-to-native/references/run-as-goal.md +48 -0
  211. package/dist/global-skills/expo-web-to-native/references/verify-on-device.md +45 -0
  212. package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +165 -0
  213. package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +95 -0
  214. package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +156 -0
  215. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +157 -0
  216. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +186 -0
  217. package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +73 -0
  218. package/dist/global-skills/firebase-app-hosting-basics/references/cli_commands.md +85 -0
  219. package/dist/global-skills/firebase-app-hosting-basics/references/configuration.md +59 -0
  220. package/dist/global-skills/firebase-app-hosting-basics/references/emulation.md +59 -0
  221. package/dist/global-skills/firebase-auth-basics/SKILL.md +118 -0
  222. package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +160 -0
  223. package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +301 -0
  224. package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +149 -0
  225. package/dist/global-skills/firebase-auth-basics/references/ios_setup.md +87 -0
  226. package/dist/global-skills/firebase-auth-basics/references/security_rules.md +49 -0
  227. package/dist/global-skills/firebase-basics/SKILL.md +148 -0
  228. package/dist/global-skills/firebase-basics/references/android_setup.md +41 -0
  229. package/dist/global-skills/firebase-basics/references/firebase-cli-guide.md +18 -0
  230. package/dist/global-skills/firebase-basics/references/firebase-service-init.md +20 -0
  231. package/dist/global-skills/firebase-basics/references/flutter_setup.md +143 -0
  232. package/dist/global-skills/firebase-basics/references/ios_setup.md +113 -0
  233. package/dist/global-skills/firebase-basics/references/local-env-setup.md +80 -0
  234. package/dist/global-skills/firebase-basics/references/refresh/android_studio.md +41 -0
  235. package/dist/global-skills/firebase-basics/references/refresh/antigravity.md +64 -0
  236. package/dist/global-skills/firebase-basics/references/refresh/claude.md +12 -0
  237. package/dist/global-skills/firebase-basics/references/refresh/gemini-cli.md +13 -0
  238. package/dist/global-skills/firebase-basics/references/refresh/other-agents.md +67 -0
  239. package/dist/global-skills/firebase-basics/references/setup/android_studio.md +23 -0
  240. package/dist/global-skills/firebase-basics/references/setup/antigravity.md +98 -0
  241. package/dist/global-skills/firebase-basics/references/setup/claude_code.md +45 -0
  242. package/dist/global-skills/firebase-basics/references/setup/cursor.md +93 -0
  243. package/dist/global-skills/firebase-basics/references/setup/gemini_cli.md +53 -0
  244. package/dist/global-skills/firebase-basics/references/setup/github_copilot.md +104 -0
  245. package/dist/global-skills/firebase-basics/references/setup/other_agents.md +99 -0
  246. package/dist/global-skills/firebase-basics/references/web_setup.md +77 -0
  247. package/dist/global-skills/firebase-crashlytics/SKILL.md +42 -0
  248. package/dist/global-skills/firebase-crashlytics/references/android_setup.md +152 -0
  249. package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +115 -0
  250. package/dist/global-skills/firebase-data-connect/SKILL.md +191 -0
  251. package/dist/global-skills/firebase-data-connect/examples.md +638 -0
  252. package/dist/global-skills/firebase-data-connect/reference/cloud_functions.md +184 -0
  253. package/dist/global-skills/firebase-data-connect/reference/config.md +271 -0
  254. package/dist/global-skills/firebase-data-connect/reference/data_seeding.md +185 -0
  255. package/dist/global-skills/firebase-data-connect/reference/native_sql.md +170 -0
  256. package/dist/global-skills/firebase-data-connect/reference/operations.md +385 -0
  257. package/dist/global-skills/firebase-data-connect/reference/realtime.md +210 -0
  258. package/dist/global-skills/firebase-data-connect/reference/schema.md +290 -0
  259. package/dist/global-skills/firebase-data-connect/reference/sdk_admin_node.md +141 -0
  260. package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +126 -0
  261. package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +134 -0
  262. package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +157 -0
  263. package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +146 -0
  264. package/dist/global-skills/firebase-data-connect/reference/search.md +264 -0
  265. package/dist/global-skills/firebase-data-connect/reference/security.md +295 -0
  266. package/dist/global-skills/firebase-data-connect/templates.md +318 -0
  267. package/dist/global-skills/firebase-firestore/SKILL.md +89 -0
  268. package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +230 -0
  269. package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +66 -0
  270. package/dist/global-skills/firebase-firestore/references/enterprise/flutter_setup.md +180 -0
  271. package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +135 -0
  272. package/dist/global-skills/firebase-firestore/references/enterprise/ios_setup.md +189 -0
  273. package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +118 -0
  274. package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +138 -0
  275. package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +577 -0
  276. package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +127 -0
  277. package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +193 -0
  278. package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +176 -0
  279. package/dist/global-skills/firebase-firestore/references/standard/indexes.md +113 -0
  280. package/dist/global-skills/firebase-firestore/references/standard/ios_setup.md +174 -0
  281. package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +110 -0
  282. package/dist/global-skills/firebase-firestore/references/standard/security_rules.md +577 -0
  283. package/dist/global-skills/firebase-firestore/references/standard/web_sdk_usage.md +192 -0
  284. package/dist/global-skills/firebase-hosting-basics/SKILL.md +64 -0
  285. package/dist/global-skills/firebase-hosting-basics/references/configuration.md +115 -0
  286. package/dist/global-skills/firebase-hosting-basics/references/deploying.md +48 -0
  287. package/dist/global-skills/firebase-remote-config-basics/SKILL.md +124 -0
  288. package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +91 -0
  289. package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +89 -0
  290. package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +70 -0
  291. package/dist/global-skills/go-live/SKILL.md +90 -0
  292. package/dist/global-skills/harden/SKILL.md +101 -0
  293. package/dist/global-skills/instrument-feature-flags/SKILL.md +88 -0
  294. package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +3578 -0
  295. package/dist/global-skills/instrument-feature-flags/references/android.md +146 -0
  296. package/dist/global-skills/instrument-feature-flags/references/api.md +194 -0
  297. package/dist/global-skills/instrument-feature-flags/references/best-practices.md +231 -0
  298. package/dist/global-skills/instrument-feature-flags/references/django.md +263 -0
  299. package/dist/global-skills/instrument-feature-flags/references/dotnet.md +763 -0
  300. package/dist/global-skills/instrument-feature-flags/references/elixir.md +47 -0
  301. package/dist/global-skills/instrument-feature-flags/references/flask.md +131 -0
  302. package/dist/global-skills/instrument-feature-flags/references/flutter.md +212 -0
  303. package/dist/global-skills/instrument-feature-flags/references/go.md +208 -0
  304. package/dist/global-skills/instrument-feature-flags/references/ios.md +146 -0
  305. package/dist/global-skills/instrument-feature-flags/references/java.md +94 -0
  306. package/dist/global-skills/instrument-feature-flags/references/laravel.md +170 -0
  307. package/dist/global-skills/instrument-feature-flags/references/next-js.md +383 -0
  308. package/dist/global-skills/instrument-feature-flags/references/nodejs.md +216 -0
  309. package/dist/global-skills/instrument-feature-flags/references/php.md +187 -0
  310. package/dist/global-skills/instrument-feature-flags/references/python.md +191 -0
  311. package/dist/global-skills/instrument-feature-flags/references/react-native.md +166 -0
  312. package/dist/global-skills/instrument-feature-flags/references/react.md +302 -0
  313. package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +604 -0
  314. package/dist/global-skills/instrument-feature-flags/references/ruby.md +200 -0
  315. package/dist/global-skills/instrument-feature-flags/references/rust.md +222 -0
  316. package/dist/global-skills/instrument-feature-flags/references/usage.md +600 -0
  317. package/dist/global-skills/instrument-feature-flags/references/web.md +193 -0
  318. package/dist/global-skills/instrument-product-analytics/SKILL.md +139 -0
  319. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-android.md +1639 -0
  320. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-angular.md +944 -0
  321. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +1001 -0
  322. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +1004 -0
  323. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +720 -0
  324. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +810 -0
  325. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-django.md +1167 -0
  326. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-expo.md +1412 -0
  327. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-fastapi.md +1585 -0
  328. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-flask.md +1208 -0
  329. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-laravel.md +2267 -0
  330. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-app-router.md +712 -0
  331. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-pages-router.md +767 -0
  332. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-3-6.md +939 -0
  333. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-4.md +1078 -0
  334. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-php.md +527 -0
  335. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-python.md +481 -0
  336. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-native.md +1823 -0
  337. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-6.md +582 -0
  338. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-data.md +892 -0
  339. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-declarative.md +649 -0
  340. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-framework.md +1218 -0
  341. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-code-based.md +793 -0
  342. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-file-based.md +780 -0
  343. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +1320 -0
  344. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby.md +452 -0
  345. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-sveltekit.md +854 -0
  346. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-swift.md +665 -0
  347. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-tanstack-start.md +1199 -0
  348. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-vue-3.md +910 -0
  349. package/dist/global-skills/instrument-product-analytics/references/android.md +811 -0
  350. package/dist/global-skills/instrument-product-analytics/references/angular.md +376 -0
  351. package/dist/global-skills/instrument-product-analytics/references/astro.md +165 -0
  352. package/dist/global-skills/instrument-product-analytics/references/configuration.md +299 -0
  353. package/dist/global-skills/instrument-product-analytics/references/django.md +263 -0
  354. package/dist/global-skills/instrument-product-analytics/references/dotnet.md +763 -0
  355. package/dist/global-skills/instrument-product-analytics/references/elixir.md +414 -0
  356. package/dist/global-skills/instrument-product-analytics/references/flask.md +131 -0
  357. package/dist/global-skills/instrument-product-analytics/references/flutter.md +845 -0
  358. package/dist/global-skills/instrument-product-analytics/references/go.md +567 -0
  359. package/dist/global-skills/instrument-product-analytics/references/identify-users.md +272 -0
  360. package/dist/global-skills/instrument-product-analytics/references/ios.md +154 -0
  361. package/dist/global-skills/instrument-product-analytics/references/laravel.md +170 -0
  362. package/dist/global-skills/instrument-product-analytics/references/next-js.md +383 -0
  363. package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +244 -0
  364. package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +253 -0
  365. package/dist/global-skills/instrument-product-analytics/references/php.md +646 -0
  366. package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +1675 -0
  367. package/dist/global-skills/instrument-product-analytics/references/python.md +898 -0
  368. package/dist/global-skills/instrument-product-analytics/references/react-native.md +1338 -0
  369. package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +376 -0
  370. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +364 -0
  371. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +376 -0
  372. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +479 -0
  373. package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +604 -0
  374. package/dist/global-skills/instrument-product-analytics/references/ruby.md +759 -0
  375. package/dist/global-skills/instrument-product-analytics/references/svelte.md +234 -0
  376. package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +193 -0
  377. package/dist/global-skills/instrument-product-analytics/references/usage.md +600 -0
  378. package/dist/global-skills/instrument-product-analytics/references/vue-js.md +306 -0
  379. package/dist/global-skills/manifest.json +125 -0
  380. package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +284 -0
  381. package/dist/global-skills/mongodb-atlas-stream-processing/references/connection-configs.md +298 -0
  382. package/dist/global-skills/mongodb-atlas-stream-processing/references/development-workflow.md +304 -0
  383. package/dist/global-skills/mongodb-atlas-stream-processing/references/mcp-troubleshooting.md +55 -0
  384. package/dist/global-skills/mongodb-atlas-stream-processing/references/output-diagnostics.md +150 -0
  385. package/dist/global-skills/mongodb-atlas-stream-processing/references/pipeline-patterns.md +457 -0
  386. package/dist/global-skills/mongodb-atlas-stream-processing/references/sizing-and-parallelism.md +178 -0
  387. package/dist/global-skills/mongodb-connection/SKILL.md +201 -0
  388. package/dist/global-skills/mongodb-connection/references/monitoring-guide.md +191 -0
  389. package/dist/global-skills/mongodb-mcp-setup/SKILL.md +324 -0
  390. package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +195 -0
  391. package/dist/global-skills/mongodb-query-optimizer/SKILL.md +150 -0
  392. package/dist/global-skills/mongodb-query-optimizer/references/aggregation-optimization.md +210 -0
  393. package/dist/global-skills/mongodb-query-optimizer/references/antipattern-examples.md +74 -0
  394. package/dist/global-skills/mongodb-query-optimizer/references/core-indexing-principles.md +134 -0
  395. package/dist/global-skills/mongodb-query-optimizer/references/update-query-examples.md +39 -0
  396. package/dist/global-skills/mongodb-schema-design/SKILL.md +181 -0
  397. package/dist/global-skills/mongodb-schema-design/references/antipattern-excessive-lookups.md +84 -0
  398. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md +91 -0
  399. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md +95 -0
  400. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-model.md +91 -0
  401. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-size.md +226 -0
  402. package/dist/global-skills/mongodb-schema-design/references/fundamental-embed-vs-reference.md +418 -0
  403. package/dist/global-skills/mongodb-schema-design/references/fundamental-schema-validation.md +131 -0
  404. package/dist/global-skills/mongodb-schema-design/references/pattern-approximation.md +80 -0
  405. package/dist/global-skills/mongodb-schema-design/references/pattern-archive.md +143 -0
  406. package/dist/global-skills/mongodb-schema-design/references/pattern-attribute.md +77 -0
  407. package/dist/global-skills/mongodb-schema-design/references/pattern-bucket.md +102 -0
  408. package/dist/global-skills/mongodb-schema-design/references/pattern-computed.md +162 -0
  409. package/dist/global-skills/mongodb-schema-design/references/pattern-document-versioning.md +166 -0
  410. package/dist/global-skills/mongodb-schema-design/references/pattern-extended-reference.md +72 -0
  411. package/dist/global-skills/mongodb-schema-design/references/pattern-outlier.md +159 -0
  412. package/dist/global-skills/mongodb-schema-design/references/pattern-polymorphic.md +167 -0
  413. package/dist/global-skills/mongodb-schema-design/references/pattern-schema-versioning.md +273 -0
  414. package/dist/global-skills/mongodb-schema-design/references/pattern-time-series-collections.md +190 -0
  415. package/dist/global-skills/mongodb-schema-design/references/source-query-stats.md +123 -0
  416. package/dist/global-skills/mongodb-schema-design/references/source-slow-query-logs.md +63 -0
  417. package/dist/global-skills/mongodb-search-and-ai/SKILL.md +142 -0
  418. package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +697 -0
  419. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-indexing.md +584 -0
  420. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-querying.md +636 -0
  421. package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +746 -0
  422. package/dist/global-skills/native-data-fetching/SKILL.md +505 -0
  423. package/dist/global-skills/native-data-fetching/agents/openai.yaml +4 -0
  424. package/dist/global-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
  425. package/dist/global-skills/neon/SKILL.md +343 -0
  426. package/dist/global-skills/neon-ai-gateway/SKILL.md +236 -0
  427. package/dist/global-skills/neon-functions/SKILL.md +490 -0
  428. package/dist/global-skills/neon-functions/references/ai-sdk.md +139 -0
  429. package/dist/global-skills/neon-functions/references/hono-websockets.md +145 -0
  430. package/dist/global-skills/neon-functions/references/mastra-studio.md +127 -0
  431. package/dist/global-skills/neon-functions/references/mcp.md +137 -0
  432. package/dist/global-skills/neon-functions/references/sentry.md +131 -0
  433. package/dist/global-skills/neon-functions/references/sse.md +143 -0
  434. package/dist/global-skills/neon-object-storage/SKILL.md +197 -0
  435. package/dist/global-skills/neon-postgres/SKILL.md +376 -0
  436. package/dist/global-skills/neon-postgres-branches/SKILL.md +281 -0
  437. package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +247 -0
  438. package/dist/global-skills/onboarding/SKILL.md +101 -0
  439. package/dist/global-skills/plan-my-idea/SKILL.md +67 -0
  440. package/dist/global-skills/publish-app/SKILL.md +72 -0
  441. package/dist/global-skills/publish-extension/SKILL.md +47 -0
  442. package/dist/global-skills/resend/SKILL.md +294 -0
  443. package/dist/global-skills/resend/references/api-keys.md +98 -0
  444. package/dist/global-skills/resend/references/automations.md +228 -0
  445. package/dist/global-skills/resend/references/broadcasts.md +125 -0
  446. package/dist/global-skills/resend/references/contact-properties.md +111 -0
  447. package/dist/global-skills/resend/references/contacts.md +174 -0
  448. package/dist/global-skills/resend/references/domains.md +179 -0
  449. package/dist/global-skills/resend/references/events.md +119 -0
  450. package/dist/global-skills/resend/references/fetch-all-templates.mjs +37 -0
  451. package/dist/global-skills/resend/references/installation.md +142 -0
  452. package/dist/global-skills/resend/references/logs.md +161 -0
  453. package/dist/global-skills/resend/references/receiving.md +287 -0
  454. package/dist/global-skills/resend/references/segments.md +77 -0
  455. package/dist/global-skills/resend/references/sending/batch-email-examples.md +807 -0
  456. package/dist/global-skills/resend/references/sending/best-practices.md +453 -0
  457. package/dist/global-skills/resend/references/sending/email-management.md +135 -0
  458. package/dist/global-skills/resend/references/sending/overview.md +209 -0
  459. package/dist/global-skills/resend/references/sending/single-email-examples.md +470 -0
  460. package/dist/global-skills/resend/references/templates.md +202 -0
  461. package/dist/global-skills/resend/references/topics.md +104 -0
  462. package/dist/global-skills/resend/references/webhooks.md +317 -0
  463. package/dist/global-skills/reset-password/SKILL.md +59 -0
  464. package/dist/global-skills/save-data/SKILL.md +70 -0
  465. package/dist/global-skills/sentry-sdk-setup/SKILL.md +116 -0
  466. package/dist/global-skills/sentry-workflow/SKILL.md +32 -0
  467. package/dist/global-skills/setup-email/SKILL.md +69 -0
  468. package/dist/global-skills/setup-payments/SKILL.md +82 -0
  469. package/dist/global-skills/setup-sms/SKILL.md +51 -0
  470. package/dist/global-skills/sign-in-with-email-link/SKILL.md +53 -0
  471. package/dist/global-skills/sign-in-with-google/SKILL.md +68 -0
  472. package/dist/global-skills/sign-in-with-phone/SKILL.md +53 -0
  473. package/dist/global-skills/stripe-best-practices/SKILL.md +48 -0
  474. package/dist/global-skills/stripe-best-practices/references/billing.md +58 -0
  475. package/dist/global-skills/stripe-best-practices/references/connect.md +173 -0
  476. package/dist/global-skills/stripe-best-practices/references/payments.md +79 -0
  477. package/dist/global-skills/stripe-best-practices/references/security.md +109 -0
  478. package/dist/global-skills/stripe-best-practices/references/tax.md +37 -0
  479. package/dist/global-skills/stripe-best-practices/references/treasury.md +16 -0
  480. package/dist/global-skills/supabase/CHANGELOG.md +53 -0
  481. package/dist/global-skills/supabase/SKILL.md +145 -0
  482. package/dist/global-skills/supabase/assets/feedback-issue-template.md +17 -0
  483. package/dist/global-skills/supabase/references/skill-feedback.md +17 -0
  484. package/dist/global-skills/supabase-postgres-best-practices/CHANGELOG.md +43 -0
  485. package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +64 -0
  486. package/dist/global-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  487. package/dist/global-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  488. package/dist/global-skills/supabase-postgres-best-practices/references/_template.md +34 -0
  489. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  490. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  491. package/dist/global-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  492. package/dist/global-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  493. package/dist/global-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  494. package/dist/global-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  495. package/dist/global-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  496. package/dist/global-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  497. package/dist/global-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  498. package/dist/global-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  499. package/dist/global-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  500. package/dist/global-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  501. package/dist/global-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  502. package/dist/global-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  503. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  504. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  505. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  506. package/dist/global-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  507. package/dist/global-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  508. package/dist/global-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  509. package/dist/global-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  510. package/dist/global-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  511. package/dist/global-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  512. package/dist/global-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  513. package/dist/global-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  514. package/dist/global-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  515. package/dist/global-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  516. package/dist/global-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  517. package/dist/global-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  518. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  519. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  520. package/dist/global-skills/track-errors/SKILL.md +67 -0
  521. package/dist/global-skills/update-kit/SKILL.md +75 -0
  522. package/dist/global-skills/upgrading-expo/SKILL.md +134 -0
  523. package/dist/global-skills/upgrading-expo/agents/openai.yaml +4 -0
  524. package/dist/global-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
  525. package/dist/global-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
  526. package/dist/global-skills/upgrading-expo/references/native-tabs.md +124 -0
  527. package/dist/global-skills/upgrading-expo/references/new-architecture.md +79 -0
  528. package/dist/global-skills/upgrading-expo/references/react-19.md +79 -0
  529. package/dist/global-skills/upgrading-expo/references/react-compiler.md +59 -0
  530. package/dist/global-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
  531. package/dist/global-skills/use-dom/SKILL.md +417 -0
  532. package/dist/global-skills/use-dom/agents/openai.yaml +4 -0
  533. package/dist/global-skills/use-kit-mcp/SKILL.md +100 -0
  534. package/dist/global-skills/use-railway/SKILL.md +357 -0
  535. package/dist/global-skills/use-railway/references/analyze-db-mongo.md +84 -0
  536. package/dist/global-skills/use-railway/references/analyze-db-mysql.md +254 -0
  537. package/dist/global-skills/use-railway/references/analyze-db-postgres.md +479 -0
  538. package/dist/global-skills/use-railway/references/analyze-db-redis.md +208 -0
  539. package/dist/global-skills/use-railway/references/analyze-db.md +344 -0
  540. package/dist/global-skills/use-railway/references/configure.md +359 -0
  541. package/dist/global-skills/use-railway/references/deploy.md +225 -0
  542. package/dist/global-skills/use-railway/references/feature-flags.md +89 -0
  543. package/dist/global-skills/use-railway/references/iac.md +108 -0
  544. package/dist/global-skills/use-railway/references/operate.md +273 -0
  545. package/dist/global-skills/use-railway/references/request.md +262 -0
  546. package/dist/global-skills/use-railway/references/sandbox.md +167 -0
  547. package/dist/global-skills/use-railway/references/setup.md +364 -0
  548. package/dist/global-skills/use-railway/scripts/analyze-mongo.py +1549 -0
  549. package/dist/global-skills/use-railway/scripts/analyze-mysql.py +1195 -0
  550. package/dist/global-skills/use-railway/scripts/analyze-postgres.py +3058 -0
  551. package/dist/global-skills/use-railway/scripts/analyze-redis.py +1090 -0
  552. package/dist/global-skills/use-railway/scripts/dal.py +671 -0
  553. package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +170 -0
  554. package/dist/global-skills/use-railway/scripts/pg-extensions.py +370 -0
  555. package/dist/global-skills/use-railway/scripts/railway-api.sh +52 -0
  556. package/dist/global-skills/vercel-composition-patterns/AGENTS.md +946 -0
  557. package/dist/global-skills/vercel-composition-patterns/README.md +60 -0
  558. package/dist/global-skills/vercel-composition-patterns/SKILL.md +89 -0
  559. package/dist/global-skills/vercel-composition-patterns/metadata.json +11 -0
  560. package/dist/global-skills/vercel-composition-patterns/rules/_sections.md +29 -0
  561. package/dist/global-skills/vercel-composition-patterns/rules/_template.md +24 -0
  562. package/dist/global-skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  563. package/dist/global-skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  564. package/dist/global-skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  565. package/dist/global-skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  566. package/dist/global-skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  567. package/dist/global-skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  568. package/dist/global-skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  569. package/dist/global-skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  570. package/dist/global-skills/vercel-react-best-practices/AGENTS.md +3810 -0
  571. package/dist/global-skills/vercel-react-best-practices/README.md +123 -0
  572. package/dist/global-skills/vercel-react-best-practices/SKILL.md +149 -0
  573. package/dist/global-skills/vercel-react-best-practices/metadata.json +15 -0
  574. package/dist/global-skills/vercel-react-best-practices/rules/_sections.md +46 -0
  575. package/dist/global-skills/vercel-react-best-practices/rules/_template.md +28 -0
  576. package/dist/global-skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  577. package/dist/global-skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  578. package/dist/global-skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  579. package/dist/global-skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  580. package/dist/global-skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  581. package/dist/global-skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  582. package/dist/global-skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  583. package/dist/global-skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  584. package/dist/global-skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  585. package/dist/global-skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  586. package/dist/global-skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  587. package/dist/global-skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  588. package/dist/global-skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  589. package/dist/global-skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  590. package/dist/global-skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  591. package/dist/global-skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  592. package/dist/global-skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  593. package/dist/global-skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  594. package/dist/global-skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  595. package/dist/global-skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  596. package/dist/global-skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  597. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  598. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  599. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  600. package/dist/global-skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  601. package/dist/global-skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  602. package/dist/global-skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  603. package/dist/global-skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  604. package/dist/global-skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  605. package/dist/global-skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  606. package/dist/global-skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  607. package/dist/global-skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  608. package/dist/global-skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  609. package/dist/global-skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  610. package/dist/global-skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  611. package/dist/global-skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  612. package/dist/global-skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  613. package/dist/global-skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  614. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  615. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  616. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  617. package/dist/global-skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  618. package/dist/global-skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  619. package/dist/global-skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  620. package/dist/global-skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  621. package/dist/global-skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  622. package/dist/global-skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  623. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  624. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  625. package/dist/global-skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  626. package/dist/global-skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  627. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  628. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  629. package/dist/global-skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  630. package/dist/global-skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  631. package/dist/global-skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  632. package/dist/global-skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  633. package/dist/global-skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  634. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  635. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  636. package/dist/global-skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  637. package/dist/global-skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  638. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  639. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  640. package/dist/global-skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  641. package/dist/global-skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  642. package/dist/global-skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  643. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  644. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  645. package/dist/global-skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  646. package/dist/global-skills/web-to-native/SKILL.md +83 -0
  647. package/dist/global-skills/web-to-native/references/false-friends.md +119 -0
  648. package/dist/global-skills/web-to-native/references/native-patterns.md +39 -0
  649. package/dist/global-skills/web-to-native/references/run-as-goal.md +48 -0
  650. package/dist/global-skills/web-to-native/references/verify-on-device.md +45 -0
  651. package/dist/global-skills/wire-auth/SKILL.md +28 -0
  652. package/dist/global-skills/wire-database/SKILL.md +28 -0
  653. package/dist/global-skills/wire-email/SKILL.md +27 -0
  654. package/dist/global-skills/wire-payments/SKILL.md +27 -0
  655. package/dist/global-skills/workers-best-practices/SKILL.md +127 -0
  656. package/dist/global-skills/workers-best-practices/references/review.md +174 -0
  657. package/dist/global-skills/workers-best-practices/references/rules.md +463 -0
  658. package/dist/global-skills/wrangler/SKILL.md +922 -0
  659. package/dist/global-skills/xcode-project-setup/SKILL.md +140 -0
  660. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.resolved +41 -0
  661. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.swift +17 -0
  662. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +232 -0
  663. package/package.json +21 -20
  664. package/LICENSE.md +0 -47
  665. package/dist/index.js +0 -21593
@@ -0,0 +1,1208 @@
1
+ # PostHog flask Example Project
2
+
3
+ Repository: https://github.com/PostHog/context-mill
4
+ Path: example-apps/flask
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # PostHog Flask Example
11
+
12
+ A Flask application demonstrating PostHog integration for analytics, feature flags, and error tracking.
13
+
14
+ ## Features
15
+
16
+ - User registration and authentication with Flask-Login
17
+ - SQLite database persistence with Flask-SQLAlchemy
18
+ - User identification and property tracking
19
+ - Custom event tracking
20
+ - Feature flags with payload support
21
+ - Error tracking with manual exception capture
22
+
23
+ ## Quick Start
24
+
25
+ 1. Create and activate a virtual environment:
26
+ ```bash
27
+ python -m venv venv
28
+ source venv/bin/activate # On Windows: venv\Scripts\activate
29
+ ```
30
+
31
+ 2. Install dependencies:
32
+ ```bash
33
+ pip install -r requirements.txt
34
+ ```
35
+
36
+ 3. Copy the environment file and configure:
37
+ ```bash
38
+ cp .env.example .env
39
+ # Edit .env with your PostHog project key
40
+ ```
41
+
42
+ 4. Run the application:
43
+ ```bash
44
+ python run.py
45
+ ```
46
+
47
+ 5. Open http://localhost:5001 and either:
48
+ - Login with default credentials: `admin@example.com` / `admin`
49
+ - Or click "Sign up here" to create a new account
50
+
51
+ ## PostHog Integration Points
52
+
53
+ ### User Registration
54
+ New users are identified and tracked on signup using the context-based API:
55
+ ```python
56
+ with new_context():
57
+ identify_context(user.email)
58
+ tag('email', user.email)
59
+ tag('is_staff', user.is_staff)
60
+ capture('user_signed_up', properties={'signup_method': 'form'})
61
+ ```
62
+
63
+ ### User Identification
64
+ Users are identified on login with their properties:
65
+ ```python
66
+ with new_context():
67
+ identify_context(user.email)
68
+ tag('email', user.email)
69
+ tag('is_staff', user.is_staff)
70
+ capture('user_logged_in', properties={'login_method': 'password'})
71
+ ```
72
+
73
+ ### Event Tracking
74
+ Custom events are captured throughout the app:
75
+ ```python
76
+ with new_context():
77
+ identify_context(current_user.email)
78
+ capture('burrito_considered', properties={'total_considerations': count})
79
+ ```
80
+
81
+ ### Feature Flags
82
+ The dashboard demonstrates feature flag checking:
83
+ ```python
84
+ show_new_feature = posthog.feature_enabled(
85
+ 'new-dashboard-feature',
86
+ current_user.email,
87
+ person_properties={'email': current_user.email, 'is_staff': current_user.is_staff}
88
+ )
89
+ feature_config = posthog.get_feature_flag_payload('new-dashboard-feature', current_user.email)
90
+ ```
91
+
92
+ ### Error Tracking
93
+
94
+ The example demonstrates two approaches to error tracking:
95
+
96
+ Manual capture for specific critical operations** (`app/api/routes.py`).
97
+
98
+ ```python
99
+ try:
100
+ # Critical operation that might fail
101
+ result = process_payment()
102
+ except Exception as e:
103
+ # Manually capture this specific exception
104
+ with new_context():
105
+ identify_context(current_user.email)
106
+ event_id = posthog.capture_exception(e)
107
+
108
+ return jsonify({
109
+ "error": "Operation failed",
110
+ "error_id": event_id,
111
+ "message": f"Error captured in PostHog. Reference ID: {event_id}"
112
+ }), 500
113
+ ```
114
+
115
+ The `/api/test-error` endpoint demonstrates manual exception capture. Use `?capture=true` to capture in PostHog, or `?capture=false` to skip tracking.
116
+
117
+ ## Project Structure
118
+
119
+ ```
120
+ basics/flask/
121
+ ├── app/
122
+ │ ├── __init__.py # Application factory
123
+ │ ├── config.py # Configuration classes
124
+ │ ├── extensions.py # Extension instances
125
+ │ ├── models.py # User model (SQLAlchemy)
126
+ │ ├── main/
127
+ │ │ ├── __init__.py # Main blueprint
128
+ │ │ └── routes.py # View functions
129
+ │ ├── templates/ # HTML templates
130
+ │ └── api/
131
+ │ ├── __init__.py # API blueprint
132
+ │ └── routes.py # API endpoints
133
+ ├── .env.example
134
+ ├── .gitignore
135
+ ├── requirements.txt
136
+ ├── README.md
137
+ └── run.py # Entry point
138
+ ```
139
+
140
+ ---
141
+
142
+ ## .env.example
143
+
144
+ ```example
145
+ POSTHOG_PROJECT_TOKEN=<ph_project_token>
146
+ POSTHOG_HOST=https://us.i.posthog.com
147
+ FLASK_SECRET_KEY=your-secret-key-here
148
+ FLASK_DEBUG=True
149
+ POSTHOG_DISABLED=False
150
+
151
+ ```
152
+
153
+ ---
154
+
155
+ ## app/__init__.py
156
+
157
+ ```py
158
+ """Flask application factory."""
159
+
160
+ import posthog
161
+ from flask import Flask, g, jsonify, render_template, request
162
+ from flask_login import current_user
163
+ from posthog import identify_context, new_context
164
+ from werkzeug.exceptions import HTTPException
165
+
166
+ from app.config import config
167
+ from app.extensions import db, login_manager
168
+
169
+
170
+ def create_app(config_name="default"):
171
+ """Application factory."""
172
+ app = Flask(__name__)
173
+ app.config.from_object(config[config_name])
174
+
175
+ # Initialize extensions
176
+ db.init_app(app)
177
+ login_manager.init_app(app)
178
+
179
+ # Initialize PostHog
180
+ if not app.config["POSTHOG_DISABLED"]:
181
+ posthog.api_key = app.config["POSTHOG_PROJECT_TOKEN"]
182
+ posthog.host = app.config["POSTHOG_HOST"]
183
+ posthog.debug = app.config["DEBUG"]
184
+
185
+ # Import models after db is initialized
186
+ from app.models import User
187
+
188
+ # User loader for Flask-Login
189
+ @login_manager.user_loader
190
+ def load_user(user_id):
191
+ return User.get_by_id(user_id)
192
+
193
+ # Simple error handlers - no automatic PostHog capture
194
+ # Capture exceptions manually only where it makes sense (e.g., test endpoints)
195
+ @app.errorhandler(404)
196
+ def page_not_found(e):
197
+ if request.path.startswith('/api/'):
198
+ return jsonify({"error": "Not found"}), 404
199
+ return render_template('errors/404.html'), 404
200
+
201
+ @app.errorhandler(500)
202
+ def internal_server_error(e):
203
+ if request.path.startswith('/api/'):
204
+ return jsonify({"error": "Internal server error"}), 500
205
+ return render_template('errors/500.html'), 500
206
+
207
+ # Register blueprints
208
+ from app.api import api_bp
209
+ from app.main import main_bp
210
+
211
+ app.register_blueprint(main_bp)
212
+ app.register_blueprint(api_bp, url_prefix="/api")
213
+
214
+ # Create database tables and seed default admin user
215
+ with app.app_context():
216
+ db.create_all()
217
+ if not User.get_by_email("admin@example.com"):
218
+ User.create_user(
219
+ email="admin@example.com",
220
+ password="admin",
221
+ is_staff=True,
222
+ )
223
+
224
+ return app
225
+
226
+ ```
227
+
228
+ ---
229
+
230
+ ## app/api/__init__.py
231
+
232
+ ```py
233
+ """API blueprint registration."""
234
+
235
+ from flask import Blueprint
236
+
237
+ api_bp = Blueprint("api", __name__)
238
+
239
+ from app.api import routes # noqa: E402, F401
240
+
241
+ ```
242
+
243
+ ---
244
+
245
+ ## app/api/routes.py
246
+
247
+ ```py
248
+ """API endpoints demonstrating PostHog integration patterns."""
249
+
250
+ import posthog
251
+ from flask import jsonify, request, session
252
+ from flask_login import current_user, login_required
253
+ from posthog import capture, identify_context, new_context
254
+
255
+ from app.api import api_bp
256
+
257
+
258
+ @api_bp.route("/burrito/consider", methods=["POST"])
259
+ @login_required
260
+ def consider_burrito():
261
+ """Track burrito consideration event."""
262
+ # Increment session counter
263
+ burrito_count = session.get("burrito_count", 0) + 1
264
+ session["burrito_count"] = burrito_count
265
+
266
+ # PostHog: Capture custom event
267
+ with new_context():
268
+ identify_context(current_user.email)
269
+ capture("burrito_considered", properties={"total_considerations": burrito_count})
270
+
271
+ return jsonify({"success": True, "count": burrito_count})
272
+
273
+
274
+ @api_bp.route("/test-error", methods=["POST"])
275
+ @login_required
276
+ def test_error():
277
+ """Test endpoint demonstrating manual exception capture in PostHog.
278
+
279
+ Shows how to intentionally capture specific errors in PostHog.
280
+ Use this pattern for critical operations where you want error tracking.
281
+
282
+ Query params:
283
+ - capture: "true" to capture the exception in PostHog, "false" to just raise it
284
+ """
285
+ should_capture = request.args.get("capture", "true").lower() == "true"
286
+
287
+ try:
288
+ # Simulate a critical operation failure
289
+ raise Exception("Test exception from critical operation")
290
+ except Exception as e:
291
+ if should_capture:
292
+ # Manually capture this specific exception in PostHog
293
+ with new_context():
294
+ identify_context(current_user.email)
295
+ event_id = posthog.capture_exception(e)
296
+
297
+ return jsonify({
298
+ "error": "Operation failed",
299
+ "error_id": event_id,
300
+ "message": f"Error captured in PostHog. Reference ID: {event_id}"
301
+ }), 500
302
+ else:
303
+ # Just return error without PostHog capture
304
+ return jsonify({"error": str(e)}), 500
305
+
306
+
307
+
308
+ ```
309
+
310
+ ---
311
+
312
+ ## app/config.py
313
+
314
+ ```py
315
+ """Flask application configuration."""
316
+
317
+ import os
318
+ from dotenv import load_dotenv
319
+
320
+ load_dotenv()
321
+
322
+
323
+ class Config:
324
+ """Base configuration."""
325
+
326
+ SECRET_KEY = os.environ.get("FLASK_SECRET_KEY", "dev-secret-key-change-in-production")
327
+
328
+ # Database configuration (SQLite like Django example)
329
+ SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///db.sqlite3")
330
+ SQLALCHEMY_TRACK_MODIFICATIONS = False
331
+
332
+ # PostHog configuration
333
+ POSTHOG_PROJECT_TOKEN = os.environ.get("POSTHOG_PROJECT_TOKEN", "<ph_project_token>")
334
+ POSTHOG_HOST = os.environ.get("POSTHOG_HOST", "https://us.i.posthog.com")
335
+ POSTHOG_DISABLED = os.environ.get("POSTHOG_DISABLED", "False").lower() == "true"
336
+
337
+
338
+ class DevelopmentConfig(Config):
339
+ """Development configuration."""
340
+
341
+ DEBUG = True
342
+
343
+
344
+ class ProductionConfig(Config):
345
+ """Production configuration."""
346
+
347
+ DEBUG = False
348
+
349
+
350
+ config = {
351
+ "development": DevelopmentConfig,
352
+ "production": ProductionConfig,
353
+ "default": DevelopmentConfig,
354
+ }
355
+
356
+ ```
357
+
358
+ ---
359
+
360
+ ## app/extensions.py
361
+
362
+ ```py
363
+ """Flask extensions initialized without binding to app."""
364
+
365
+ from flask_login import LoginManager
366
+ from flask_sqlalchemy import SQLAlchemy
367
+
368
+ db = SQLAlchemy()
369
+
370
+ login_manager = LoginManager()
371
+ login_manager.login_view = "main.home"
372
+ login_manager.login_message = "Please log in to access this page."
373
+
374
+ ```
375
+
376
+ ---
377
+
378
+ ## app/main/__init__.py
379
+
380
+ ```py
381
+ """Main blueprint registration."""
382
+
383
+ from flask import Blueprint
384
+
385
+ main_bp = Blueprint("main", __name__, template_folder="../templates")
386
+
387
+ from app.main import routes # noqa: E402, F401
388
+
389
+ ```
390
+
391
+ ---
392
+
393
+ ## app/main/routes.py
394
+
395
+ ```py
396
+ """Core view functions demonstrating PostHog integration patterns."""
397
+
398
+ import posthog
399
+ from flask import flash, redirect, render_template, request, session, url_for
400
+ from flask_login import current_user, login_required, login_user, logout_user
401
+ from posthog import capture, identify_context, new_context, tag
402
+
403
+ from app.main import main_bp
404
+ from app.models import User
405
+
406
+
407
+ @main_bp.route("/", methods=["GET", "POST"])
408
+ def home():
409
+ """Home/login page."""
410
+ if current_user.is_authenticated:
411
+ return redirect(url_for("main.dashboard"))
412
+
413
+ if request.method == "POST":
414
+ email = request.form.get("email")
415
+ password = request.form.get("password")
416
+
417
+ user = User.authenticate(email, password)
418
+ if user:
419
+ login_user(user)
420
+
421
+ # PostHog: Identify user and capture login event
422
+ with new_context():
423
+ identify_context(user.email)
424
+
425
+ # Set person properties (PII goes in tag, not capture)
426
+ tag("email", user.email)
427
+ tag("is_staff", user.is_staff)
428
+ tag("date_joined", user.date_joined.isoformat())
429
+
430
+ capture("user_logged_in", properties={"login_method": "password"})
431
+
432
+ return redirect(url_for("main.dashboard"))
433
+ else:
434
+ flash("Invalid email or password", "error")
435
+
436
+ return render_template("home.html")
437
+
438
+
439
+ @main_bp.route("/signup", methods=["GET", "POST"])
440
+ def signup():
441
+ """User registration page."""
442
+ if current_user.is_authenticated:
443
+ return redirect(url_for("main.dashboard"))
444
+
445
+ if request.method == "POST":
446
+ email = request.form.get("email")
447
+ password = request.form.get("password")
448
+ password_confirm = request.form.get("password_confirm")
449
+
450
+ # Validation
451
+ if not email or not password:
452
+ flash("Email and password are required", "error")
453
+ elif password != password_confirm:
454
+ flash("Passwords do not match", "error")
455
+ elif User.get_by_email(email):
456
+ flash("Email already registered", "error")
457
+ else:
458
+ # Create new user
459
+ user = User.create_user(
460
+ email=email,
461
+ password=password,
462
+ is_staff=False,
463
+ )
464
+
465
+ # PostHog: Identify new user and capture signup event
466
+ with new_context():
467
+ identify_context(user.email)
468
+
469
+ tag("email", user.email)
470
+ tag("is_staff", user.is_staff)
471
+ tag("date_joined", user.date_joined.isoformat())
472
+
473
+ capture("user_signed_up", properties={"signup_method": "form"})
474
+
475
+ # Log the user in
476
+ login_user(user)
477
+ flash("Account created successfully!", "success")
478
+ return redirect(url_for("main.dashboard"))
479
+
480
+ return render_template("signup.html")
481
+
482
+
483
+ @main_bp.route("/logout")
484
+ @login_required
485
+ def logout():
486
+ """Logout and capture event."""
487
+ # PostHog: Capture logout event before session ends
488
+ with new_context():
489
+ identify_context(current_user.email)
490
+ capture("user_logged_out")
491
+
492
+ logout_user()
493
+ return redirect(url_for("main.home"))
494
+
495
+
496
+ @main_bp.route("/dashboard")
497
+ @login_required
498
+ def dashboard():
499
+ """Dashboard with feature flag demonstration."""
500
+ # PostHog: Capture dashboard view
501
+ with new_context():
502
+ identify_context(current_user.email)
503
+ capture("dashboard_viewed", properties={"is_staff": current_user.is_staff})
504
+
505
+ # Check feature flag
506
+ show_new_feature = posthog.feature_enabled(
507
+ "new-dashboard-feature",
508
+ current_user.email,
509
+ person_properties={
510
+ "email": current_user.email,
511
+ "is_staff": current_user.is_staff,
512
+ },
513
+ )
514
+
515
+ # Get feature flag payload
516
+ feature_config = posthog.get_feature_flag_payload(
517
+ "new-dashboard-feature", current_user.email
518
+ )
519
+
520
+ return render_template(
521
+ "dashboard.html",
522
+ show_new_feature=show_new_feature,
523
+ feature_config=feature_config,
524
+ )
525
+
526
+
527
+ @main_bp.route("/burrito")
528
+ @login_required
529
+ def burrito():
530
+ """Burrito consideration tracker page."""
531
+ burrito_count = session.get("burrito_count", 0)
532
+ return render_template("burrito.html", burrito_count=burrito_count)
533
+
534
+
535
+ @main_bp.route("/profile")
536
+ @login_required
537
+ def profile():
538
+ """User profile page."""
539
+ # PostHog: Capture profile view
540
+ with new_context():
541
+ identify_context(current_user.email)
542
+ capture("profile_viewed")
543
+
544
+ return render_template("profile.html")
545
+
546
+ ```
547
+
548
+ ---
549
+
550
+ ## app/models.py
551
+
552
+ ```py
553
+ """User model with SQLite persistence (similar to Django's auth.User)."""
554
+
555
+ from datetime import datetime, timezone
556
+
557
+ from flask_login import UserMixin
558
+ from werkzeug.security import check_password_hash, generate_password_hash
559
+
560
+ from app.extensions import db
561
+
562
+
563
+ class User(UserMixin, db.Model):
564
+ """User model with SQLite persistence."""
565
+
566
+ __tablename__ = "users"
567
+
568
+ id = db.Column(db.Integer, primary_key=True)
569
+ email = db.Column(db.String(254), unique=True, nullable=False)
570
+ password_hash = db.Column(db.String(256), nullable=False)
571
+ is_staff = db.Column(db.Boolean, default=False)
572
+ is_active = db.Column(db.Boolean, default=True)
573
+ date_joined = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
574
+
575
+ def set_password(self, password):
576
+ """Hash and set the user's password."""
577
+ self.password_hash = generate_password_hash(password)
578
+
579
+ def check_password(self, password):
580
+ """Verify the password against the hash."""
581
+ return check_password_hash(self.password_hash, password)
582
+
583
+ @classmethod
584
+ def create_user(cls, email, password, is_staff=False):
585
+ """Create and save a new user."""
586
+ user = cls(email=email, is_staff=is_staff)
587
+ # nosemgrep: python.django.security.audit.unvalidated-password.unvalidated-password
588
+ user.set_password(password)
589
+ db.session.add(user)
590
+ db.session.commit()
591
+ return user
592
+
593
+ @classmethod
594
+ def get_by_id(cls, user_id):
595
+ """Get user by ID."""
596
+ return cls.query.get(int(user_id))
597
+
598
+ @classmethod
599
+ def get_by_email(cls, email):
600
+ """Get user by email."""
601
+ return cls.query.filter_by(email=email).first()
602
+
603
+ @classmethod
604
+ def authenticate(cls, email, password):
605
+ """Authenticate user with email and password."""
606
+ user = cls.get_by_email(email)
607
+ if user and user.check_password(password):
608
+ return user
609
+ return None
610
+
611
+ def __repr__(self):
612
+ return f"<User {self.email}>"
613
+
614
+ ```
615
+
616
+ ---
617
+
618
+ ## app/templates/base.html
619
+
620
+ ```html
621
+ <!DOCTYPE html>
622
+ <html lang="en">
623
+ <head>
624
+ <meta charset="UTF-8">
625
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
626
+ <title>{% block title %}PostHog Flask Example{% endblock %}</title>
627
+ <style>
628
+ * {
629
+ box-sizing: border-box;
630
+ margin: 0;
631
+ padding: 0;
632
+ }
633
+ body {
634
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
635
+ line-height: 1.6;
636
+ background-color: #f5f5f5;
637
+ color: #333;
638
+ }
639
+ .container {
640
+ max-width: 800px;
641
+ margin: 0 auto;
642
+ padding: 20px;
643
+ }
644
+ nav {
645
+ background: #1d4ed8;
646
+ padding: 15px 20px;
647
+ margin-bottom: 30px;
648
+ }
649
+ nav a {
650
+ color: white;
651
+ text-decoration: none;
652
+ margin-right: 20px;
653
+ }
654
+ nav a:hover {
655
+ text-decoration: underline;
656
+ }
657
+ .card {
658
+ background: white;
659
+ border-radius: 8px;
660
+ padding: 20px;
661
+ margin-bottom: 20px;
662
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
663
+ }
664
+ h1, h2, h3 {
665
+ margin-bottom: 15px;
666
+ color: #1d4ed8;
667
+ }
668
+ button, .btn {
669
+ background: #1d4ed8;
670
+ color: white;
671
+ border: none;
672
+ padding: 10px 20px;
673
+ border-radius: 5px;
674
+ cursor: pointer;
675
+ font-size: 14px;
676
+ display: inline-block;
677
+ text-decoration: none;
678
+ }
679
+ button:hover, .btn:hover {
680
+ background: #1e40af;
681
+ }
682
+ button.danger {
683
+ background: #dc2626;
684
+ }
685
+ button.danger:hover {
686
+ background: #b91c1c;
687
+ }
688
+ input {
689
+ width: 100%;
690
+ padding: 10px;
691
+ margin-bottom: 15px;
692
+ border: 1px solid #ddd;
693
+ border-radius: 5px;
694
+ font-size: 14px;
695
+ }
696
+ .messages {
697
+ margin-bottom: 20px;
698
+ }
699
+ .message {
700
+ padding: 10px 15px;
701
+ border-radius: 5px;
702
+ margin-bottom: 10px;
703
+ }
704
+ .message.error {
705
+ background: #fee2e2;
706
+ color: #dc2626;
707
+ }
708
+ .message.success {
709
+ background: #d1fae5;
710
+ color: #059669;
711
+ }
712
+ .feature-flag {
713
+ background: #fef3c7;
714
+ border: 2px dashed #f59e0b;
715
+ padding: 15px;
716
+ border-radius: 8px;
717
+ margin: 20px 0;
718
+ }
719
+ code {
720
+ background: #f3f4f6;
721
+ padding: 2px 6px;
722
+ border-radius: 3px;
723
+ font-family: monospace;
724
+ }
725
+ pre {
726
+ background: #1e293b;
727
+ color: #e2e8f0;
728
+ padding: 16px;
729
+ border-radius: 8px;
730
+ overflow-x: auto;
731
+ font-size: 13px;
732
+ }
733
+ .count {
734
+ font-size: 48px;
735
+ font-weight: bold;
736
+ color: #1d4ed8;
737
+ text-align: center;
738
+ padding: 20px;
739
+ }
740
+ table {
741
+ width: 100%;
742
+ border-collapse: collapse;
743
+ margin: 16px 0;
744
+ }
745
+ th, td {
746
+ padding: 12px;
747
+ text-align: left;
748
+ border-bottom: 1px solid #eee;
749
+ }
750
+ th {
751
+ background: #f8fafc;
752
+ font-weight: 600;
753
+ }
754
+ </style>
755
+ </head>
756
+ <body>
757
+ {% if current_user.is_authenticated %}
758
+ <nav>
759
+ <a href="{{ url_for('main.dashboard') }}">Dashboard</a>
760
+ <a href="{{ url_for('main.burrito') }}">Burrito</a>
761
+ <a href="{{ url_for('main.profile') }}">Profile</a>
762
+ <a href="{{ url_for('main.logout') }}" style="float: right;">Logout ({{ current_user.email }})</a>
763
+ </nav>
764
+ {% endif %}
765
+
766
+ <div class="container">
767
+ {% with messages = get_flashed_messages(with_categories=true) %}
768
+ {% if messages %}
769
+ <div class="messages">
770
+ {% for category, message in messages %}
771
+ <div class="message {{ category }}">{{ message }}</div>
772
+ {% endfor %}
773
+ </div>
774
+ {% endif %}
775
+ {% endwith %}
776
+
777
+ {% block content %}{% endblock %}
778
+ </div>
779
+
780
+ {% block scripts %}{% endblock %}
781
+ </body>
782
+ </html>
783
+
784
+ ```
785
+
786
+ ---
787
+
788
+ ## app/templates/burrito.html
789
+
790
+ ```html
791
+ {% extends "base.html" %}
792
+
793
+ {% block title %}Burrito - PostHog Flask Example{% endblock %}
794
+
795
+ {% block content %}
796
+ <div class="card">
797
+ <h1>Burrito Consideration Tracker</h1>
798
+ <p>This page demonstrates custom event tracking with PostHog.</p>
799
+
800
+ <div class="count" id="burrito-count">{{ burrito_count }}</div>
801
+ <p style="text-align: center; color: #666;">Times you've considered a burrito</p>
802
+
803
+ <div style="text-align: center; margin-top: 20px;">
804
+ <button onclick="considerBurrito()">Consider a Burrito</button>
805
+ </div>
806
+ </div>
807
+
808
+ <div class="card">
809
+ <h3>Code Example</h3>
810
+ <pre>
811
+ # API endpoint captures the event
812
+ with new_context():
813
+ identify_context(current_user.email)
814
+ capture('burrito_considered', properties={
815
+ 'total_considerations': burrito_count
816
+ })</pre>
817
+ </div>
818
+ {% endblock %}
819
+
820
+ {% block scripts %}
821
+ <script>
822
+ async function considerBurrito() {
823
+ try {
824
+ const response = await fetch('/api/burrito/consider', {
825
+ method: 'POST',
826
+ headers: {
827
+ 'Content-Type': 'application/json'
828
+ }
829
+ });
830
+ const data = await response.json();
831
+ if (data.success) {
832
+ document.getElementById('burrito-count').textContent = data.count;
833
+ }
834
+ } catch (error) {
835
+ console.error('Error:', error);
836
+ }
837
+ }
838
+ </script>
839
+ {% endblock %}
840
+
841
+ ```
842
+
843
+ ---
844
+
845
+ ## app/templates/dashboard.html
846
+
847
+ ```html
848
+ {% extends "base.html" %}
849
+
850
+ {% block title %}Dashboard - PostHog Flask Example{% endblock %}
851
+
852
+ {% block content %}
853
+ <div class="card">
854
+ <h1>Dashboard</h1>
855
+ <p>Welcome back, {{ current_user.username }}!</p>
856
+ </div>
857
+
858
+ <div class="card">
859
+ <h2>Feature Flags</h2>
860
+
861
+ {% if show_new_feature %}
862
+ <div class="feature-flag">
863
+ <strong>New Feature Enabled!</strong>
864
+ <p>You're seeing this because the <code>new-dashboard-feature</code> flag is enabled for you.</p>
865
+ {% if feature_config %}
866
+ <p><strong>Feature Configuration:</strong></p>
867
+ <pre>{{ feature_config | tojson(indent=2) }}</pre>
868
+ {% endif %}
869
+ </div>
870
+ {% else %}
871
+ <p>The <code>new-dashboard-feature</code> flag is not enabled for your account.</p>
872
+ {% endif %}
873
+
874
+ <h3 style="margin-top: 20px;">Code Example</h3>
875
+ <pre>
876
+ # Check if feature flag is enabled
877
+ show_new_feature = posthog.feature_enabled(
878
+ 'new-dashboard-feature',
879
+ user_id,
880
+ person_properties={
881
+ 'email': current_user.email,
882
+ 'is_staff': current_user.is_staff
883
+ }
884
+ )
885
+
886
+ # Get feature flag payload
887
+ feature_config = posthog.get_feature_flag_payload(
888
+ 'new-dashboard-feature',
889
+ user_id
890
+ )</pre>
891
+ </div>
892
+ {% endblock %}
893
+
894
+ ```
895
+
896
+ ---
897
+
898
+ ## app/templates/errors/404.html
899
+
900
+ ```html
901
+ {% extends "base.html" %}
902
+
903
+ {% block title %}404 - Page Not Found{% endblock %}
904
+
905
+ {% block content %}
906
+ <div class="card" style="text-align: center; padding: 60px 20px;">
907
+ <h1 style="font-size: 72px; color: #dc2626; margin-bottom: 10px;">404</h1>
908
+ <h2 style="color: #333; margin-bottom: 20px;">Page Not Found</h2>
909
+ <p style="font-size: 18px; color: #666; margin-bottom: 30px;">
910
+ The page you're looking for doesn't exist or has been moved.
911
+ </p>
912
+
913
+ {% if error_id %}
914
+ <div style="background: #fef3c7; border: 1px solid #fbbf24; border-radius: 8px; padding: 15px; margin: 30px 0;">
915
+ <p style="color: #92400e; margin-bottom: 5px; font-weight: 600;">Error Reference ID:</p>
916
+ <code style="background: #fff; padding: 5px 10px; border-radius: 4px; font-family: monospace; color: #1e40af;">{{ error_id }}</code>
917
+ <p style="color: #92400e; margin-top: 10px; font-size: 14px;">
918
+ Share this ID with support if you need assistance.
919
+ </p>
920
+ </div>
921
+ {% endif %}
922
+
923
+ <div style="margin-top: 40px;">
924
+ <a href="{{ url_for('main.home') }}" class="btn" style="margin-right: 10px;">Go to Home</a>
925
+ {% if current_user.is_authenticated %}
926
+ <a href="{{ url_for('main.dashboard') }}" class="btn">Go to Dashboard</a>
927
+ {% endif %}
928
+ </div>
929
+ </div>
930
+ {% endblock %}
931
+
932
+ ```
933
+
934
+ ---
935
+
936
+ ## app/templates/errors/500.html
937
+
938
+ ```html
939
+ {% extends "base.html" %}
940
+
941
+ {% block title %}500 - Internal Server Error{% endblock %}
942
+
943
+ {% block content %}
944
+ <div class="card" style="text-align: center; padding: 60px 20px;">
945
+ <h1 style="font-size: 72px; color: #dc2626; margin-bottom: 10px;">500</h1>
946
+ <h2 style="color: #333; margin-bottom: 20px;">Internal Server Error</h2>
947
+ <p style="font-size: 18px; color: #666; margin-bottom: 30px;">
948
+ Something went wrong on our end. We've been notified and are looking into it.
949
+ </p>
950
+
951
+ {% if error_id %}
952
+ <div style="background: #fef3c7; border: 1px solid #fbbf24; border-radius: 8px; padding: 15px; margin: 30px 0;">
953
+ <p style="color: #92400e; margin-bottom: 5px; font-weight: 600;">Error Reference ID:</p>
954
+ <code style="background: #fff; padding: 5px 10px; border-radius: 4px; font-family: monospace; color: #1e40af;">{{ error_id }}</code>
955
+ <p style="color: #92400e; margin-top: 10px; font-size: 14px;">
956
+ Share this ID with support if you need assistance. This error has been logged in PostHog.
957
+ </p>
958
+ </div>
959
+ {% endif %}
960
+
961
+ {% if error and config.DEBUG %}
962
+ <div style="background: #fee2e2; border: 1px solid #dc2626; border-radius: 8px; padding: 15px; margin: 30px 0; text-align: left;">
963
+ <p style="color: #7f1d1d; margin-bottom: 5px; font-weight: 600;">Debug Information:</p>
964
+ <code style="background: #fff; padding: 10px; border-radius: 4px; font-family: monospace; color: #dc2626; display: block; overflow-x: auto;">{{ error }}</code>
965
+ </div>
966
+ {% endif %}
967
+
968
+ <div style="margin-top: 40px;">
969
+ <a href="{{ url_for('main.home') }}" class="btn" style="margin-right: 10px;">Go to Home</a>
970
+ {% if current_user.is_authenticated %}
971
+ <a href="{{ url_for('main.dashboard') }}" class="btn">Go to Dashboard</a>
972
+ {% endif %}
973
+ </div>
974
+ </div>
975
+ {% endblock %}
976
+
977
+ ```
978
+
979
+ ---
980
+
981
+ ## app/templates/home.html
982
+
983
+ ```html
984
+ {% extends "base.html" %}
985
+
986
+ {% block title %}Login - PostHog Flask Example{% endblock %}
987
+
988
+ {% block content %}
989
+ <div class="card">
990
+ <h1>Welcome to PostHog Flask Example</h1>
991
+ <p>This example demonstrates how to integrate PostHog with a Flask application.</p>
992
+
993
+ <form method="POST">
994
+ <label for="email">Email</label>
995
+ <input type="email" id="email" name="email" required>
996
+
997
+ <label for="password">Password</label>
998
+ <input type="password" id="password" name="password" required>
999
+
1000
+ <button type="submit">Login</button>
1001
+ </form>
1002
+
1003
+ <p style="margin-top: 16px; font-size: 14px; color: #666;">
1004
+ Don't have an account? <a href="{{ url_for('main.signup') }}">Sign up here</a>
1005
+ </p>
1006
+ <p style="font-size: 14px; color: #666;">
1007
+ <strong>Tip:</strong> Default credentials are admin@example.com/admin
1008
+ </p>
1009
+ </div>
1010
+
1011
+ <div class="card">
1012
+ <h2>Features Demonstrated</h2>
1013
+ <ul style="margin-left: 20px; color: #666;">
1014
+ <li>User registration and identification</li>
1015
+ <li>Event tracking</li>
1016
+ <li>Feature flags</li>
1017
+ <li>Error tracking</li>
1018
+ <li>Group analytics</li>
1019
+ </ul>
1020
+ </div>
1021
+ {% endblock %}
1022
+
1023
+ ```
1024
+
1025
+ ---
1026
+
1027
+ ## app/templates/profile.html
1028
+
1029
+ ```html
1030
+ {% extends "base.html" %}
1031
+
1032
+ {% block title %}Profile - PostHog Flask Example{% endblock %}
1033
+
1034
+ {% block content %}
1035
+ <div class="card">
1036
+ <h1>Your Profile</h1>
1037
+ <p>This page demonstrates error tracking with PostHog.</p>
1038
+
1039
+ <table>
1040
+ <tr>
1041
+ <th>Email</th>
1042
+ <td>{{ current_user.email }}</td>
1043
+ </tr>
1044
+ <tr>
1045
+ <th>Date Joined</th>
1046
+ <td>{{ current_user.date_joined.strftime('%Y-%m-%d %H:%M') }}</td>
1047
+ </tr>
1048
+ <tr>
1049
+ <th>Staff Status</th>
1050
+ <td>{{ 'Yes' if current_user.is_staff else 'No' }}</td>
1051
+ </tr>
1052
+ </table>
1053
+ </div>
1054
+
1055
+ <div class="card">
1056
+ <h2>Error Tracking Demo</h2>
1057
+ <p>Click a button to trigger an error and see it captured in PostHog:</p>
1058
+
1059
+ <div style="margin: 20px 0;">
1060
+ <button class="danger" onclick="triggerError('value')">
1061
+ Trigger ValueError
1062
+ </button>
1063
+ <button class="danger" onclick="triggerError('key')">
1064
+ Trigger KeyError
1065
+ </button>
1066
+ <button class="danger" onclick="triggerError('generic')">
1067
+ Trigger Generic Error
1068
+ </button>
1069
+ </div>
1070
+
1071
+ <div id="error-result" style="display: none;" class="message"></div>
1072
+ </div>
1073
+
1074
+ <div class="card">
1075
+ <h3>Code Example</h3>
1076
+ <pre>
1077
+ try:
1078
+ raise ValueError('Invalid value provided')
1079
+ except Exception as e:
1080
+ # Capture exception and event with user context
1081
+ with new_context():
1082
+ identify_context(current_user.email)
1083
+ posthog.capture_exception(e)
1084
+ capture('error_triggered', properties={
1085
+ 'error_type': 'value',
1086
+ 'error_message': str(e)
1087
+ })</pre>
1088
+ </div>
1089
+ {% endblock %}
1090
+
1091
+ {% block scripts %}
1092
+ <script>
1093
+ async function triggerError(errorType) {
1094
+ const resultDiv = document.getElementById('error-result');
1095
+ try {
1096
+ const formData = new FormData();
1097
+ formData.append('error_type', errorType);
1098
+
1099
+ const response = await fetch('/api/trigger-error', {
1100
+ method: 'POST',
1101
+ body: formData
1102
+ });
1103
+ const data = await response.json();
1104
+
1105
+ resultDiv.style.display = 'block';
1106
+ resultDiv.className = 'message ' + (data.success ? 'success' : 'error');
1107
+ resultDiv.textContent = data.message + ': ' + data.error;
1108
+ } catch (error) {
1109
+ console.error('Error:', error);
1110
+ resultDiv.style.display = 'block';
1111
+ resultDiv.className = 'message error';
1112
+ resultDiv.textContent = 'Request failed: ' + error.message;
1113
+ }
1114
+ }
1115
+ </script>
1116
+ {% endblock %}
1117
+
1118
+ ```
1119
+
1120
+ ---
1121
+
1122
+ ## app/templates/signup.html
1123
+
1124
+ ```html
1125
+ {% extends "base.html" %}
1126
+
1127
+ {% block title %}Sign Up - PostHog Flask Example{% endblock %}
1128
+
1129
+ {% block content %}
1130
+ <div class="card">
1131
+ <h1>Create an Account</h1>
1132
+ <p>Sign up to explore the PostHog Flask integration example.</p>
1133
+
1134
+ <form method="POST">
1135
+ <label for="email">Email *</label>
1136
+ <input type="email" id="email" name="email" required>
1137
+
1138
+ <label for="password">Password *</label>
1139
+ <input type="password" id="password" name="password" required>
1140
+
1141
+ <label for="password_confirm">Confirm Password *</label>
1142
+ <input type="password" id="password_confirm" name="password_confirm" required>
1143
+
1144
+ <button type="submit">Sign Up</button>
1145
+ </form>
1146
+
1147
+ <p style="margin-top: 16px; font-size: 14px; color: #666;">
1148
+ Already have an account? <a href="{{ url_for('main.home') }}">Login here</a>
1149
+ </p>
1150
+ </div>
1151
+
1152
+ <div class="card">
1153
+ <h2>PostHog Integration</h2>
1154
+ <p>When you sign up, the following PostHog events are captured:</p>
1155
+ <ul style="margin-left: 20px; color: #666;">
1156
+ <li><code>identify_context()</code> - Associates your email with the context</li>
1157
+ <li><code>tag()</code> - Sets person properties (email, etc.)</li>
1158
+ <li><code>user_signed_up</code> event - Tracks the signup action</li>
1159
+ </ul>
1160
+
1161
+ <h3 style="margin-top: 20px;">Code Example</h3>
1162
+ <pre>
1163
+ # After creating the user
1164
+ with new_context():
1165
+ identify_context(user.email)
1166
+
1167
+ tag('email', user.email)
1168
+ tag('is_staff', user.is_staff)
1169
+ tag('date_joined', user.date_joined.isoformat())
1170
+
1171
+ capture('user_signed_up', properties={'signup_method': 'form'})</pre>
1172
+ </div>
1173
+ {% endblock %}
1174
+
1175
+ ```
1176
+
1177
+ ---
1178
+
1179
+ ## requirements.txt
1180
+
1181
+ ```txt
1182
+ Flask>=3.1.0
1183
+ Flask-Login>=0.6.3
1184
+ Flask-SQLAlchemy>=3.1.0
1185
+ python-dotenv>=1.0.0
1186
+ posthog>=3.0.0
1187
+ Werkzeug>=3.0.0
1188
+
1189
+ ```
1190
+
1191
+ ---
1192
+
1193
+ ## run.py
1194
+
1195
+ ```py
1196
+ """Development server entry point."""
1197
+
1198
+ from app import create_app
1199
+
1200
+ app = create_app()
1201
+
1202
+ if __name__ == "__main__":
1203
+ app.run(port=5001)
1204
+
1205
+ ```
1206
+
1207
+ ---
1208
+