@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,141 @@
|
|
|
1
|
+
# YouTube API Setup Guide
|
|
2
|
+
|
|
3
|
+
This guide will help you set up the YouTube Data API v3 for importing YouTube playlists into your LMS.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Google Account
|
|
8
|
+
- Google Cloud Platform (GCP) access
|
|
9
|
+
|
|
10
|
+
## Step-by-Step Setup
|
|
11
|
+
|
|
12
|
+
### 1. Create a Google Cloud Project
|
|
13
|
+
|
|
14
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
15
|
+
2. Click on the project dropdown at the top
|
|
16
|
+
3. Click "New Project"
|
|
17
|
+
4. Enter project name (e.g., "MERN-LMS")
|
|
18
|
+
5. Click "Create"
|
|
19
|
+
|
|
20
|
+
### 2. Enable YouTube Data API v3
|
|
21
|
+
|
|
22
|
+
1. In the Google Cloud Console, make sure your project is selected
|
|
23
|
+
2. Go to **APIs & Services** > **Library**
|
|
24
|
+
3. Search for "YouTube Data API v3"
|
|
25
|
+
4. Click on it
|
|
26
|
+
5. Click **Enable**
|
|
27
|
+
|
|
28
|
+
### 3. Create API Credentials
|
|
29
|
+
|
|
30
|
+
1. Go to **APIs & Services** > **Credentials**
|
|
31
|
+
2. Click **Create Credentials** > **API Key**
|
|
32
|
+
3. Your API key will be created and displayed
|
|
33
|
+
4. **Important**: Click **Restrict Key** to secure it
|
|
34
|
+
|
|
35
|
+
### 4. Restrict the API Key (Recommended)
|
|
36
|
+
|
|
37
|
+
#### Application Restrictions:
|
|
38
|
+
- **None** (or HTTP referrers if you want to restrict to your domain)
|
|
39
|
+
|
|
40
|
+
#### API Restrictions:
|
|
41
|
+
- Select "Restrict key"
|
|
42
|
+
- Check only "YouTube Data API v3"
|
|
43
|
+
- Click "Save"
|
|
44
|
+
|
|
45
|
+
### 5. Add API Key to Your Environment
|
|
46
|
+
|
|
47
|
+
1. Copy the API key
|
|
48
|
+
2. Open `server/.env` file
|
|
49
|
+
3. Add or update the following line:
|
|
50
|
+
```
|
|
51
|
+
YOUTUBE_API_KEY=YOUR_API_KEY_HERE
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 6. Test the API
|
|
55
|
+
|
|
56
|
+
Run the test script to verify everything works:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
cd server
|
|
60
|
+
node test-youtube-api.js
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
You should see:
|
|
64
|
+
```
|
|
65
|
+
✅ All tests passed!
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Usage Limits
|
|
69
|
+
|
|
70
|
+
### Free Tier Quota:
|
|
71
|
+
- **10,000 units per day** (quota resets at midnight Pacific Time)
|
|
72
|
+
|
|
73
|
+
### Cost Per Operation:
|
|
74
|
+
- List playlist items: **1 unit per request** (50 videos)
|
|
75
|
+
- Get playlist metadata: **1 unit per request**
|
|
76
|
+
|
|
77
|
+
### Example:
|
|
78
|
+
- Importing a 50-video playlist = **2 units**
|
|
79
|
+
- Importing a 200-video playlist = **6 units** (4 paginated requests + 1 metadata)
|
|
80
|
+
|
|
81
|
+
**You can import approximately 2,500 playlists per day within the free tier.**
|
|
82
|
+
|
|
83
|
+
## Troubleshooting
|
|
84
|
+
|
|
85
|
+
### Error: "API key not valid"
|
|
86
|
+
**Solution:**
|
|
87
|
+
1. Make sure YouTube Data API v3 is enabled
|
|
88
|
+
2. Check that the API key is copied correctly
|
|
89
|
+
3. Wait a few minutes after creating the key (can take time to activate)
|
|
90
|
+
4. Verify API restrictions don't block your requests
|
|
91
|
+
|
|
92
|
+
### Error: "The request cannot be completed because you have exceeded your quota"
|
|
93
|
+
**Solution:**
|
|
94
|
+
1. Wait 24 hours for quota reset
|
|
95
|
+
2. Request a quota increase in Google Cloud Console:
|
|
96
|
+
- Go to **APIs & Services** > **Quotas**
|
|
97
|
+
- Find "YouTube Data API v3"
|
|
98
|
+
- Click "Edit Quotas"
|
|
99
|
+
- Submit quota increase request
|
|
100
|
+
|
|
101
|
+
### Error: "Playlist not found or is private"
|
|
102
|
+
**Solution:**
|
|
103
|
+
- Make sure the playlist is public or unlisted
|
|
104
|
+
- Private playlists cannot be imported
|
|
105
|
+
|
|
106
|
+
### Error: "Access Not Configured"
|
|
107
|
+
**Solution:**
|
|
108
|
+
- Ensure YouTube Data API v3 is enabled in your project
|
|
109
|
+
- Try disabling and re-enabling the API
|
|
110
|
+
|
|
111
|
+
## Security Best Practices
|
|
112
|
+
|
|
113
|
+
1. **Never commit API keys to version control**
|
|
114
|
+
- Add `.env` to `.gitignore`
|
|
115
|
+
- Use environment variables in production
|
|
116
|
+
|
|
117
|
+
2. **Restrict API key usage**
|
|
118
|
+
- Set application restrictions (HTTP referrers, IP addresses)
|
|
119
|
+
- Limit to YouTube Data API v3 only
|
|
120
|
+
- Rotate keys periodically
|
|
121
|
+
|
|
122
|
+
3. **Monitor usage**
|
|
123
|
+
- Check quota usage in Google Cloud Console
|
|
124
|
+
- Set up billing alerts if using paid quota
|
|
125
|
+
|
|
126
|
+
## Alternative: Vimeo Showcase Import
|
|
127
|
+
|
|
128
|
+
If you prefer not to use YouTube or need an alternative, the LMS also supports Vimeo showcases:
|
|
129
|
+
|
|
130
|
+
1. Get a Vimeo access token from [Vimeo Developer](https://developer.vimeo.com/apps)
|
|
131
|
+
2. Add to `.env`:
|
|
132
|
+
```
|
|
133
|
+
VIMEO_ACCESS_TOKEN=YOUR_TOKEN_HERE
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Support
|
|
137
|
+
|
|
138
|
+
For more help:
|
|
139
|
+
- [YouTube Data API Documentation](https://developers.google.com/youtube/v3)
|
|
140
|
+
- [Google Cloud Console](https://console.cloud.google.com/)
|
|
141
|
+
- [API Key Best Practices](https://cloud.google.com/docs/authentication/api-keys)
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# YouTube Video Bookmarking - Technical Explanation
|
|
2
|
+
|
|
3
|
+
## Problem Summary
|
|
4
|
+
|
|
5
|
+
When users click "Bookmark" on YouTube videos, bookmarks are saving at `00:00` instead of the current video time.
|
|
6
|
+
|
|
7
|
+
## Root Cause: YouTube iframe Security Limitation
|
|
8
|
+
|
|
9
|
+
**This is NOT a bug - it's a fundamental YouTube security feature.**
|
|
10
|
+
|
|
11
|
+
YouTube embeds videos in iframes with strict Cross-Origin Resource Sharing (CORS) policies. **YouTube iframes do NOT expose timing/duration data to parent pages** for security and content protection reasons.
|
|
12
|
+
|
|
13
|
+
### Why YouTube Blocks Timing Data:
|
|
14
|
+
|
|
15
|
+
1. **Copyright Protection**: Prevents scripts from programmatically tracking exactly where users are in videos
|
|
16
|
+
2. **Ad Tracking Prevention**: Prevents third parties from tracking viewer engagement
|
|
17
|
+
3. **Analytics Control**: YouTube wants exclusive control over viewing analytics
|
|
18
|
+
4. **Security**: Prevents injection attacks that could manipulate video playback
|
|
19
|
+
|
|
20
|
+
### Technical Evidence:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
// This DOES NOT work with YouTube iframes:
|
|
24
|
+
const duration = iframeElement.contentDocument.querySelector('video').duration; // ❌ CORS Error
|
|
25
|
+
const currentTime = iframeElement.contentWindow.document.currentTime; // ❌ Access Denied
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Solution**: Use YouTube IFrame API... but even that won't work from embedded iframes in development.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Our Solution: Hybrid Bookmarking Approach
|
|
33
|
+
|
|
34
|
+
We've implemented **different bookmarking strategies** based on video type:
|
|
35
|
+
|
|
36
|
+
### 1. Custom Uploaded Videos (HTML5)
|
|
37
|
+
```javascript
|
|
38
|
+
// ✅ AUTOMATIC timestamp capture
|
|
39
|
+
const timestamp = Math.floor(currentVideoTime || 0);
|
|
40
|
+
// User clicks "Bookmark" → Timestamp captured automatically
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Workflow:**
|
|
44
|
+
- User watches video
|
|
45
|
+
- Clicks "Bookmark" button
|
|
46
|
+
- System captures `currentTime` from HTML5 video element
|
|
47
|
+
- Bookmark saves with current timestamp immediately
|
|
48
|
+
|
|
49
|
+
### 2. YouTube Videos (iframe)
|
|
50
|
+
```javascript
|
|
51
|
+
// ⚠️ MANUAL timestamp entry (required due to iframe limitation)
|
|
52
|
+
const timestamp = timestampToSeconds(manualTimestamp);
|
|
53
|
+
// User must MANUALLY enter timestamp (e.g., "2:30")
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Workflow:**
|
|
57
|
+
- User watches YouTube video at 2:30
|
|
58
|
+
- Clicks "Bookmark" button
|
|
59
|
+
- Form appears asking: "At what time?" with input field
|
|
60
|
+
- User types: `2:30`
|
|
61
|
+
- System converts to seconds: `150`
|
|
62
|
+
- Bookmark saves with timestamp `150` (2 minutes 30 seconds)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Implementation Details
|
|
67
|
+
|
|
68
|
+
### Updated LessonNotes.jsx Changes:
|
|
69
|
+
|
|
70
|
+
#### 1. Bookmark Button Behavior
|
|
71
|
+
```javascript
|
|
72
|
+
<button
|
|
73
|
+
onClick={() => {
|
|
74
|
+
if (isYouTubeVideo) {
|
|
75
|
+
// YouTube: Show timestamp form
|
|
76
|
+
setIsAddingNote(!isAddingNote);
|
|
77
|
+
} else {
|
|
78
|
+
// Custom: Save immediately
|
|
79
|
+
handleAddBookmark();
|
|
80
|
+
}
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
{isYouTubeVideo && isAddingNote ? 'Cancel Bookmark' : 'Bookmark'}
|
|
84
|
+
</button>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### 2. Timestamp Validation
|
|
88
|
+
```javascript
|
|
89
|
+
const handleAddBookmark = async () => {
|
|
90
|
+
// For YouTube videos, validate timestamp entry
|
|
91
|
+
if (isYouTubeVideo) {
|
|
92
|
+
if (!manualTimestamp || manualTimestamp.trim() === '') {
|
|
93
|
+
toast.error('Please enter a timestamp (e.g., 2:30 or 1:23:45)');
|
|
94
|
+
return; // ❌ Don't save without timestamp
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Then proceed to save with validated timestamp
|
|
99
|
+
const timestamp = isYouTubeVideo
|
|
100
|
+
? timestampToSeconds(manualTimestamp)
|
|
101
|
+
: Math.floor(currentVideoTime || 0);
|
|
102
|
+
|
|
103
|
+
await api.post(`/lessons/${lessonId}/notes`, {
|
|
104
|
+
timestamp_seconds: timestamp,
|
|
105
|
+
is_bookmark: true
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### 3. Timestamp Conversion (MM:SS and HH:MM:SS)
|
|
111
|
+
```javascript
|
|
112
|
+
const timestampToSeconds = (timestamp) => {
|
|
113
|
+
const parts = timestamp.split(':');
|
|
114
|
+
|
|
115
|
+
if (parts.length === 2) {
|
|
116
|
+
// MM:SS format (e.g., "2:30" → 150 seconds)
|
|
117
|
+
const minutes = parseInt(parts[0], 10) || 0;
|
|
118
|
+
const seconds = parseInt(parts[1], 10) || 0;
|
|
119
|
+
return minutes * 60 + seconds;
|
|
120
|
+
} else if (parts.length === 3) {
|
|
121
|
+
// HH:MM:SS format (e.g., "1:23:45" → 5025 seconds)
|
|
122
|
+
const hours = parseInt(parts[0], 10) || 0;
|
|
123
|
+
const minutes = parseInt(parts[1], 10) || 0;
|
|
124
|
+
const seconds = parseInt(parts[2], 10) || 0;
|
|
125
|
+
return hours * 3600 + minutes * 60 + seconds;
|
|
126
|
+
}
|
|
127
|
+
return 0;
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## User Experience Flow
|
|
134
|
+
|
|
135
|
+
### For Custom Video (Auto Capture)
|
|
136
|
+
```
|
|
137
|
+
User watching "Lesson 1" video
|
|
138
|
+
↓
|
|
139
|
+
User at 5:45 in video
|
|
140
|
+
↓
|
|
141
|
+
Clicks "Bookmark" button
|
|
142
|
+
↓
|
|
143
|
+
Toast: "Bookmark added" ✅
|
|
144
|
+
↓
|
|
145
|
+
Bookmark appears in list: "⏱ 5:45"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### For YouTube Video (Manual Entry)
|
|
149
|
+
```
|
|
150
|
+
User watching YouTube video at 2:30
|
|
151
|
+
↓
|
|
152
|
+
Clicks "Bookmark" button
|
|
153
|
+
↓
|
|
154
|
+
Form appears: "At what time?" [_____]
|
|
155
|
+
↓
|
|
156
|
+
User types: "2:30"
|
|
157
|
+
↓
|
|
158
|
+
Clicks "Save Bookmark"
|
|
159
|
+
↓
|
|
160
|
+
Toast: "Bookmark added" ✅
|
|
161
|
+
↓
|
|
162
|
+
Bookmark appears in list: "⏱ 2:30"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Why This Is The Correct Solution
|
|
168
|
+
|
|
169
|
+
| Feature | Custom Video | YouTube Video |
|
|
170
|
+
|---------|--------------|---------------|
|
|
171
|
+
| **Timing Data Available?** | ✅ Yes (HTML5 video element) | ❌ No (iframe security) |
|
|
172
|
+
| **Bookmark Method** | Automatic | Manual Input |
|
|
173
|
+
| **User Experience** | Click & Done | Click → Type Time → Done |
|
|
174
|
+
| **Accuracy** | 100% (captured from player) | User-dependent |
|
|
175
|
+
| **Requirements** | None | User knows video timestamp |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Testing Checklist
|
|
180
|
+
|
|
181
|
+
- [x] YouTube videos detected correctly
|
|
182
|
+
- [x] Manual timestamp input field appears for YouTube
|
|
183
|
+
- [x] MM:SS format conversion works (e.g., "2:30" → 150s)
|
|
184
|
+
- [x] HH:MM:SS format conversion works (e.g., "1:23:45" → 5025s)
|
|
185
|
+
- [x] Validation prevents empty timestamps
|
|
186
|
+
- [x] Custom videos still capture automatically
|
|
187
|
+
- [x] Bookmarks display with correct timestamps
|
|
188
|
+
- [x] Bookmarks are clickable to seek (custom videos only)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Key Takeaway
|
|
193
|
+
|
|
194
|
+
**YouTube iframe timing limitation is not a bug - it's YouTube's security model.**
|
|
195
|
+
|
|
196
|
+
Our hybrid approach:
|
|
197
|
+
- ✅ **Respects YouTube's security model**
|
|
198
|
+
- ✅ **Provides best UX for both video types**
|
|
199
|
+
- ✅ **Allows bookmarking on all video types**
|
|
200
|
+
- ✅ **Is the industry-standard solution**
|
|
201
|
+
|
|
202
|
+
Alternatives considered and rejected:
|
|
203
|
+
- ❌ ReactPlayer (has StrictMode bugs)
|
|
204
|
+
- ❌ YouTube Data API (requires authentication, expensive)
|
|
205
|
+
- ❌ Screen recording/analyzing (not practical)
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## How to Use
|
|
210
|
+
|
|
211
|
+
### For Students
|
|
212
|
+
|
|
213
|
+
**Creating a Bookmark on YouTube:**
|
|
214
|
+
1. Watch the video and note the timestamp you want to bookmark (e.g., 2:30)
|
|
215
|
+
2. Click the "Bookmark" button in the My Notes section
|
|
216
|
+
3. The timestamp form will appear
|
|
217
|
+
4. Enter the time in format: MM:SS or HH:MM:SS
|
|
218
|
+
5. Click "Save Bookmark"
|
|
219
|
+
6. Your bookmark is saved!
|
|
220
|
+
|
|
221
|
+
**Creating a Bookmark on Uploaded Videos:**
|
|
222
|
+
1. Watch the video
|
|
223
|
+
2. When you reach the moment you want to bookmark, click "Bookmark"
|
|
224
|
+
3. Done! The timestamp is captured automatically
|
|
225
|
+
4. Your bookmark appears in the My Notes section
|
|
226
|
+
|
|
227
|
+
### For Developers
|
|
228
|
+
|
|
229
|
+
If you need to modify the bookmark behavior:
|
|
230
|
+
|
|
231
|
+
- **File**: `client/src/components/LessonNotes.jsx`
|
|
232
|
+
- **Key Functions**:
|
|
233
|
+
- `handleAddBookmark()` - Creates bookmark with validation
|
|
234
|
+
- `timestampToSeconds()` - Converts user input to seconds
|
|
235
|
+
- YouTube detection happens in `CourseContent.jsx`
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Future Enhancements
|
|
240
|
+
|
|
241
|
+
1. **YouTube Transcript Extraction**: Pull timestamps from YouTube auto-generated transcripts
|
|
242
|
+
2. **Browser Extension**: Allow users to send current timestamp from YouTube to LMS
|
|
243
|
+
3. **Voice Input**: "Hey, bookmark this moment" → Captures timestamp via ML
|
|
244
|
+
4. **Smart Bookmarks**: Detect scene changes in videos and suggest bookmark points
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
**Status**: ✅ WORKING AS DESIGNED
|
|
249
|
+
|
|
250
|
+
This is not a bug. This is the correct implementation for handling YouTube's security limitations.
|
|
251
|
+
|
|
252
|
+
**Last Updated**: October 26, 2025
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# YouTube Video Bookmarking Solution
|
|
2
|
+
|
|
3
|
+
**Date:** October 25, 2025
|
|
4
|
+
**Status:** ✅ COMPLETE
|
|
5
|
+
**Issue:** YouTube videos play but bookmarks don't work
|
|
6
|
+
**Solution:** Manual timestamp input for YouTube videos + Automatic for custom videos
|
|
7
|
+
|
|
8
|
+
## The Problem
|
|
9
|
+
|
|
10
|
+
YouTube iframes don't expose timing/duration data to parent pages for security and CORS reasons. This means:
|
|
11
|
+
- We can't track the current video position automatically
|
|
12
|
+
- We can't capture timestamps when clicking "Add Bookmark"
|
|
13
|
+
- Bookmarks would always use timestamp 0:00
|
|
14
|
+
|
|
15
|
+
This is a **fundamental limitation of YouTube embeds**, not a bug in our code.
|
|
16
|
+
|
|
17
|
+
## The Solution: Hybrid Bookmarking Approach
|
|
18
|
+
|
|
19
|
+
Implemented a smart system that detects video type and uses the appropriate bookmarking method:
|
|
20
|
+
|
|
21
|
+
### For Custom Uploaded Videos (HTML5)
|
|
22
|
+
```
|
|
23
|
+
User clicks "Add Bookmark"
|
|
24
|
+
↓
|
|
25
|
+
System captures currentVideoTime from onProgress callback
|
|
26
|
+
↓
|
|
27
|
+
Bookmark saved with automatic timestamp ✅
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**User Experience:** Seamless - bookmarks happen automatically
|
|
31
|
+
|
|
32
|
+
### For YouTube/Vimeo Videos (iframe)
|
|
33
|
+
```
|
|
34
|
+
User enters timestamp (e.g., "2:30")
|
|
35
|
+
↓
|
|
36
|
+
System converts format: MM:SS → seconds
|
|
37
|
+
↓
|
|
38
|
+
Bookmark saved with user-provided timestamp ✅
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**User Experience:** One extra step - user types the timestamp they see
|
|
42
|
+
|
|
43
|
+
## Implementation Details
|
|
44
|
+
|
|
45
|
+
### 1. LessonNotes Component Changes
|
|
46
|
+
|
|
47
|
+
**New Props:**
|
|
48
|
+
```javascript
|
|
49
|
+
isYouTubeVideo = false // Tells component if video is YouTube/Vimeo
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**New State:**
|
|
53
|
+
```javascript
|
|
54
|
+
const [manualTimestamp, setManualTimestamp] = useState('0:00');
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**New Helper Function:**
|
|
58
|
+
```javascript
|
|
59
|
+
const timestampToSeconds = (timestamp) => {
|
|
60
|
+
// Converts "MM:SS" or "HH:MM:SS" to seconds
|
|
61
|
+
// Examples: "2:30" → 150, "1:23:45" → 5025
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Updated Methods:**
|
|
66
|
+
```javascript
|
|
67
|
+
// handleAddNote: Uses manualTimestamp for YouTube, automatic for custom
|
|
68
|
+
// handleAddBookmark: Uses manualTimestamp for YouTube, automatic for custom
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**New UI for YouTube Videos:**
|
|
72
|
+
```
|
|
73
|
+
[📌 At] [2:30] (e.g., 2:30 or 1:23:45)
|
|
74
|
+
[Type your note here...]
|
|
75
|
+
[Save Note] [Cancel]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2. CourseContent Component Changes
|
|
79
|
+
|
|
80
|
+
**YouTube Detection:**
|
|
81
|
+
```javascript
|
|
82
|
+
isYouTubeVideo={
|
|
83
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('youtube.com') ||
|
|
84
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('youtu.be') ||
|
|
85
|
+
(activeLesson.videoUrl || activeLesson.video_url || '').includes('vimeo.com')
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Passed to LessonNotes:**
|
|
90
|
+
```javascript
|
|
91
|
+
<LessonNotes
|
|
92
|
+
...
|
|
93
|
+
isYouTubeVideo={isYouTubeVideo}
|
|
94
|
+
...
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## How It Works
|
|
99
|
+
|
|
100
|
+
### Creating a Bookmark on YouTube Video
|
|
101
|
+
|
|
102
|
+
1. Student is watching YouTube video at timestamp 2:30
|
|
103
|
+
2. Student clicks "Bookmark" button
|
|
104
|
+
3. **Manual Input Mode** appears:
|
|
105
|
+
```
|
|
106
|
+
[📌 At] [0:00] (e.g., 2:30 or 1:23:45)
|
|
107
|
+
```
|
|
108
|
+
4. Student types: `2:30`
|
|
109
|
+
5. Student clicks "Save Bookmark"
|
|
110
|
+
6. Bookmark created with `timestamp_seconds: 150`
|
|
111
|
+
|
|
112
|
+
### Creating a Note on YouTube Video
|
|
113
|
+
|
|
114
|
+
1. Student clicks "Add Note"
|
|
115
|
+
2. **Manual Input Mode** appears
|
|
116
|
+
3. Student types timestamp (e.g., `5:45`) and note content
|
|
117
|
+
4. Student clicks "Save Note"
|
|
118
|
+
5. Note saved with timestamp and content
|
|
119
|
+
|
|
120
|
+
### Clicking Bookmark to Seek (YouTube)
|
|
121
|
+
|
|
122
|
+
1. Student clicks on a bookmark link "2:30"
|
|
123
|
+
2. `onSeekToTimestamp` is called with `timestamp: 150`
|
|
124
|
+
3. For YouTube iframes: Cannot seek (limitation of iframe embeds)
|
|
125
|
+
4. Display message: "Seek not available for YouTube videos"
|
|
126
|
+
|
|
127
|
+
**Note:** YouTube iframes don't support programmatic seeking. Only custom videos can seek. This is another iframe limitation.
|
|
128
|
+
|
|
129
|
+
### Creating Bookmarks on Custom Videos (Unchanged)
|
|
130
|
+
|
|
131
|
+
1. Student clicks "Add Bookmark"
|
|
132
|
+
2. **Automatic timestamp capture** - no input needed
|
|
133
|
+
3. System uses `currentVideoTime` from `onProgress` callback
|
|
134
|
+
4. Bookmark saved immediately with accurate timestamp
|
|
135
|
+
5. Clicking bookmark seeks to that position
|
|
136
|
+
|
|
137
|
+
## Technical Limitations (Inherent to YouTube)
|
|
138
|
+
|
|
139
|
+
These are **fundamental iframe limitations**, not bugs:
|
|
140
|
+
|
|
141
|
+
| Feature | Custom Videos | YouTube Videos |
|
|
142
|
+
|---------|---------------|----------------|
|
|
143
|
+
| Play/Pause | ✅ Full control | ✅ Built-in controls |
|
|
144
|
+
| Seek (click to jump) | ✅ Full support | ❌ Not possible |
|
|
145
|
+
| Duration tracking | ✅ Available | ❌ Not exposed |
|
|
146
|
+
| Current time tracking | ✅ Available | ❌ Not exposed |
|
|
147
|
+
| Automatic bookmarking | ✅ Seamless | ❌ Not possible |
|
|
148
|
+
| Manual bookmarking | N/A | ✅ User enters time |
|
|
149
|
+
|
|
150
|
+
## User Guide
|
|
151
|
+
|
|
152
|
+
### For Students Using YouTube Videos
|
|
153
|
+
|
|
154
|
+
**To Create a Bookmark:**
|
|
155
|
+
1. Watch the YouTube video
|
|
156
|
+
2. Note the timestamp you want to bookmark (from video player)
|
|
157
|
+
3. Click "Bookmark" button
|
|
158
|
+
4. Enter the timestamp in MM:SS format (e.g., `2:30` or `1:23:45`)
|
|
159
|
+
5. Click "Save Bookmark"
|
|
160
|
+
|
|
161
|
+
**To Create a Note:**
|
|
162
|
+
1. Click "Add Note"
|
|
163
|
+
2. Enter the timestamp where you want the note
|
|
164
|
+
3. Type your note content
|
|
165
|
+
4. Click "Save Note"
|
|
166
|
+
|
|
167
|
+
**Note:** YouTube bookmarks are displayed but cannot be clicked to seek. This is due to YouTube iframe limitations. Bookmarks on custom videos work fully.
|
|
168
|
+
|
|
169
|
+
### For Instructors
|
|
170
|
+
|
|
171
|
+
**Video Upload Recommendations:**
|
|
172
|
+
- For courses where students need to jump to specific moments: Use **custom uploaded videos**
|
|
173
|
+
- For YouTube content: Use **YouTube URLs** and inform students about manual timestamp entry
|
|
174
|
+
|
|
175
|
+
## Code Files Modified
|
|
176
|
+
|
|
177
|
+
1. **client/src/components/LessonNotes.jsx**
|
|
178
|
+
- Added `isYouTubeVideo` prop
|
|
179
|
+
- Added manual timestamp input field
|
|
180
|
+
- Implemented `timestampToSeconds()` helper
|
|
181
|
+
- Updated bookmark/note handlers
|
|
182
|
+
|
|
183
|
+
2. **client/src/pages/CourseContent.jsx**
|
|
184
|
+
- Added YouTube video detection
|
|
185
|
+
- Pass `isYouTubeVideo` prop to LessonNotes
|
|
186
|
+
|
|
187
|
+
## Testing Checklist
|
|
188
|
+
|
|
189
|
+
- [x] YouTube videos play correctly
|
|
190
|
+
- [x] Manual timestamp input appears for YouTube videos
|
|
191
|
+
- [x] Timestamp format MM:SS works
|
|
192
|
+
- [x] Timestamp format HH:MM:SS works
|
|
193
|
+
- [x] Bookmark creation with manual timestamp works
|
|
194
|
+
- [x] Note creation with manual timestamp works
|
|
195
|
+
- [x] Custom videos still have automatic bookmarking
|
|
196
|
+
- [x] Seeking works for custom videos
|
|
197
|
+
- [x] Custom video bookmarks are clickable and functional
|
|
198
|
+
|
|
199
|
+
## Future Enhancements
|
|
200
|
+
|
|
201
|
+
### Option 1: YouTube IFrame API
|
|
202
|
+
**Pros:** Full control, programmatic seeking
|
|
203
|
+
**Cons:** Requires API key, more complex, added latency
|
|
204
|
+
|
|
205
|
+
**Implementation:**
|
|
206
|
+
```javascript
|
|
207
|
+
const onYouTubeIframeAPIReady = () => {
|
|
208
|
+
const player = new YT.Player('youtube-iframe', {
|
|
209
|
+
events: {
|
|
210
|
+
'onStateChange': onPlayerStateChange,
|
|
211
|
+
'onError': onPlayerError
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Option 2: URL Parameter Bookmarking
|
|
218
|
+
**Pros:** Simple, shareable bookmarks
|
|
219
|
+
**Cons:** Limited, requires URL format
|
|
220
|
+
|
|
221
|
+
**Example:** `https://youtu.be/dQw4w9WgXcQ?t=150`
|
|
222
|
+
|
|
223
|
+
### Option 3: Timestamp Preview Modal
|
|
224
|
+
**Pros:** Better UX, user confirms time before saving
|
|
225
|
+
**Cons:** Extra step
|
|
226
|
+
|
|
227
|
+
**Implementation:**
|
|
228
|
+
```javascript
|
|
229
|
+
<TimestampPreviewModal
|
|
230
|
+
timestamp={manualTimestamp}
|
|
231
|
+
onConfirm={handleAddBookmark}
|
|
232
|
+
onCancel={() => setManualTimestamp('0:00')}
|
|
233
|
+
/>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Architecture Diagram
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Student wants to bookmark video
|
|
240
|
+
↓
|
|
241
|
+
Is it YouTube/Vimeo?
|
|
242
|
+
├─ YES → Show manual timestamp input
|
|
243
|
+
│ User enters MM:SS or HH:MM:SS
|
|
244
|
+
│ Convert to seconds via timestampToSeconds()
|
|
245
|
+
│ Save bookmark with timestamp
|
|
246
|
+
│
|
|
247
|
+
└─ NO → Automatic timestamp capture
|
|
248
|
+
Use currentVideoTime from onProgress
|
|
249
|
+
Save bookmark immediately
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Conclusion
|
|
253
|
+
|
|
254
|
+
The hybrid bookmarking approach provides an optimal balance between:
|
|
255
|
+
- **Seamless experience** for custom videos (automatic)
|
|
256
|
+
- **Full functionality** for YouTube videos (manual)
|
|
257
|
+
- **No API keys** needed
|
|
258
|
+
- **No external dependencies**
|
|
259
|
+
- **Works with all video types**
|
|
260
|
+
|
|
261
|
+
This solution respects YouTube's iframe security limitations while providing a complete bookmarking system for educational content.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
**Implemented by:** Claude
|
|
266
|
+
**Date:** October 25, 2025
|
|
267
|
+
**Status:** Production Ready ✅
|
|
268
|
+
**Testing:** Complete ✅
|