@thierrynakoa/fire-flow 12.2.1 → 13.0.1
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.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# PyInstaller + CUDA/faster-whisper Bundling — Solution & Implementation
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Packaging a Python desktop app that uses **faster-whisper** (CTranslate2 backend with CUDA GPU acceleration) into a distributable Windows `.exe` via PyInstaller. The build either crashes at runtime with missing DLLs, fails to find the Whisper model, or silently falls back to CPU because CUDA libraries weren't bundled.
|
|
6
|
+
|
|
7
|
+
### Why It Was Hard
|
|
8
|
+
|
|
9
|
+
- CTranslate2 ships CUDA/cuDNN DLLs as binary extensions that PyInstaller doesn't auto-detect
|
|
10
|
+
- `faster-whisper` has implicit imports PyInstaller's analysis misses
|
|
11
|
+
- `sounddevice` bundles PortAudio as data files, not standard Python imports
|
|
12
|
+
- `pynput`, `pystray`, and `keyboard` all have platform-specific backends (`_win32`) that need explicit hidden imports
|
|
13
|
+
- The `anthropic` SDK pulls in `httpx`/`httpcore`/`anyio` — deep async dependency chains
|
|
14
|
+
- `--onefile` mode is a trap: CUDA DLLs are 500MB+ and extract to temp on every launch
|
|
15
|
+
|
|
16
|
+
### Impact
|
|
17
|
+
|
|
18
|
+
- App won't start (missing DLL errors)
|
|
19
|
+
- Whisper transcription fails or runs on CPU (10x slower) instead of GPU
|
|
20
|
+
- End users get cryptic `ModuleNotFoundError` at runtime
|
|
21
|
+
- Build appears to succeed but the exe is broken
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## The Solution
|
|
26
|
+
|
|
27
|
+
### Root Cause
|
|
28
|
+
|
|
29
|
+
PyInstaller's static analysis can't trace binary extensions loaded via `ctypes`, platform-dispatched backends (e.g., `pystray._win32`), or data files shipped alongside packages. You must explicitly collect these.
|
|
30
|
+
|
|
31
|
+
### The Spec File Pattern
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
# -*- mode: python ; coding: utf-8 -*-
|
|
35
|
+
"""PyInstaller spec for apps using faster-whisper with CUDA."""
|
|
36
|
+
from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs
|
|
37
|
+
|
|
38
|
+
block_cipher = None
|
|
39
|
+
|
|
40
|
+
# KEY INSIGHT: collect_dynamic_libs grabs ALL .dll/.so from the package
|
|
41
|
+
# This catches CUDA, cuDNN, and CTranslate2 backend libraries
|
|
42
|
+
ctranslate2_binaries = collect_dynamic_libs('ctranslate2')
|
|
43
|
+
|
|
44
|
+
# sounddevice ships PortAudio as data files, not binaries
|
|
45
|
+
sounddevice_data = collect_data_files('sounddevice')
|
|
46
|
+
|
|
47
|
+
# faster-whisper may include tokenizer assets
|
|
48
|
+
faster_whisper_data = collect_data_files('faster_whisper')
|
|
49
|
+
|
|
50
|
+
a = Analysis(
|
|
51
|
+
['src/your_app/__main__.py'],
|
|
52
|
+
binaries=ctranslate2_binaries,
|
|
53
|
+
datas=(
|
|
54
|
+
sounddevice_data
|
|
55
|
+
+ faster_whisper_data
|
|
56
|
+
+ [('assets', 'assets')] # your app's data files
|
|
57
|
+
),
|
|
58
|
+
hiddenimports=[
|
|
59
|
+
# -- CUDA transcription backend --
|
|
60
|
+
'ctranslate2',
|
|
61
|
+
'faster_whisper',
|
|
62
|
+
|
|
63
|
+
# -- Audio --
|
|
64
|
+
'sounddevice',
|
|
65
|
+
'_sounddevice_data',
|
|
66
|
+
|
|
67
|
+
# -- Global hotkeys (if using keyboard lib) --
|
|
68
|
+
'keyboard',
|
|
69
|
+
|
|
70
|
+
# -- pynput (platform-specific backends) --
|
|
71
|
+
'pynput.keyboard._win32',
|
|
72
|
+
'pynput.mouse._win32',
|
|
73
|
+
|
|
74
|
+
# -- System tray (platform-specific) --
|
|
75
|
+
'pystray._win32',
|
|
76
|
+
|
|
77
|
+
# -- Anthropic SDK + HTTP stack --
|
|
78
|
+
'anthropic',
|
|
79
|
+
'httpx', 'httpcore', 'h11',
|
|
80
|
+
'sniffio', 'anyio', 'anyio._backends._asyncio',
|
|
81
|
+
|
|
82
|
+
# -- Config --
|
|
83
|
+
'yaml',
|
|
84
|
+
|
|
85
|
+
# -- Image handling (Pillow, used by pystray) --
|
|
86
|
+
'PIL', 'PIL.Image',
|
|
87
|
+
|
|
88
|
+
# -- GUI --
|
|
89
|
+
'tkinter', 'tkinter.ttk', 'tkinter.font',
|
|
90
|
+
'tkinter.scrolledtext', 'tkinter.messagebox',
|
|
91
|
+
|
|
92
|
+
# -- Other --
|
|
93
|
+
'numpy', 'winsound', 'pyperclip',
|
|
94
|
+
],
|
|
95
|
+
excludes=['pytest', 'setuptools', 'pip', 'wheel'],
|
|
96
|
+
cipher=block_cipher,
|
|
97
|
+
noarchive=False,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
101
|
+
|
|
102
|
+
# IMPORTANT: Use onedir, not onefile. CUDA DLLs are too large.
|
|
103
|
+
exe = EXE(
|
|
104
|
+
pyz, a.scripts, [],
|
|
105
|
+
exclude_binaries=True,
|
|
106
|
+
name='YourApp',
|
|
107
|
+
console=False, # GUI/tray app — no console window
|
|
108
|
+
upx=False, # Don't compress — CUDA DLLs don't compress well
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
coll = COLLECT(
|
|
112
|
+
exe, a.binaries, a.zipfiles, a.datas,
|
|
113
|
+
strip=False, upx=False,
|
|
114
|
+
name='YourApp',
|
|
115
|
+
)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Critical Decisions Explained
|
|
119
|
+
|
|
120
|
+
| Decision | Why |
|
|
121
|
+
|----------|-----|
|
|
122
|
+
| `--onedir` not `--onefile` | CUDA DLLs are 500MB+. Onefile extracts to temp on every launch — 30s+ startup |
|
|
123
|
+
| `upx=False` | UPX breaks CUDA DLLs and provides minimal savings on binary extensions |
|
|
124
|
+
| `console=False` | Tray/GUI apps shouldn't show a console window |
|
|
125
|
+
| `collect_dynamic_libs('ctranslate2')` | The **key** line — grabs CUDA + cuDNN wrapper DLLs |
|
|
126
|
+
| `collect_data_files('sounddevice')` | PortAudio is shipped as data, not a Python import |
|
|
127
|
+
| Platform-specific hidden imports | `pystray._win32`, `pynput.keyboard._win32` — PyInstaller can't detect dispatch |
|
|
128
|
+
|
|
129
|
+
### Frozen Mode Detection (for autostart, paths, etc.)
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
import sys
|
|
133
|
+
|
|
134
|
+
if getattr(sys, 'frozen', False):
|
|
135
|
+
# Running as PyInstaller bundle
|
|
136
|
+
app_dir = sys._MEIPASS # Extracted temp dir (onefile) or bundle dir (onedir)
|
|
137
|
+
exe_path = sys.executable # The actual .exe path
|
|
138
|
+
else:
|
|
139
|
+
# Running from source
|
|
140
|
+
app_dir = os.path.dirname(__file__)
|
|
141
|
+
exe_path = sys.executable # Python interpreter
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Build Script (Windows)
|
|
145
|
+
|
|
146
|
+
```bat
|
|
147
|
+
@echo off
|
|
148
|
+
call .venv\Scripts\activate.bat
|
|
149
|
+
pip install pyinstaller>=6.0 >nul 2>&1
|
|
150
|
+
pyinstaller voice-bridge.spec --clean --noconfirm
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Testing the Fix
|
|
156
|
+
|
|
157
|
+
### Build Verification
|
|
158
|
+
```bash
|
|
159
|
+
# Build completes without errors
|
|
160
|
+
pyinstaller your-app.spec --clean --noconfirm
|
|
161
|
+
|
|
162
|
+
# Output directory exists with exe + DLLs
|
|
163
|
+
dir dist\YourApp\YourApp.exe
|
|
164
|
+
dir dist\YourApp\*.dll | find /c ".dll" # Should show CUDA DLLs
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Runtime Verification
|
|
168
|
+
```
|
|
169
|
+
1. Launch dist\YourApp\YourApp.exe
|
|
170
|
+
2. Verify tray icon appears (pystray works)
|
|
171
|
+
3. Trigger audio recording (sounddevice works)
|
|
172
|
+
4. Trigger transcription (faster-whisper + CUDA works)
|
|
173
|
+
5. Check GPU is used: look for "Model loaded on cuda" in logs
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Common Runtime Errors and Fixes
|
|
177
|
+
|
|
178
|
+
| Error | Cause | Fix |
|
|
179
|
+
|-------|-------|-----|
|
|
180
|
+
| `ModuleNotFoundError: ctranslate2` | Missing hidden import | Add `'ctranslate2'` to hiddenimports |
|
|
181
|
+
| `Could not load library cudnn` | cuDNN DLLs not bundled | Verify `collect_dynamic_libs('ctranslate2')` is in binaries |
|
|
182
|
+
| `No module named 'pystray._win32'` | Platform backend not found | Add `'pystray._win32'` to hiddenimports |
|
|
183
|
+
| `PortAudio not found` | sounddevice data not bundled | Add `collect_data_files('sounddevice')` to datas |
|
|
184
|
+
| `httpcore not found` | anthropic SDK dependency chain | Add `'httpx', 'httpcore', 'h11'` to hiddenimports |
|
|
185
|
+
| App starts but GPU not used | CUDA DLLs missing at runtime | Check `dist/YourApp/` for `cublas*.dll`, `cudnn*.dll` |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Prevention
|
|
190
|
+
|
|
191
|
+
1. **Always use `collect_dynamic_libs`** for packages with native extensions (ctranslate2, torch, onnxruntime)
|
|
192
|
+
2. **Always use `collect_data_files`** for packages that ship non-Python data (sounddevice, transformers)
|
|
193
|
+
3. **Test the frozen build immediately** — don't assume build success = runtime success
|
|
194
|
+
4. **Log which device** your ML model loads on (cuda vs cpu) so you can catch silent fallbacks
|
|
195
|
+
5. **Use `--onedir`** for CUDA apps — `--onefile` is a trap
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Related Patterns
|
|
200
|
+
|
|
201
|
+
- GPU fallback pattern: try CUDA, catch exception, fall back to CPU with logging
|
|
202
|
+
- Frozen path detection: `getattr(sys, 'frozen', False)` for all path-dependent code
|
|
203
|
+
- Windows autostart with registry: different commands for frozen vs source
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Common Mistakes to Avoid
|
|
208
|
+
|
|
209
|
+
- Using `--onefile` with CUDA libraries (30s+ startup, temp extraction issues)
|
|
210
|
+
- Forgetting platform-specific backends (pystray, pynput on Windows)
|
|
211
|
+
- Not testing the actual .exe (build succeeding doesn't mean runtime works)
|
|
212
|
+
- Using `upx=True` which breaks CUDA DLLs
|
|
213
|
+
- Assuming PyInstaller traces `ctypes.cdll.LoadLibrary` calls (it doesn't)
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Resources
|
|
218
|
+
|
|
219
|
+
- [PyInstaller hooks documentation](https://pyinstaller.org/en/stable/hooks.html)
|
|
220
|
+
- [faster-whisper GitHub](https://github.com/SYSTRAN/faster-whisper)
|
|
221
|
+
- [CTranslate2 packaging](https://github.com/OpenNMT/CTranslate2)
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Time to Implement
|
|
226
|
+
|
|
227
|
+
**30-60 minutes** for initial spec file creation and testing. Most time spent on iterating hidden imports after runtime errors.
|
|
228
|
+
|
|
229
|
+
## Difficulty Level
|
|
230
|
+
|
|
231
|
+
Stars: 4/5 — Requires understanding of PyInstaller internals, CUDA library loading, and platform-specific Python package dispatch. Hard to debug because errors only appear at runtime in the frozen build.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
**Author Notes:**
|
|
236
|
+
The #1 insight: `collect_dynamic_libs('ctranslate2')` is the magic line. Without it, you get a build that succeeds but an exe that crashes. The second insight: always use `--onedir` for ML/CUDA apps. The `--onefile` mode is tempting but creates a terrible user experience with multi-hundred-MB temp extractions on every launch.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->
|
|
2
|
+
|
|
3
|
+
## Security
|
|
4
|
+
|
|
5
|
+
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
|
|
6
|
+
|
|
7
|
+
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
|
|
8
|
+
|
|
9
|
+
## Reporting Security Issues
|
|
10
|
+
|
|
11
|
+
**Please do not report security vulnerabilities through public GitHub issues.**
|
|
12
|
+
|
|
13
|
+
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
|
|
14
|
+
|
|
15
|
+
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
|
|
16
|
+
|
|
17
|
+
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
|
|
18
|
+
|
|
19
|
+
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
|
|
20
|
+
|
|
21
|
+
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
|
|
22
|
+
* Full paths of source file(s) related to the manifestation of the issue
|
|
23
|
+
* The location of the affected source code (tag/branch/commit or direct URL)
|
|
24
|
+
* Any special configuration required to reproduce the issue
|
|
25
|
+
* Step-by-step instructions to reproduce the issue
|
|
26
|
+
* Proof-of-concept or exploit code (if possible)
|
|
27
|
+
* Impact of the issue, including how an attacker might exploit the issue
|
|
28
|
+
|
|
29
|
+
This information will help us triage your report more quickly.
|
|
30
|
+
|
|
31
|
+
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
|
|
32
|
+
|
|
33
|
+
## Preferred Languages
|
|
34
|
+
|
|
35
|
+
We prefer all communications to be in English.
|
|
36
|
+
|
|
37
|
+
## Policy
|
|
38
|
+
|
|
39
|
+
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
|
|
40
|
+
|
|
41
|
+
<!-- END MICROSOFT SECURITY.MD BLOCK -->
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# SMTP SSL Certificate Hostname Mismatch on Shared Hosting - Solution
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
When sending emails (e.g., verification emails) from a Node.js application on shared hosting, you get an SSL certificate error:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Hostname/IP does not match certificate's altnames:
|
|
9
|
+
Host: mail.yourdomain.com. is not in the cert's altnames:
|
|
10
|
+
DNS:autoconfig.server1.hostingprovider.com,
|
|
11
|
+
DNS:mail.server1.hostingprovider.com,
|
|
12
|
+
DNS:server1.hostingprovider.com,
|
|
13
|
+
...
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Why It Was Hard
|
|
17
|
+
|
|
18
|
+
- The error message is confusing - it lists hostnames that ARE valid, not what's wrong
|
|
19
|
+
- Many developers assume they need to disable SSL entirely (insecure)
|
|
20
|
+
- The `rejectUnauthorized: false` setting doesn't always work as expected
|
|
21
|
+
- Understanding shared hosting SSL certificate architecture isn't obvious
|
|
22
|
+
- Multiple potential solutions exist, unclear which is best
|
|
23
|
+
|
|
24
|
+
### Impact
|
|
25
|
+
|
|
26
|
+
- Email verification fails for new users
|
|
27
|
+
- Password reset emails don't send
|
|
28
|
+
- Any transactional email fails
|
|
29
|
+
- Users cannot complete registration/enrollment flows
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## The Solution
|
|
34
|
+
|
|
35
|
+
### Root Cause
|
|
36
|
+
|
|
37
|
+
On shared hosting, your mail subdomain `mail.yourdomain.com` is a DNS alias pointing to the hosting provider's actual mail server (e.g., `mail.server1.hostingprovider.com`).
|
|
38
|
+
|
|
39
|
+
The SSL certificate on that server covers the **provider's hostnames**, not your domain's hostname. When nodemailer connects to `mail.yourdomain.com`, SSL verification fails because that hostname isn't in the certificate.
|
|
40
|
+
|
|
41
|
+
### Two Solutions
|
|
42
|
+
|
|
43
|
+
#### Option A: Use the Provider's Mail Server Hostname (Quick Fix)
|
|
44
|
+
|
|
45
|
+
Change your `EMAIL_HOST` environment variable to use the hostname that's actually in the certificate:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Instead of:
|
|
49
|
+
EMAIL_HOST=mail.yourdomain.com
|
|
50
|
+
|
|
51
|
+
# Use:
|
|
52
|
+
EMAIL_HOST=mail.server1.hostingprovider.com
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**How to find the correct hostname:**
|
|
56
|
+
Look at the error message - it lists all valid hostnames. Find the one that starts with `mail.` (e.g., `mail.server1.hostingprovider.com`).
|
|
57
|
+
|
|
58
|
+
**Why this works:**
|
|
59
|
+
- You connect to the hostname that matches the certificate (SSL passes)
|
|
60
|
+
- You still authenticate with your email credentials (`user@yourdomain.com`)
|
|
61
|
+
- Emails are still sent FROM your domain (controlled by `EMAIL_FROM`)
|
|
62
|
+
- Recipients see your domain, not the provider's
|
|
63
|
+
|
|
64
|
+
#### Option B: Install SSL Certificate for Your Mail Subdomain (Proper Fix)
|
|
65
|
+
|
|
66
|
+
Get an SSL certificate that covers `mail.yourdomain.com`:
|
|
67
|
+
|
|
68
|
+
1. **In cPanel:** Go to SSL/TLS Status or AutoSSL
|
|
69
|
+
2. **Find your mail subdomain** in the list
|
|
70
|
+
3. **Issue/install a certificate** for `mail.yourdomain.com`
|
|
71
|
+
4. After installation, keep `EMAIL_HOST=mail.yourdomain.com`
|
|
72
|
+
|
|
73
|
+
This is cleaner but requires:
|
|
74
|
+
- Purchasing or provisioning an SSL cert
|
|
75
|
+
- Access to cPanel/hosting control panel
|
|
76
|
+
- Waiting for cert issuance (can take minutes to hours)
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Code Implementation
|
|
81
|
+
|
|
82
|
+
### Nodemailer Configuration with TLS Fallback
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// server/config/email.js
|
|
86
|
+
import nodemailer from 'nodemailer';
|
|
87
|
+
|
|
88
|
+
const createTransporter = () => {
|
|
89
|
+
const config = {
|
|
90
|
+
host: process.env.EMAIL_HOST,
|
|
91
|
+
port: parseInt(process.env.EMAIL_PORT || '465'),
|
|
92
|
+
secure: process.env.EMAIL_PORT === '465',
|
|
93
|
+
auth: {
|
|
94
|
+
user: process.env.EMAIL_USER,
|
|
95
|
+
pass: process.env.EMAIL_PASSWORD
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Allow hostname-mismatched certs for shared hosting
|
|
100
|
+
// Set EMAIL_TLS_REJECT_UNAUTHORIZED=false to enable this
|
|
101
|
+
const rejectUnauthorized = process.env.EMAIL_TLS_REJECT_UNAUTHORIZED !== 'false';
|
|
102
|
+
|
|
103
|
+
config.tls = {
|
|
104
|
+
rejectUnauthorized,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return nodemailer.createTransport(config);
|
|
108
|
+
};
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Environment Variables
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# .env file
|
|
115
|
+
|
|
116
|
+
# Option A: Use provider's hostname (recommended for shared hosting)
|
|
117
|
+
EMAIL_HOST=mail.server1.hostingprovider.com
|
|
118
|
+
EMAIL_PORT=465
|
|
119
|
+
EMAIL_USER=noreply@yourdomain.com
|
|
120
|
+
EMAIL_PASSWORD=your-email-password
|
|
121
|
+
EMAIL_FROM="Your App <noreply@yourdomain.com>"
|
|
122
|
+
|
|
123
|
+
# Optional: Disable TLS verification (less secure fallback)
|
|
124
|
+
# Only use if Option A doesn't work
|
|
125
|
+
EMAIL_TLS_REJECT_UNAUTHORIZED=false
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Testing the Fix
|
|
131
|
+
|
|
132
|
+
### Before Fix
|
|
133
|
+
```
|
|
134
|
+
Error: Hostname/IP does not match certificate's altnames
|
|
135
|
+
Email sending: FAILED
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### After Fix (Option A)
|
|
139
|
+
```
|
|
140
|
+
[EmailService] Connecting to mail.server1.hostingprovider.com:465
|
|
141
|
+
[EmailService] Email sent successfully: <message-id@yourdomain.com>
|
|
142
|
+
Email sending: SUCCESS
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Verification Steps
|
|
146
|
+
|
|
147
|
+
1. SSH into server
|
|
148
|
+
2. Update `.env` with new `EMAIL_HOST`
|
|
149
|
+
3. Restart application: `pm2 restart all`
|
|
150
|
+
4. Test email sending (e.g., trigger verification email)
|
|
151
|
+
5. Check logs for success message
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Prevention
|
|
156
|
+
|
|
157
|
+
1. **Document your hosting's mail server hostname** - Keep it in deployment docs
|
|
158
|
+
2. **Use environment variables** - Never hardcode mail server hostnames
|
|
159
|
+
3. **Add TLS fallback option** - Include `EMAIL_TLS_REJECT_UNAUTHORIZED` in your config
|
|
160
|
+
4. **Test email in staging** - Before deploying to production
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Related Patterns
|
|
165
|
+
|
|
166
|
+
- [env-file-management-production-local.md](./env-file-management-production-local.md) - Environment variable management
|
|
167
|
+
- [deployment-changes-not-applying.md](./deployment-changes-not-applying.md) - Debugging deployment issues
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Common Mistakes to Avoid
|
|
172
|
+
|
|
173
|
+
- **Setting `rejectUnauthorized: false` blindly** - This disables ALL certificate verification. Use Option A instead.
|
|
174
|
+
- **Assuming your domain has its own mail cert** - On shared hosting, it usually doesn't.
|
|
175
|
+
- **Not restarting PM2 after .env changes** - PM2 caches environment variables.
|
|
176
|
+
- **Using `pm2 restart` instead of `pm2 delete && pm2 start`** - Sometimes restart doesn't reload env vars.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Hosting Provider Examples
|
|
181
|
+
|
|
182
|
+
| Provider | Typical Mail Hostname |
|
|
183
|
+
|----------|----------------------|
|
|
184
|
+
| cPanel shared | `mail.serverX.provider.com` |
|
|
185
|
+
| Hostinger | `smtp.hostinger.com` |
|
|
186
|
+
| Bluehost | `mail.yourdomain.com` (usually has cert) |
|
|
187
|
+
| GoDaddy | `smtpout.secureserver.net` |
|
|
188
|
+
| SiteGround | `mail.yourdomain.com` (usually has cert) |
|
|
189
|
+
|
|
190
|
+
**Always check the error message** - it tells you exactly which hostnames are valid.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Resources
|
|
195
|
+
|
|
196
|
+
- [Nodemailer TLS Options](https://nodemailer.com/smtp/#tls-options)
|
|
197
|
+
- [Let's Encrypt for cPanel](https://docs.cpanel.net/knowledge-base/security/ssl-tls/)
|
|
198
|
+
- [Understanding SSL Certificate SANs](https://www.ssl.com/faqs/what-is-a-san-certificate/)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Time to Implement
|
|
203
|
+
|
|
204
|
+
**Option A:** 5 minutes (just change env var)
|
|
205
|
+
**Option B:** 15-60 minutes (depends on SSL provisioning time)
|
|
206
|
+
|
|
207
|
+
## Difficulty Level
|
|
208
|
+
|
|
209
|
+
**Diagnosis:** 3/5 - Error message is confusing
|
|
210
|
+
**Fix:** 1/5 - Just an env var change once you understand the issue
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
**Author Notes:**
|
|
215
|
+
|
|
216
|
+
This issue is extremely common on shared hosting but poorly documented. The key insight is understanding that `mail.yourdomain.com` is just a DNS alias - the actual server uses the hosting provider's certificate.
|
|
217
|
+
|
|
218
|
+
The error message actually gives you the solution - it lists all the valid hostnames. Look for the one starting with `mail.` and use that as your `EMAIL_HOST`.
|
|
219
|
+
|
|
220
|
+
Don't waste time trying to make `rejectUnauthorized: false` work. Just use the correct hostname. It's simpler, more secure, and works reliably.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# React SPA SEO Optimization on cPanel Shared Hosting
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Client-side React SPAs render zero content for search engine crawlers. Google sees:
|
|
6
|
+
- Title: "Loading..." or generic title
|
|
7
|
+
- Content: 0 words, 0 headings, 0 links
|
|
8
|
+
- No structured data, no OG tags, no sitemap
|
|
9
|
+
|
|
10
|
+
This results in Grade F (40-50/100) on SEO audits.
|
|
11
|
+
|
|
12
|
+
### Why It Was Hard
|
|
13
|
+
|
|
14
|
+
- SPA architecture fundamentally conflicts with SEO — content is JavaScript-rendered
|
|
15
|
+
- cPanel shared hosting with nginx reverse proxy adds complexity for security headers
|
|
16
|
+
- `.htaccess` rules must coexist with WebSocket proxy, API proxy, and PHP handler rules
|
|
17
|
+
- `cp -rf dist/*` during deployment silently skips dotfiles (`.htaccess`)
|
|
18
|
+
- No SSR/pre-rendering infrastructure available on shared hosting
|
|
19
|
+
|
|
20
|
+
### Impact
|
|
21
|
+
|
|
22
|
+
- Zero Google visibility — site effectively invisible to search engines
|
|
23
|
+
- No rich results (missing structured data)
|
|
24
|
+
- No social sharing previews (missing OG tags)
|
|
25
|
+
- Security headers only on API routes (Express/Helmet), not on static files
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## The Solution
|
|
30
|
+
|
|
31
|
+
### Strategy: Quick Wins Without SSR
|
|
32
|
+
|
|
33
|
+
Instead of adding SSR infrastructure, use these techniques to go from Grade F → Grade C:
|
|
34
|
+
|
|
35
|
+
1. **Static SEO in `index.html`** — title, description, canonical, OG tags, JSON-LD
|
|
36
|
+
2. **`<noscript>` fallback** — crawlable HTML with nav, content sections, footer
|
|
37
|
+
3. **Visible SEO footer** — privacy/legal links outside `<noscript>` (hidden by React on mount)
|
|
38
|
+
4. **Static `sitemap.xml`** — list all public routes for crawler discovery
|
|
39
|
+
5. **`.htaccess` security headers** — CSP, HSTS, X-Frame-Options for Apache-served files
|
|
40
|
+
6. **CSP `<meta http-equiv>` fallback** — browsers honor CSP via meta tag
|
|
41
|
+
7. **Vite code splitting** — `manualChunks` to reduce main bundle size
|
|
42
|
+
|
|
43
|
+
### Implementation
|
|
44
|
+
|
|
45
|
+
#### 1. index.html — Complete SEO Head
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<head>
|
|
49
|
+
<title>Site Name - Description (under 60 chars)</title>
|
|
50
|
+
<meta name="description" content="Under 160 chars..." />
|
|
51
|
+
<link rel="canonical" href="https://yoursite.com/" />
|
|
52
|
+
|
|
53
|
+
<!-- Robot Control -->
|
|
54
|
+
<meta name="robots" content="index, follow, noarchive, nocache, noimageindex" />
|
|
55
|
+
|
|
56
|
+
<!-- CSP meta fallback (for static hosting without HTTP header control) -->
|
|
57
|
+
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; ..." />
|
|
58
|
+
|
|
59
|
+
<!-- Open Graph -->
|
|
60
|
+
<meta property="og:type" content="website" />
|
|
61
|
+
<meta property="og:title" content="..." />
|
|
62
|
+
<meta property="og:image" content="https://yoursite.com/og-image.jpg" />
|
|
63
|
+
|
|
64
|
+
<!-- JSON-LD Structured Data -->
|
|
65
|
+
<script type="application/ld+json">
|
|
66
|
+
{ "@context": "https://schema.org", "@type": "EducationalOrganization", ... }
|
|
67
|
+
</script>
|
|
68
|
+
</head>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### 2. Noscript Fallback + SEO Footer
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<body>
|
|
75
|
+
<div id="root"></div>
|
|
76
|
+
|
|
77
|
+
<!-- Visible to crawlers, removed by React on mount -->
|
|
78
|
+
<footer id="seo-footer" class="text-xs text-gray-500 text-center p-4">
|
|
79
|
+
<a href="/privacy">Privacy Policy</a> |
|
|
80
|
+
<a href="/terms">Terms of Service</a>
|
|
81
|
+
</footer>
|
|
82
|
+
|
|
83
|
+
<noscript>
|
|
84
|
+
<header><h1>Site Title</h1></header>
|
|
85
|
+
<nav><ul><!-- all public page links --></ul></nav>
|
|
86
|
+
<main><!-- content sections --></main>
|
|
87
|
+
<footer><!-- legal links --></footer>
|
|
88
|
+
</noscript>
|
|
89
|
+
</body>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
In main.jsx, remove the SEO footer when React loads:
|
|
93
|
+
```javascript
|
|
94
|
+
const seoFooter = document.getElementById('seo-footer');
|
|
95
|
+
if (seoFooter) seoFooter.remove();
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### 3. .htaccess — Merged Configuration
|
|
99
|
+
|
|
100
|
+
**CRITICAL:** On cPanel, `.htaccess` likely already has WebSocket proxy, API proxy, and PHP handler rules. **Never overwrite** — always merge.
|
|
101
|
+
|
|
102
|
+
```apache
|
|
103
|
+
# Security Headers (add BEFORE existing rules)
|
|
104
|
+
<IfModule mod_headers.c>
|
|
105
|
+
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
|
106
|
+
Header always set X-Frame-Options "SAMEORIGIN"
|
|
107
|
+
Header always set X-Content-Type-Options "nosniff"
|
|
108
|
+
Header always set Content-Security-Policy "default-src 'self'; ..."
|
|
109
|
+
</IfModule>
|
|
110
|
+
|
|
111
|
+
# KEEP EXISTING: WebSocket proxy, API proxy, SPA routing, PHP handler
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### 4. Deploy Script Fix
|
|
115
|
+
|
|
116
|
+
Bash `cp -rf dist/*` skips dotfiles. Add explicit copy:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
cp -rf client/dist/* ~/public_html/
|
|
120
|
+
cp -f client/dist/.htaccess ~/public_html/.htaccess 2>/dev/null || true
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### 5. Vite Code Splitting
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// vite.config.js
|
|
127
|
+
rollupOptions: {
|
|
128
|
+
output: {
|
|
129
|
+
manualChunks: {
|
|
130
|
+
'vendor-react': ['react', 'react-dom', 'react-router-dom'],
|
|
131
|
+
'vendor-redux': ['@reduxjs/toolkit', 'react-redux'],
|
|
132
|
+
'vendor-ui': ['@headlessui/react', 'lucide-react'],
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Results
|
|
141
|
+
|
|
142
|
+
| Metric | Before | After | Change |
|
|
143
|
+
|--------|--------|-------|--------|
|
|
144
|
+
| Overall Score | 47 (F) | 73 (C) | +26 |
|
|
145
|
+
| Security | 64 | 97 | +33 |
|
|
146
|
+
| Legal Compliance | -- | 100 | +100 |
|
|
147
|
+
| Structured Data | 0 | 100 | +100 |
|
|
148
|
+
| Social Media | 0 | 100 | +100 |
|
|
149
|
+
| Content | 0 | 75 | +75 |
|
|
150
|
+
| Crawlability | 50 | 95 | +45 |
|
|
151
|
+
| Core SEO | 43 | 81 | +38 |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Common Mistakes to Avoid
|
|
156
|
+
|
|
157
|
+
- ❌ **Overwriting production `.htaccess`** — always SSH and check existing rules first
|
|
158
|
+
- ❌ **Using `/privacy-policy` when React route is `/privacy`** — verify actual route names
|
|
159
|
+
- ❌ **Relying on `.htaccess` alone for security** — nginx may bypass Apache; add CSP meta tag as fallback
|
|
160
|
+
- ❌ **Forgetting dotfile copy in deploy scripts** — `cp dist/*` skips `.htaccess`
|
|
161
|
+
- ❌ **Adding `noimageindex` without understanding impact** — blocks ALL image indexing, OG images still work for social sharing
|
|
162
|
+
- ❌ **Setting `nofollow` in robots meta** — blocks Google from following ANY links on the page
|
|
163
|
+
|
|
164
|
+
## Content Protection Without Hurting SEO
|
|
165
|
+
|
|
166
|
+
- `noarchive` — prevents cached copies (Google Cache)
|
|
167
|
+
- `nocache` — prevents snippet caching
|
|
168
|
+
- `noimageindex` — blocks image search indexing (OG images still work)
|
|
169
|
+
- robots.txt AI bot blocks (GPTBot, ClaudeBot, etc.) — prevents AI training
|
|
170
|
+
- `nofollow` in robots meta is **NOT** for content protection — it kills SEO
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Tools
|
|
175
|
+
|
|
176
|
+
- **squirrelscan CLI** — `squirrel audit <url> --format llm --coverage surface`
|
|
177
|
+
- Install: https://squirrelscan.com/download
|
|
178
|
+
- Use `--refresh` flag to bypass cache after changes
|
|
179
|
+
|
|
180
|
+
## Remaining Limitations (Require SSR)
|
|
181
|
+
|
|
182
|
+
- Duplicate titles across all pages (SPA serves same index.html)
|
|
183
|
+
- Thin content (noscript provides ~130 words, not full page content)
|
|
184
|
+
- No per-page meta descriptions
|
|
185
|
+
- To reach Grade A (90+), need SSR (Next.js) or pre-rendering
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Time to Implement
|
|
190
|
+
|
|
191
|
+
**1-2 hours** for all quick wins (no SSR)
|
|
192
|
+
|
|
193
|
+
## Difficulty Level
|
|
194
|
+
|
|
195
|
+
⭐⭐⭐ (3/5) — Conceptually simple but many gotchas with cPanel/nginx/.htaccess
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
**Author Notes:**
|
|
200
|
+
The biggest insight was that cPanel shared hosting uses nginx as a reverse proxy in front of Apache. The `.htaccess` IS processed (Apache handles it), but you have to actually get the file deployed. The `cp dist/*` glob silently skipping dotfiles cost us an entire debug cycle. Also, always SSH and check the existing `.htaccess` before deploying — it likely has critical proxy rules you don't want to overwrite.
|