@vfrey/vfrey 0.0.1 → 1.0.0-beta.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/LICENSE +33 -0
- package/README.md +78 -3
- package/accounts.example.json +61 -0
- package/accounts.first-run.json +41 -0
- package/bin/vfrey.mjs +36 -0
- package/integration-tools/README.md +43 -0
- package/integration-tools/image/pillow.md +32 -0
- package/integration-tools/image/playwright.md +33 -0
- package/integration-tools/image/resvg.md +36 -0
- package/integration-tools/image/satori.md +36 -0
- package/integration-tools/image/sharp.md +38 -0
- package/integration-tools/video/blender.md +34 -0
- package/integration-tools/video/ffmpeg.md +41 -0
- package/integration-tools/video/manim.md +37 -0
- package/integration-tools/video/motion-canvas.md +37 -0
- package/integration-tools/video/remotion.md +50 -0
- package/integration-tools/video/revideo.md +32 -0
- package/package.json +74 -6
- package/skills/vfrey-orchestrator/SKILL.md +15 -0
- package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
- package/skills/vfrey-product/SKILL.md +63 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
- package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
- package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
- package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
- package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
- package/skills/vfrey-product/push/SKILL.md +15 -0
- package/skills/vfrey-product/scenes/NOTICE +5 -0
- package/skills/vfrey-product/scenes/blocks.md +57 -0
- package/skills/vfrey-product/scenes/craft.md +118 -0
- package/skills/vfrey-product/scenes/motion.md +88 -0
- package/src/analytics/dashboard.ts +109 -0
- package/src/analytics/index.ts +260 -0
- package/src/api/client.ts +361 -0
- package/src/api/cloud-files.ts +197 -0
- package/src/api/cloud-runs.ts +75 -0
- package/src/api/cloud.ts +413 -0
- package/src/api/commands.ts +330 -0
- package/src/api/config.ts +34 -0
- package/src/api/creators.ts +463 -0
- package/src/api/credentials.ts +152 -0
- package/src/api/mail.ts +333 -0
- package/src/api/topics.ts +207 -0
- package/src/api/types.ts +273 -0
- package/src/cli.ts +468 -0
- package/src/cloud/bundle.ts +70 -0
- package/src/cloud/cloudrun-executor.ts +237 -0
- package/src/cloud/executor.ts +281 -0
- package/src/cloud/gcs-sign.ts +76 -0
- package/src/cloud/job.ts +106 -0
- package/src/cloud/remote-job.ts +67 -0
- package/src/cloud/render-job.ts +191 -0
- package/src/config.ts +309 -0
- package/src/dashboard-link.ts +180 -0
- package/src/dashboard-start.ts +103 -0
- package/src/desk/channel.ts +64 -0
- package/src/desk/cli.ts +216 -0
- package/src/desk/creators-route.ts +129 -0
- package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
- package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
- package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
- package/src/desk/http.ts +460 -0
- package/src/desk/mail-route.ts +103 -0
- package/src/desk/overlay.ts +112 -0
- package/src/desk/preview.ts +422 -0
- package/src/desk/screens.ts +149 -0
- package/src/desk/secrets.ts +143 -0
- package/src/desk/series.ts +127 -0
- package/src/desk/state.ts +77 -0
- package/src/desk/studio-route.ts +119 -0
- package/src/desk/tick-runner.ts +66 -0
- package/src/desk/tick.ts +56 -0
- package/src/desk/topics-route.ts +41 -0
- package/src/desk/ui/app.css +505 -0
- package/src/desk/ui/app.js +185 -0
- package/src/desk/ui/apple-icon.png +0 -0
- package/src/desk/ui/components.js +79 -0
- package/src/desk/ui/core.js +156 -0
- package/src/desk/ui/favicon.ico +0 -0
- package/src/desk/ui/icon.svg +1 -0
- package/src/desk/ui/icons.js +49 -0
- package/src/desk/ui/index.html +41 -0
- package/src/desk/ui/metrics-math.d.ts +22 -0
- package/src/desk/ui/metrics-math.js +135 -0
- package/src/desk/ui/theme.js +5 -0
- package/src/desk/ui/views-creators.js +209 -0
- package/src/desk/ui/views-keys.js +114 -0
- package/src/desk/ui/views-mail.js +188 -0
- package/src/desk/ui/views-misc.js +123 -0
- package/src/desk/ui/views-review.js +119 -0
- package/src/desk/ui/views-runs.js +350 -0
- package/src/desk/ui/views-screens.js +163 -0
- package/src/desk/ui/views-series.js +318 -0
- package/src/desk/ui/views-topics.js +87 -0
- package/src/desk/verbs.ts +361 -0
- package/src/doctor.ts +212 -0
- package/src/drain.ts +14 -0
- package/src/engage/index.ts +217 -0
- package/src/generate/index.ts +110 -0
- package/src/generate/script.ts +152 -0
- package/src/generate/title.ts +78 -0
- package/src/help.ts +252 -0
- package/src/home.ts +45 -0
- package/src/llm/client.ts +177 -0
- package/src/log.ts +7 -0
- package/src/oauth/tokens.ts +189 -0
- package/src/oauth/vault.ts +72 -0
- package/src/pipeline/review.ts +642 -0
- package/src/pipeline/run.ts +443 -0
- package/src/pipeline/series-guard.ts +26 -0
- package/src/pipeline/source-fetch.ts +69 -0
- package/src/pipeline/stages.ts +728 -0
- package/src/pipeline/topics-source.ts +90 -0
- package/src/product/commands.ts +296 -0
- package/src/product/config-file.ts +38 -0
- package/src/product/engine-choice.ts +89 -0
- package/src/product/engines.ts +103 -0
- package/src/product/insights.ts +50 -0
- package/src/product/keys.ts +67 -0
- package/src/product/paths.ts +18 -0
- package/src/product/probes.ts +88 -0
- package/src/product/push-flow.ts +90 -0
- package/src/product/render-video.ts +21 -0
- package/src/product/short.ts +62 -0
- package/src/product/update.ts +32 -0
- package/src/project/canonical.ts +14 -0
- package/src/project/commands.ts +177 -0
- package/src/project/dashboard-status.ts +28 -0
- package/src/project/discover.ts +19 -0
- package/src/project/index-file.ts +73 -0
- package/src/project/marker.ts +92 -0
- package/src/project/migrate.ts +201 -0
- package/src/project/names.ts +27 -0
- package/src/project/notice.ts +16 -0
- package/src/project/open.ts +88 -0
- package/src/project/scaffold.ts +112 -0
- package/src/project/templates.ts +42 -0
- package/src/project/videos.ts +64 -0
- package/src/publish/facebook.ts +91 -0
- package/src/publish/index.ts +12 -0
- package/src/publish/instagram.ts +97 -0
- package/src/publish/rate.ts +62 -0
- package/src/publish/session.ts +242 -0
- package/src/publish/tiktok.ts +202 -0
- package/src/publish/youtube.ts +177 -0
- package/src/queue/desk-ops.ts +1170 -0
- package/src/queue/seal.ts +3 -0
- package/src/queue/store.ts +1006 -0
- package/src/remotion/AiLabel.tsx +26 -0
- package/src/remotion/Root.tsx +73 -0
- package/src/remotion/defaults.ts +26 -0
- package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
- package/src/remotion/films/engine/EngineMark.tsx +17 -0
- package/src/remotion/films/rea/ReaShort.tsx +552 -0
- package/src/remotion/films/rea/drawings.tsx +907 -0
- package/src/remotion/films/rea/timing.ts +144 -0
- package/src/remotion/index.ts +4 -0
- package/src/remotion/templates/EditorialSplit.tsx +39 -0
- package/src/remotion/templates/KineticType.tsx +39 -0
- package/src/remotion/templates/SignalBoard.tsx +50 -0
- package/src/remotion/timing.ts +22 -0
- package/src/render/chrome.ts +78 -0
- package/src/render/engine-mark.ts +29 -0
- package/src/render/framey-template.ts +130 -0
- package/src/render/html-engine.ts +149 -0
- package/src/render/node-crypto-stub.ts +11 -0
- package/src/render/probe.ts +29 -0
- package/src/render/props.ts +17 -0
- package/src/render/vertical-short.ts +35 -0
- package/src/render/webpack.ts +33 -0
- package/src/render/worker.ts +65 -0
- package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
- package/src/scene/assets/fonts/titan-one.woff2 +0 -0
- package/src/scene/assets/gsap/LICENSE.txt +8 -0
- package/src/scene/assets/gsap/gsap.min.js +11 -0
- package/src/scene/audio.ts +54 -0
- package/src/scene/blocks/LICENSE +190 -0
- package/src/scene/blocks/NOTICE +5 -0
- package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
- package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
- package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
- package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
- package/src/scene/blocks/code-diff/code-diff.html +817 -0
- package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
- package/src/scene/blocks/code-typing/code-typing.html +764 -0
- package/src/scene/blocks/data-chart/data-chart.html +452 -0
- package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
- package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
- package/src/scene/blocks/index.json +824 -0
- package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
- package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
- package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
- package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
- package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
- package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
- package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
- package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
- package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
- package/src/scene/blocks/mk-background/mk-background.html +236 -0
- package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
- package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
- package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
- package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
- package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
- package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
- package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
- package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
- package/src/scene/blocks/snow/snow.html +205 -0
- package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
- package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
- package/src/scene/blocks/starfield/starfield.html +188 -0
- package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
- package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
- package/src/scene/blocks/x-post/x-post.html +437 -0
- package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
- package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
- package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
- package/src/scene/blocks.ts +229 -0
- package/src/scene/command.ts +272 -0
- package/src/scene/figure.ts +181 -0
- package/src/scene/glyphs.ts +107 -0
- package/src/scene/init.ts +86 -0
- package/src/scene/inspect/css-tree.d.ts +6 -0
- package/src/scene/inspect/page-scripts.ts +272 -0
- package/src/scene/inspect/report.ts +405 -0
- package/src/scene/inspect/run.ts +200 -0
- package/src/scene/inspect/source.ts +236 -0
- package/src/scene/label.ts +131 -0
- package/src/scene/net-guard.ts +74 -0
- package/src/scene/render.ts +292 -0
- package/src/scene/runtime/browser.ts +199 -0
- package/src/scene/runtime/core.ts +181 -0
- package/src/scene/runtime/react.tsx +115 -0
- package/src/scene/runtime/transitions.ts +133 -0
- package/src/scene/sanitize.ts +181 -0
- package/src/scene/scene.ts +152 -0
- package/src/scene/studio-command.ts +48 -0
- package/src/scene/studio-skin.ts +59 -0
- package/src/scene/studio.ts +337 -0
- package/src/scene/supply.ts +111 -0
- package/src/scene/timing.ts +288 -0
- package/src/scene/transitions/LICENSE +190 -0
- package/src/scene/transitions/NOTICE +5 -0
- package/src/scene/transitions/SOURCE.json +24 -0
- package/src/scene/transitions/transitions.global.js +38 -0
- package/src/scene/transitions.ts +26 -0
- package/src/service/all-projects.ts +153 -0
- package/src/service/commands.ts +256 -0
- package/src/service/due.ts +82 -0
- package/src/service/lock.ts +101 -0
- package/src/service/log-file.ts +56 -0
- package/src/service/state.ts +41 -0
- package/src/service/units.ts +90 -0
- package/src/service/worker.ts +51 -0
- package/src/skill-agents.ts +74 -0
- package/src/skill-install.ts +334 -0
- package/src/sync-write.ts +21 -0
- package/src/tick-report.ts +205 -0
- package/src/tts.ts +124 -0
- package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
- package/vendor/@vfrey/contracts/dist/account.js +27 -0
- package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
- package/vendor/@vfrey/contracts/dist/checks.js +1 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
- package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
- package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
- package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
- package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
- package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
- package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
- package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
- package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
- package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
- package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
- package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
- package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
- package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
- package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
- package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
- package/vendor/@vfrey/contracts/dist/events.js +1 -0
- package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
- package/vendor/@vfrey/contracts/dist/http.js +37 -0
- package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
- package/vendor/@vfrey/contracts/dist/index.js +22 -0
- package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
- package/vendor/@vfrey/contracts/dist/log.js +10 -0
- package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
- package/vendor/@vfrey/contracts/dist/mail.js +1 -0
- package/vendor/@vfrey/contracts/package.json +18 -0
- package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
- package/vendor/@vfrey/ingest/dist/index.js +221 -0
- package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
- package/vendor/@vfrey/ingest/dist/parse.js +165 -0
- package/vendor/@vfrey/ingest/package.json +21 -0
- package/vendor/framey/LICENSE +190 -0
- package/vendor/framey/NOTICE +15 -0
- package/vendor/framey/SOURCE.json +24 -0
- package/vendor/framey/STUDIO-SOURCE.json +9 -0
- package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
- package/vendor/framey/bin/framey.mjs +16 -0
- package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
- package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
- package/vendor/framey/dist/api.d.ts +211 -0
- package/vendor/framey/dist/api.js +76 -0
- package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
- package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
- package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
- package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
- package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
- package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
- package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
- package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
- package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
- package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
- package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
- package/vendor/framey/dist/check-F5N544ML.js +111 -0
- package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
- package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
- package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
- package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
- package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
- package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
- package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
- package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
- package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
- package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
- package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
- package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
- package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
- package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
- package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
- package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
- package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
- package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
- package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
- package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
- package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
- package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
- package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
- package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
- package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
- package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
- package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
- package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
- package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
- package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
- package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
- package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
- package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
- package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
- package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
- package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
- package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
- package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
- package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
- package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
- package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
- package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
- package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
- package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
- package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
- package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
- package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
- package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
- package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
- package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
- package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
- package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
- package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
- package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
- package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
- package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
- package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
- package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
- package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
- package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
- package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
- package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
- package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
- package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
- package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
- package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
- package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
- package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
- package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
- package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
- package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
- package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
- package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
- package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
- package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
- package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
- package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
- package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
- package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
- package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
- package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
- package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
- package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
- package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
- package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
- package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
- package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
- package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
- package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
- package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
- package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
- package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
- package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
- package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
- package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
- package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
- package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
- package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
- package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
- package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
- package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
- package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
- package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
- package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
- package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
- package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
- package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
- package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
- package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
- package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
- package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
- package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
- package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
- package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
- package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
- package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
- package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
- package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
- package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
- package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
- package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
- package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
- package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
- package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
- package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
- package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
- package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
- package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
- package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
- package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
- package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
- package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
- package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
- package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
- package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
- package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
- package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
- package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
- package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
- package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
- package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
- package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
- package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
- package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
- package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
- package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
- package/vendor/framey/dist/cli.js +439 -0
- package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
- package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
- package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
- package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
- package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
- package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
- package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
- package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
- package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
- package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
- package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
- package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
- package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
- package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
- package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
- package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
- package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
- package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
- package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
- package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
- package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
- package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
- package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
- package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
- package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
- package/vendor/framey/dist/fontLocalizeCli.js +142 -0
- package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
- package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
- package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
- package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
- package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
- package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
- package/vendor/framey/dist/hyperframe.manifest.json +22 -0
- package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
- package/vendor/framey/dist/hyperframes-player.global.js +478 -0
- package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
- package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
- package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
- package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
- package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
- package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
- package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
- package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
- package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
- package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
- package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
- package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
- package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
- package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
- package/vendor/framey/dist/models-K363FYM4.js +195 -0
- package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
- package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
- package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
- package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
- package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
- package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
- package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
- package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
- package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
- package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
- package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
- package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
- package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
- package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
- package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
- package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
- package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
- package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
- package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
- package/vendor/framey/dist/renderSetupWorker.js +120 -0
- package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
- package/vendor/framey/dist/runtimeVersion.js +18 -0
- package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
- package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
- package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
- package/vendor/framey/dist/sherpaWorker.js +84 -0
- package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
- package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
- package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
- package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
- package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
- package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
- package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
- package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
- package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
- package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
- package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
- package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
- package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
- package/vendor/framey/dist/studio/favicon.svg +14 -0
- package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
- package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
- package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
- package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
- package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
- package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
- package/vendor/framey/dist/studio/index.html +23 -0
- package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
- package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
- package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
- package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
- package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
- package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
- package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
- package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
- package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
- package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
- package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
- package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
- package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
- package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
- package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
- package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
- package/vendor/framey/dist/warmCheck.js +220 -0
- package/vendor/framey/dist/warmCheckClient.js +139 -0
- package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
- package/vendor/framey-player/LICENSE +190 -0
- package/vendor/framey-player/NOTICE +16 -0
- package/vendor/framey-player/SOURCE.json +6 -0
- package/vendor/framey-player/hyperframes-player.global.js +478 -0
- package/vendor/framey.pin +1 -0
- package/bin/index.js +0 -3
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Remotion
|
|
2
|
+
|
|
3
|
+
React components become frames. The frame number is the clock. A coding agent writes the component, then renders an MP4 or a PNG on this machine.
|
|
4
|
+
|
|
5
|
+
License: source is public. Free for an individual and for a for-profit organization of up to 3 employees. A larger company needs a company license. See `LICENSE.md` in `remotion-dev/remotion`.
|
|
6
|
+
|
|
7
|
+
This repo already depends on Remotion 4. The project entry is `src/remotion/index.ts`. The render port in `remotion.config.ts` is 4123. Do not render on 3000, 3001, or 3012. Those are other local apps.
|
|
8
|
+
|
|
9
|
+
## Use it when
|
|
10
|
+
|
|
11
|
+
The picture is a designed composition: type, SVG, captions, a product shot built in code. This is the default for a short in this repo.
|
|
12
|
+
|
|
13
|
+
## Do not use it when
|
|
14
|
+
|
|
15
|
+
You only need to join two files, or you only need to draw one PNG with no timeline. Use FFmpeg or an image tool.
|
|
16
|
+
|
|
17
|
+
## Example
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { AbsoluteFill, useCurrentFrame } from "remotion";
|
|
21
|
+
|
|
22
|
+
export const Hello = () => {
|
|
23
|
+
const frame = useCurrentFrame();
|
|
24
|
+
const shown = Math.min(1, frame / 20);
|
|
25
|
+
return (
|
|
26
|
+
<AbsoluteFill style={{ background: "#0f1115", color: "#f6f3ec", opacity: shown }}>
|
|
27
|
+
<h1 style={{ fontSize: 120, margin: 80 }}>Hello</h1>
|
|
28
|
+
</AbsoluteFill>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Register it in `src/remotion/Root.tsx` as a `Composition` at 1080x1920 and 30fps, then render from the pipeline directory:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx remotion render src/remotion/index.ts Hello out/hello.mp4 --port=4123
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
A still, one frame:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx remotion still src/remotion/index.ts Hello out/hello.png --frame=30 --port=4123
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Agent notes
|
|
46
|
+
|
|
47
|
+
- Drive motion from `useCurrentFrame`. Do not use CSS transitions. They do not seek.
|
|
48
|
+
- Do not set `durationInFrames` on `<Audio>`. That trims the file.
|
|
49
|
+
- Do not import `@vfrey/contracts` from a composition. The barrel pulls in `node:crypto`, and the bundle cannot resolve it. `src/render/webpack.ts` stubs that scheme for the worker render.
|
|
50
|
+
- `out/` is gitignored. The MP4 stays on the machine that rendered it.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Revideo
|
|
2
|
+
|
|
3
|
+
TypeScript scenes, rendered by a Node process you run. The authoring style is the generator style: a scene adds nodes, then yields animations. There is no hosted render in the path this file describes.
|
|
4
|
+
|
|
5
|
+
License: check `redotvideo/revideo` before you ship. Treat the local CLI as the renderer.
|
|
6
|
+
|
|
7
|
+
## Use it when
|
|
8
|
+
|
|
9
|
+
You want a TypeScript video that renders inside a server or a script you control, and you are not already inside this repo's Remotion project.
|
|
10
|
+
|
|
11
|
+
## Do not use it when
|
|
12
|
+
|
|
13
|
+
The job is a composition in `src/remotion/`. Do not start a second video stack for that.
|
|
14
|
+
|
|
15
|
+
## Example
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import {makeScene2D, Txt} from "@revideo/2d";
|
|
19
|
+
|
|
20
|
+
export default makeScene2D(function* (view) {
|
|
21
|
+
const title = new Txt({text: "Hello", fill: "#f6f3ec", fontSize: 120});
|
|
22
|
+
view.add(title);
|
|
23
|
+
yield* title.scale(1.2, 0.6);
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Render with the CLI the Revideo project documents after you install it. Read that project's `package.json` scripts. Do not guess a cloud URL.
|
|
28
|
+
|
|
29
|
+
## Agent notes
|
|
30
|
+
|
|
31
|
+
- Keep the scene file, the project file, and the output path in the repo you are editing.
|
|
32
|
+
- If the CLI name differs from the docs you remember, the installed package wins. Read it.
|
package/package.json
CHANGED
|
@@ -1,10 +1,78 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vfrey/vfrey",
|
|
3
|
-
"version": "0.0.1",
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "vfrey worker. Generate, render, publish, engage, and collect metrics.",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
-
"bin": {
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
"bin": {
|
|
8
|
+
"vfrey": "./bin/vfrey.mjs"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"src",
|
|
13
|
+
"skills",
|
|
14
|
+
"vendor",
|
|
15
|
+
"integration-tools",
|
|
16
|
+
"accounts.example.json",
|
|
17
|
+
"accounts.first-run.json",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.13"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"vfrey": "node bin/vfrey.mjs"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@vfrey/contracts": "file:vendor/@vfrey/contracts",
|
|
29
|
+
"@vfrey/ingest": "file:vendor/@vfrey/ingest",
|
|
30
|
+
"@hono/node-server": "2.1.5",
|
|
31
|
+
"@puppeteer/browsers": "3.2.6",
|
|
32
|
+
"@remotion/bundler": "4.0.537",
|
|
33
|
+
"@remotion/renderer": "4.0.537",
|
|
34
|
+
"acorn": "8.19.0",
|
|
35
|
+
"adm-zip": "0.6.1",
|
|
36
|
+
"citty": "0.2.2",
|
|
37
|
+
"compare-versions": "6.1.1",
|
|
38
|
+
"css-tree": "3.2.1",
|
|
39
|
+
"debug": "4.4.3",
|
|
40
|
+
"esbuild": "0.28.2",
|
|
41
|
+
"fontkit": "2.0.4",
|
|
42
|
+
"giget": "3.3.1",
|
|
43
|
+
"hono": "4.13.14",
|
|
44
|
+
"ignore": "5.3.2",
|
|
45
|
+
"open": "10.2.0",
|
|
46
|
+
"postcss": "8.5.31",
|
|
47
|
+
"puppeteer-core": "25.16.0",
|
|
48
|
+
"react": "19.0.0",
|
|
49
|
+
"react-dom": "19.0.0",
|
|
50
|
+
"remotion": "4.0.537",
|
|
51
|
+
"tsx": "4.19.3",
|
|
52
|
+
"yauzl": "3.4.0"
|
|
53
|
+
},
|
|
54
|
+
"optionalDependencies": {
|
|
55
|
+
"@esbuild/linux-x64": "0.28.2",
|
|
56
|
+
"@remotion/compositor-linux-x64-gnu": "4.0.537",
|
|
57
|
+
"@rollup/rollup-linux-x64-gnu": "4.64.12",
|
|
58
|
+
"@rspack/binding-linux-x64-gnu": "1.7.11"
|
|
59
|
+
},
|
|
60
|
+
"overrides": {
|
|
61
|
+
"zod": "4.6.6"
|
|
62
|
+
},
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"access": "public",
|
|
65
|
+
"tag": "beta"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://vfrey.vercel.app",
|
|
68
|
+
"keywords": [
|
|
69
|
+
"vfrey",
|
|
70
|
+
"video",
|
|
71
|
+
"shorts",
|
|
72
|
+
"youtube",
|
|
73
|
+
"remotion",
|
|
74
|
+
"ai-agent",
|
|
75
|
+
"claude-code",
|
|
76
|
+
"automation"
|
|
77
|
+
]
|
|
10
78
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vfrey-orchestrator
|
|
3
|
+
description: Operate this repo from a coding-agent session. Read the desk, run ticks, and report what the pipeline did.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The pipeline writes the video package itself, through the configured model. Your job is to run it, read what happened, and report it.
|
|
7
|
+
|
|
8
|
+
1. Read `docs/ARCHITECTURE.md`. It describes what runs today.
|
|
9
|
+
2. Read the desk with `npx vfrey desk snapshot --json`. Each series carries its `cadence` and `paused` fields. `mode` is the stored orchestrator setting (`vfrey desk mode set` writes it). The pipeline does not wait on it today.
|
|
10
|
+
3. Run `npx vfrey tick` to make a video for every due series. A series is due only when it is not paused and the cadence allows it. Add `--series <id>` for one series. Add `--now` when the person asked for a video now. A paused series is never run.
|
|
11
|
+
4. Quality and compliance checks run inside the pipeline. A `rejected` job failed a quality gate. A `blocked` job failed a compliance rule. Neither retries. Report the job's timeline from the snapshot and say which check stopped it.
|
|
12
|
+
5. Disclosure is always on. A package that is not marked synthetic is `blocked`.
|
|
13
|
+
6. Publish happens inside `tick`, and only with the operator's own platform keys. With no key, publish skips with `missing_key`.
|
|
14
|
+
7. Do not call platform APIs yourself. Do not print secrets.
|
|
15
|
+
8. Channel video design lives in `channel-style/<seriesId>/STYLE.md`. Read it when a person asks about a channel's look. See `skills/vfrey-orchestrator/channel-video/SKILL.md`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: channel-video
|
|
3
|
+
description: Produce one JSON content package for a single channel from its STYLE.md. Do not publish or review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The subagent reads this before producing a package. Return one JSON object and no other files. Do not claim the review passed. The orchestrator reviews.
|
|
7
|
+
|
|
8
|
+
1. Read only the one `STYLE.md` path in the prompt. Do not read other `channel-style/` folders.
|
|
9
|
+
2. The engine is Remotion. HyperFrames is unavailable here. If the `remotion-best-practices` skill is installed, read it before you change a template.
|
|
10
|
+
3. The pipeline picks the template, pacing, caption style, palette, hook pattern, and voice in code, and rotates them between videos. `STYLE.md` describes the channel's voice and limits. It does not pin a template.
|
|
11
|
+
4. Return one JSON object and no other files. This is the shape the pipeline writes:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"synthetic": true,
|
|
16
|
+
"candidate": {},
|
|
17
|
+
"plan": {},
|
|
18
|
+
"title": "",
|
|
19
|
+
"hook": "",
|
|
20
|
+
"beats": [],
|
|
21
|
+
"caption": "",
|
|
22
|
+
"description": "",
|
|
23
|
+
"hashtags": [],
|
|
24
|
+
"thumbnailPrompt": "",
|
|
25
|
+
"imagePrompts": [],
|
|
26
|
+
"voiceoverScript": "",
|
|
27
|
+
"durationSec": 0,
|
|
28
|
+
"assets": [],
|
|
29
|
+
"svg": []
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`candidate` matches `Candidate` in `@vfrey/contracts` (`types`): `fingerprint`, `provider`, `title`, `url`, `excerpt`, `publishedAt`. Use the source candidate from the prompt.
|
|
34
|
+
|
|
35
|
+
`plan` fields match `VariationPlan`: `templateId`, `pacing`, `captionStyle`, `paletteId`, `hookPattern`, `structure`, `hashtagStrategy`, `durationTargetSec`, `durationBucket`, `voiceId`, `coverTimestampMs`, `layoutSeed`. Take `templateId`, `pacing`, `captionStyle`, and `paletteId` from `STYLE.md`. `hookPattern` is `question`, `contrarian`, `story`, `statistic`, or `cold-open`. `structure` is `list`, `narrative`, `debate`, or `breakdown`. `hashtagStrategy` is `niche-first`, `question-led`, or `plain-language`. `durationBucket` for a 16 to 24 second video is `short`.
|
|
36
|
+
|
|
37
|
+
`beats` match `Beat`: `{ "role", "text", "caption", "seconds" }`. `role` is `hook`, `setup`, `turn`, `evidence`, `payoff`, or `cta`.
|
|
38
|
+
|
|
39
|
+
`svg` is a list of SVG document strings, one per beat, or an empty list when the template is pure Remotion props. `assets` is `{ "name", "url" }[]`. `assets[].url` is `https` or the list is empty. `synthetic` is `true`.
|
|
40
|
+
|
|
41
|
+
5. Do not publish, do not read other `channel-style/` folders, and do not claim the review passed.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vfrey-product
|
|
3
|
+
description: Help the person make videos with vfrey. Use when they ask for a video, a short, an edit, a render, to see their videos or the dashboard, or a push to YouTube or another platform. The person does not need to know the commands.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# vfrey
|
|
7
|
+
|
|
8
|
+
The person asks in plain language; you run `npx vfrey`. Everything lives in a project folder (it has a `vfrey.json`).
|
|
9
|
+
|
|
10
|
+
## Find the project
|
|
11
|
+
|
|
12
|
+
1. Look for `vfrey.json` in this folder or any folder above. Found: work there (`cd` to it). Read its `AGENTS.md` if you have not.
|
|
13
|
+
2. Not in a project and they want a video: ask where it should live (suggest `./vfrey`, or a name for their channel). Then `npm create vfrey@latest <dir>` (beta: `@beta`; `npx create-vfrey <dir>` is the same) and `cd <dir>`. If they want the current folder: `npx @vfrey/vfrey init`. Never run `npx vfrey` or `npm i vfrey` outside a project. Both are safe to repeat.
|
|
14
|
+
3. They have old videos in `~/.vfrey`: `npx vfrey init --from ~/.vfrey` imports them (the source is not changed).
|
|
15
|
+
4. `npx vfrey doctor` checks the machine; it exits 1 with a `Fix:` line when something is wrong. Relay the fix.
|
|
16
|
+
5. Skill not loaded in this agent: `npx vfrey skill install --agent <claude|codex|grok|cursor|gemini|all>` (restart Claude Code and Cursor; Gemini: `/skills reload`).
|
|
17
|
+
|
|
18
|
+
## Plain words to commands
|
|
19
|
+
|
|
20
|
+
- "show me", "open the dashboard", "where is my video": `npx vfrey open [run id | video title or path]` (reuses the project's dashboard or starts it, prints the URL; `--no-browser` only prints). Never start the dashboard any other way.
|
|
21
|
+
- "my videos": `npx vfrey videos` (newest first, with paths); "my other projects": `npx vfrey projects`.
|
|
22
|
+
- "what should I make", "trending in X": `npx vfrey topics --niche X` (ids: `topics niches`, free); cite the evidence, then `tick --now --about "<title>"`. Topics need an account and credits (`login`, `whoami`); a `✗`/`Fix:` says which is missing. "find creators / KOLs in X": `creators search --niche X` (Research plan). Outreach: draft with `npx vfrey mail draft`; NEVER approve or send unless the person says so for that specific draft; mail needs the Mail add-on.
|
|
23
|
+
- "sign in", "my plan": `npx vfrey login` (prints a link and a code to relay) or `npx vfrey whoami`. Free features never need an account. Team sync: `npx vfrey cloud link|push [--videos]|pull|status` (newest wins; the other copy is kept as `<file>.conflict-<time>`).
|
|
24
|
+
- Old machine data, update, engines: `npx vfrey desk snapshot --json`, `npx vfrey update`, `npx vfrey engine list`. A run with `status: awaiting_review` waits for the person (series review on): tell them, then `npx vfrey desk job approve|reject --id <id> [--reason T]`. `npx vfrey --help` and `npx vfrey <command> --help` list the rest.
|
|
25
|
+
|
|
26
|
+
## Make a video
|
|
27
|
+
|
|
28
|
+
You are the writer and the designer. vfrey has no model of its own; without your script the words are template filler, and without your scene the picture is a plain fallback.
|
|
29
|
+
|
|
30
|
+
1. **Script.** Write `scripts/<idea>.json`: `{ "title", "hook", "lines": [...], "hashtags": [...] }` (`npx vfrey tick --script-template` prints one). 6 to 10 short spoken lines (4 to 12 allowed, at most 220 characters each), hook first, title at most 100 characters, 1 to 8 hashtags starting with `#`. Be accurate and plain: no invented statistics, numbers, quotes or sources; leave out what you are not sure of. Use the topic's key words (the quality check rejects a script that never mentions its subject). A bad file gets a `✗` line and a `Fix:` line; a rejected script prints its reason. Fix and rerun.
|
|
31
|
+
2. **Scene.** Always design a scene for the idea (scene init, design, `--frame` preview, then tick with `--scene` and `--engine`). Use the default template only if the person explicitly asks for a quick text-only video, and say so. Every idea gets its own picture ("what's the difference?", "3 facts", "how a mutex works" look different). There are no fixed templates: never reuse one scene for a new idea.
|
|
32
|
+
- `npx vfrey scene init scenes/<idea>` writes a commented starter (`index.html`; `--engine remotion` writes `index.tsx`). Replace it. Draw SVGs yourself and `<img>` them from the folder.
|
|
33
|
+
- `index.html` renders with `vfrey-framey` (or `hyperframes`), `index.tsx` with `remotion`; a mismatch stops with a `Fix:` line. Always pass `--engine` with a scene.
|
|
34
|
+
- vfrey supplies in `DIR/vfrey/` (rewritten at render, do not edit): `timing.json`, `voice.wav`, `vfrey.js`, local `gsap.min.js`, `fonts/fonts.css` (Titan One, JetBrains Mono, Google Sans Flex), `assets/` (stick figures `stick-*.svg`, glyphs `glyph-*.svg`).
|
|
35
|
+
- Timing: `vfrey.timing` (HTML) or `useTiming()` (Remotion): `durationSec`, `words[{i,text,start,end,line}]`, `lines[...]`, `beats[...]`, in seconds. The film is voice length plus 0.3 s, 1080x1920, 30 fps.
|
|
36
|
+
- HTML: `<link rel="stylesheet" href="vfrey/fonts/fonts.css">`, `<script src="vfrey/gsap.min.js">`, `<script src="vfrey/vfrey.js">`; `const tl = vfrey.timeline()` (the one paused GSAP timeline); `vfrey.captions("#el", {style})` (`box`, `color`, `underline`, `pop`, `plain`; also `size`, `color`, `highlight`, `font`, `maxWords`, `align`); `vfrey.at(t, fn)`, `vfrey.onWord(i, fn)`, `vfrey.onLine(i, fn)`, `vfrey.line(i)`. Everything visible must be a function of timeline time (no `Date.now`, no unseeded random).
|
|
37
|
+
- Remotion: `import { useTiming, useTime, Captions, AtLine } from "@vfrey/scene"`; `export default function Scene()`.
|
|
38
|
+
- vfrey burns the `AI-GENERATED` label on top after render; nothing can hide it. The network is blocked while rendering (no CDNs). A scene folder is at most 50 MB.
|
|
39
|
+
- Before designing, read `scenes/craft.md` next to this file (layout, type, safe areas, motion, pacing); `scenes/motion.md` has GSAP recipes.
|
|
40
|
+
- Two worked examples are in `examples/` next to this file (`concurrency-vs-parallelism/`, `octopus-facts/`). Read one, then design for the idea in front of you; do not copy.
|
|
41
|
+
- Preview: `npx vfrey render --scene scenes/<idea> --engine vfrey-framey --script scripts/<idea>.json --frame 2.5 out.png` (silent, label on). Open it, fix the layout, check a second moment (`--frame 9`).
|
|
42
|
+
3. **Quality checks.** vfrey reviews every video before and after the render. Read the Checks list on the run page or `checks` in `npx vfrey tick --json`; each check has an id and a Fix line. Do the Fix; never work around a check. Limits: spoken length 6-75 s at about 2.6 words per second; rendered file 1080x1920, not black, not frozen. A dry run skips the after-render checks.
|
|
43
|
+
- Quality failures (copy, pace, scene, frames) reject the job; vfrey re-renders once when a render can change the result. Otherwise fix the named problem and rerun.
|
|
44
|
+
- Compliance failures (banned claims, missing disclosure, missing AI label) block the job and are never retried. Fix the content.
|
|
45
|
+
4. **Scene blocks.** Ready-made pieces (lower thirds, charts, code, chat cards, overlays, backgrounds, transitions) to restyle, not templates; one or two per short at most.
|
|
46
|
+
- `npx vfrey scene blocks [--category X]` lists them; `npx vfrey scene add BLOCK scenes/<idea>` copies one into the scene and prints the snippet to paste into `#root`.
|
|
47
|
+
- Time it with `vfrey.block("#block-<name>", t)` inside `vfrey.onLine` or `vfrey.at`; mount each block once per scene; HTML scenes only. Placement, fit modes and restyling are in `scenes/blocks.md`.
|
|
48
|
+
5. **Make it.** `npx vfrey tick --now --about "<subject>" --script scripts/<idea>.json --scene scenes/<idea> --engine vfrey-framey`. Subject goes in `--about` (no feed is read; it runs as its own job). Without `--about` the default series reads the Federal Reserve feed: say so and ask once for a topic. Leave `--script` out only if they say to let vfrey write it, and then say the words are generic. Never set `--dry-run` for a real video (it skips the file). `render --subject` is only a silent, untracked preview.
|
|
49
|
+
6. **Tell them.** The summary has `✓ Video ready: <path>` (length and size from ffprobe: quote them), the transcript, the upload outcome, and `See it: http://127.0.0.1:<port>/runs/<id>`. That link is live because the tick starts the dashboard: relay it and the readable video path in `videos/` as they are, without hedging. Only if `curl` to it fails, run `npx vfrey open`. Say `Scene: agent-written`; with the default template say so. `--json` has `{processed, jobs:[{id, series, status, mp4, transcript, durationSec, publish, engage, runUrl, scene, engine}]}`. Nothing made: the summary says why (`not due`, `paused`, `job <id> in progress` with its `npx vfrey desk job cancel --id <id>` fix). Never move or rename videos by hand; vfrey tracks the paths.
|
|
50
|
+
|
|
51
|
+
Voice is on (macOS `say`; `TTS_PROVIDER=openai` is the paid voice, `none` is silent). A machine without it stops with a `Fix:` line. No model key is needed. To check a dashboard link is live: `curl -s -o /dev/null -w "%{http_code}" <url>` expects `200`.
|
|
52
|
+
|
|
53
|
+
## Engines
|
|
54
|
+
|
|
55
|
+
The person chooses. `npx vfrey engine list` shows ready or unavailable with reasons; `npx vfrey engine use <id>` sets the machine default (Remotion until then). When they name one, pass `--engine remotion|vfrey-framey|hyperframes`; order: `--engine`, the series engine, the project's `engine` in `vfrey.json`, then the machine default. The `Engine:` line says when it came from `vfrey.json`. Otherwise pass none and say which engine rendered (`Engine:` line). Framey's first render downloads Chrome Headless Shell (about 170 MB). HyperFrames needs the upstream CLI; ComfyUI is not wired. There is no fallback: an unavailable or failed engine ends the run with a `Fix:` line naming another one. Relay it; never quietly switch.
|
|
56
|
+
|
|
57
|
+
## Rules
|
|
58
|
+
|
|
59
|
+
- Do not post, scrape, or open the old console. Ingest is built into the source stage. A fresh install has no platform key: publish skips with `missing_key` and the video stays on this machine; do not promise a push (`npx vfrey push` refuses for now). Only if they say push, read `push/SKILL.md` next to this file. Keys are the person's own.
|
|
60
|
+
- Every video carries the `AI-GENERATED` disclosure. Never hide it or claim a real person made it.
|
|
61
|
+
- Updating: `npx vfrey update` prints the commands; run them only when asked (`--apply`).
|
|
62
|
+
|
|
63
|
+
There is no MCP server; this file is how you find the commands.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 500" fill="none" stroke="#000" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- one cook, two dishes: the cook turns between them -->
|
|
3
|
+
<path d="M170 120c-30-10-34-52 0-60 6-30 52-34 66-8 28-8 52 22 30 48-8 8-20 12-30 10v22H170z" fill="#fff"/>
|
|
4
|
+
<circle cx="210" cy="190" r="52" fill="#fff"/>
|
|
5
|
+
<circle cx="192" cy="184" r="5" fill="#000"/><circle cx="228" cy="184" r="5" fill="#000"/>
|
|
6
|
+
<path d="M196 208q14 12 28 0"/>
|
|
7
|
+
<path d="M150 360q0-110 60-120t60 120z" fill="#E3F2FD"/>
|
|
8
|
+
<path d="M168 270L96 330M252 270l72 60"/>
|
|
9
|
+
<rect x="30" y="330" width="110" height="64" rx="10" fill="#90CAF9"/><path d="M24 346h-14M140 346h12"/>
|
|
10
|
+
<rect x="280" y="330" width="110" height="64" rx="10" fill="#2196F3"/><path d="M276 346h-12M390 346h14"/>
|
|
11
|
+
<path d="M60 310c-8-18 8-26 0-44M100 306c-8-18 8-26 0-44" stroke="#0D47A1" stroke-width="6"/>
|
|
12
|
+
<path d="M170 440h80m-24-20 24 20-24 20M250 470h-80m24-20-24 20 24 20" stroke="#0D47A1" stroke-width="7"/>
|
|
13
|
+
<path d="M210 360v80"/>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 500" fill="none" stroke="#000" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- two cooks, one dish each, working together in time -->
|
|
3
|
+
<g>
|
|
4
|
+
<path d="M40 150c-22-8-24-38 0-44 4-22 38-24 48-6 20-6 36 16 22 34-6 6-14 8-22 6v16H40z" fill="#fff"/>
|
|
5
|
+
<circle cx="74" cy="196" r="38" fill="#fff"/>
|
|
6
|
+
<circle cx="62" cy="192" r="4" fill="#000"/><circle cx="88" cy="192" r="4" fill="#000"/><path d="M64 210q10 9 20 0"/>
|
|
7
|
+
<path d="M30 370q0-90 44-98t44 98z" fill="#E3F2FD"/>
|
|
8
|
+
<path d="M48 292L20 340M100 292l30 48"/>
|
|
9
|
+
<rect x="10" y="352" width="190" height="60" rx="10" fill="#90CAF9"/>
|
|
10
|
+
<path d="M40 336c-8-16 8-24 0-40M84 332c-8-16 8-24 0-40" stroke="#0D47A1" stroke-width="6"/>
|
|
11
|
+
</g>
|
|
12
|
+
<g>
|
|
13
|
+
<path d="M250 150c-22-8-24-38 0-44 4-22 38-24 48-6 20-6 36 16 22 34-6 6-14 8-22 6v16h-48z" fill="#fff"/>
|
|
14
|
+
<circle cx="284" cy="196" r="38" fill="#fff"/>
|
|
15
|
+
<circle cx="272" cy="192" r="4" fill="#000"/><circle cx="298" cy="192" r="4" fill="#000"/><path d="M274 210q10 9 20 0"/>
|
|
16
|
+
<path d="M240 370q0-90 44-98t44 98z" fill="#E3F2FD"/>
|
|
17
|
+
<path d="M258 292l-28 48M310 292l30 48"/>
|
|
18
|
+
<rect x="220" y="352" width="190" height="60" rx="10" fill="#2196F3"/>
|
|
19
|
+
<path d="M250 336c-8-16 8-24 0-40M294 332c-8-16 8-24 0-40" stroke="#0D47A1" stroke-width="6"/>
|
|
20
|
+
</g>
|
|
21
|
+
<path d="M190 450h40" stroke="#0D47A1" stroke-width="7"/><path d="M120 462h180" stroke-dasharray="2 16" stroke="#0D47A1" stroke-width="7"/>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<!-- "What's the difference?" as a scene: a light page, two labelled pictures, one big question, a stick figure that
|
|
3
|
+
reacts to what is being said, and word-highlighted captions. The idea is the picture; vfrey only supplies the
|
|
4
|
+
voice timing (vfrey.timing), the captions helper, GSAP, fonts and the stick figure art. -->
|
|
5
|
+
<html lang="en">
|
|
6
|
+
<head>
|
|
7
|
+
<meta charset="UTF-8" />
|
|
8
|
+
<meta name="viewport" content="width=1080, height=1920" />
|
|
9
|
+
<link rel="stylesheet" href="vfrey/fonts/fonts.css" />
|
|
10
|
+
<script src="vfrey/gsap.min.js"></script>
|
|
11
|
+
<script src="vfrey/vfrey.js"></script>
|
|
12
|
+
<style>
|
|
13
|
+
html, body { margin: 0; width: 1080px; height: 1920px; overflow: hidden; }
|
|
14
|
+
/* --mix is 0 for the opening layout and 1 for the explaining layout; everything below is a function of it. */
|
|
15
|
+
#root { --mix: 0; position: relative; width: 1080px; height: 1920px; overflow: hidden; background: #fff; color: #000; font-family: "Titan One", sans-serif; }
|
|
16
|
+
#root * { box-sizing: border-box; }
|
|
17
|
+
.wash { position: absolute; left: 0; top: 0; width: 100%; height: 700px; background: linear-gradient(180deg, rgba(0,0,0,.22), rgba(0,0,0,.1) 20%, rgba(0,0,0,.03) 48%, rgba(0,0,0,0)); }
|
|
18
|
+
.lab { position: absolute; width: 540px; text-align: center; white-space: nowrap; line-height: 1; top: calc(118px + (70 - 118) * var(--mix) * 1px); font-size: calc(60px - 8px * var(--mix)); }
|
|
19
|
+
.lab.b { left: 540px; }
|
|
20
|
+
.pic { position: absolute; top: calc(268px + (172 - 268) * var(--mix) * 1px); width: calc(420px - 100px * var(--mix)); height: calc(500px - 200px * var(--mix)); }
|
|
21
|
+
.pic img { width: 100%; height: 100%; object-fit: contain; }
|
|
22
|
+
.pic.a { left: calc(60px + 50px * var(--mix)); }
|
|
23
|
+
.pic.b { right: calc(60px + 50px * var(--mix)); }
|
|
24
|
+
.divider { position: absolute; left: 537px; top: 70px; width: 7px; height: 400px; border-radius: 4px; background: #000; opacity: var(--mix); }
|
|
25
|
+
.question { position: absolute; left: 0; width: 100%; top: 760px; text-align: center; line-height: 1.05; font-size: 104px; opacity: calc(1 - var(--mix) * 1.6); }
|
|
26
|
+
.fig { position: absolute; left: 50%; width: calc(360px + 140px * var(--mix)); height: calc((360px + 140px * var(--mix)) * 1.3); top: calc(1010px + (640 - 1010) * var(--mix) * 1px); transform: translateX(-50%); }
|
|
27
|
+
.fig img { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; }
|
|
28
|
+
.fig img.on { opacity: 1; }
|
|
29
|
+
#captions { position: absolute; left: 50px; right: 50px; bottom: 196px; height: 250px; }
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<div id="root" data-composition-id="main" data-start="0" data-width="1080" data-height="1920">
|
|
34
|
+
<div class="wash"></div>
|
|
35
|
+
<div class="divider"></div>
|
|
36
|
+
<div class="lab a">CONCURRENCY</div>
|
|
37
|
+
<div class="lab b">PARALLELISM</div>
|
|
38
|
+
<div class="pic a"><img src="cook-one.svg" alt="" /></div>
|
|
39
|
+
<div class="pic b"><img src="cook-two.svg" alt="" /></div>
|
|
40
|
+
<div class="question">What's the<br />difference?</div>
|
|
41
|
+
<div class="fig">
|
|
42
|
+
<img id="p-shrug" src="vfrey/assets/stick-shrug.svg" alt="" class="on" />
|
|
43
|
+
<img id="p-left" src="vfrey/assets/stick-point-left.svg" alt="" />
|
|
44
|
+
<img id="p-right" src="vfrey/assets/stick-point-right.svg" alt="" />
|
|
45
|
+
<img id="p-idea" src="vfrey/assets/stick-idea.svg" alt="" />
|
|
46
|
+
</div>
|
|
47
|
+
<div id="captions"></div>
|
|
48
|
+
</div>
|
|
49
|
+
<script>
|
|
50
|
+
const tl = vfrey.timeline();
|
|
51
|
+
const lines = vfrey.timing.lines;
|
|
52
|
+
// The opening (big question, shrug) lasts while the first line is spoken, then the layout settles.
|
|
53
|
+
const openingEnd = Math.min(3, Math.max(2.2, vfrey.line(0).end + 0.25));
|
|
54
|
+
tl.fromTo("#root", { "--mix": 0 }, { "--mix": 1, duration: 0.35, ease: "power2.inOut" }, openingEnd);
|
|
55
|
+
// One pose per spoken line: the hook shrugs, concurrency lines point left, parallelism lines point right, the last has the idea.
|
|
56
|
+
const POSE = ["shrug", "left", "left", "right", "left", "right", "idea"];
|
|
57
|
+
let shown = "shrug";
|
|
58
|
+
lines.forEach((line, i) => {
|
|
59
|
+
const pose = i === lines.length - 1 ? "idea" : POSE[i] || "shrug";
|
|
60
|
+
if (pose === shown) return;
|
|
61
|
+
vfrey.at(Math.max(line.start, i === 0 ? 0 : openingEnd), (tl, t) => {
|
|
62
|
+
tl.set("#p-" + shown, { className: "" }, t);
|
|
63
|
+
tl.set("#p-" + pose, { className: "on" }, t);
|
|
64
|
+
});
|
|
65
|
+
shown = pose;
|
|
66
|
+
});
|
|
67
|
+
vfrey.captions("#captions", { style: "box" });
|
|
68
|
+
</script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 500" fill="none" stroke="#000" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- one cook, two dishes: the cook turns between them -->
|
|
3
|
+
<path d="M170 120c-30-10-34-52 0-60 6-30 52-34 66-8 28-8 52 22 30 48-8 8-20 12-30 10v22H170z" fill="#fff"/>
|
|
4
|
+
<circle cx="210" cy="190" r="52" fill="#fff"/>
|
|
5
|
+
<circle cx="192" cy="184" r="5" fill="#000"/><circle cx="228" cy="184" r="5" fill="#000"/>
|
|
6
|
+
<path d="M196 208q14 12 28 0"/>
|
|
7
|
+
<path d="M150 360q0-110 60-120t60 120z" fill="#E3F2FD"/>
|
|
8
|
+
<path d="M168 270L96 330M252 270l72 60"/>
|
|
9
|
+
<rect x="30" y="330" width="110" height="64" rx="10" fill="#90CAF9"/><path d="M24 346h-14M140 346h12"/>
|
|
10
|
+
<rect x="280" y="330" width="110" height="64" rx="10" fill="#2196F3"/><path d="M276 346h-12M390 346h14"/>
|
|
11
|
+
<path d="M60 310c-8-18 8-26 0-44M100 306c-8-18 8-26 0-44" stroke="#0D47A1" stroke-width="6"/>
|
|
12
|
+
<path d="M170 440h80m-24-20 24 20-24 20M250 470h-80m24-20-24 20 24 20" stroke="#0D47A1" stroke-width="7"/>
|
|
13
|
+
<path d="M210 360v80"/>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 500" fill="none" stroke="#000" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- two cooks, one dish each, working together in time -->
|
|
3
|
+
<g>
|
|
4
|
+
<path d="M40 150c-22-8-24-38 0-44 4-22 38-24 48-6 20-6 36 16 22 34-6 6-14 8-22 6v16H40z" fill="#fff"/>
|
|
5
|
+
<circle cx="74" cy="196" r="38" fill="#fff"/>
|
|
6
|
+
<circle cx="62" cy="192" r="4" fill="#000"/><circle cx="88" cy="192" r="4" fill="#000"/><path d="M64 210q10 9 20 0"/>
|
|
7
|
+
<path d="M30 370q0-90 44-98t44 98z" fill="#E3F2FD"/>
|
|
8
|
+
<path d="M48 292L20 340M100 292l30 48"/>
|
|
9
|
+
<rect x="10" y="352" width="190" height="60" rx="10" fill="#90CAF9"/>
|
|
10
|
+
<path d="M40 336c-8-16 8-24 0-40M84 332c-8-16 8-24 0-40" stroke="#0D47A1" stroke-width="6"/>
|
|
11
|
+
</g>
|
|
12
|
+
<g>
|
|
13
|
+
<path d="M250 150c-22-8-24-38 0-44 4-22 38-24 48-6 20-6 36 16 22 34-6 6-14 8-22 6v16h-48z" fill="#fff"/>
|
|
14
|
+
<circle cx="284" cy="196" r="38" fill="#fff"/>
|
|
15
|
+
<circle cx="272" cy="192" r="4" fill="#000"/><circle cx="298" cy="192" r="4" fill="#000"/><path d="M274 210q10 9 20 0"/>
|
|
16
|
+
<path d="M240 370q0-90 44-98t44 98z" fill="#E3F2FD"/>
|
|
17
|
+
<path d="M258 292l-28 48M310 292l30 48"/>
|
|
18
|
+
<rect x="220" y="352" width="190" height="60" rx="10" fill="#2196F3"/>
|
|
19
|
+
<path d="M250 336c-8-16 8-24 0-40M294 332c-8-16 8-24 0-40" stroke="#0D47A1" stroke-width="6"/>
|
|
20
|
+
</g>
|
|
21
|
+
<path d="M190 450h40" stroke="#0D47A1" stroke-width="7"/><path d="M120 462h180" stroke-dasharray="2 16" stroke="#0D47A1" stroke-width="7"/>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// "What's the difference?" for Remotion: the same scene as framey/index.html, written as a React component.
|
|
2
|
+
// vfrey provides the voice (it plays it for you), the timing (useTiming) and the captions (<Captions/>).
|
|
3
|
+
import { AbsoluteFill, Img, interpolate, staticFile } from "remotion";
|
|
4
|
+
import { Captions, useTime, useTiming } from "@vfrey/scene";
|
|
5
|
+
|
|
6
|
+
const lerp = (a: number, b: number, mix: number) => a + (b - a) * mix;
|
|
7
|
+
const POSE = ["shrug", "point-left", "point-left", "point-right", "point-left", "point-right", "idea"];
|
|
8
|
+
|
|
9
|
+
export default function Scene() {
|
|
10
|
+
const timing = useTiming();
|
|
11
|
+
const t = useTime();
|
|
12
|
+
// The opening (big question, shrug) lasts while the first line is spoken, then the layout settles.
|
|
13
|
+
const first = timing.lines[0]!;
|
|
14
|
+
const openingEnd = Math.min(3, Math.max(2.2, first.end + 0.25));
|
|
15
|
+
const mix = interpolate(t, [openingEnd, openingEnd + 0.35], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
|
|
16
|
+
// One pose per spoken line; the last line has the idea.
|
|
17
|
+
let pose = "shrug";
|
|
18
|
+
if (t >= openingEnd) {
|
|
19
|
+
timing.lines.forEach((line, i) => {
|
|
20
|
+
if (line.start <= t) pose = i === timing.lines.length - 1 ? "idea" : POSE[i] ?? "shrug";
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const label = (text: string, left: number) => (
|
|
24
|
+
<div style={{ position: "absolute", left, top: lerp(118, 70, mix), width: 540, textAlign: "center", whiteSpace: "nowrap", lineHeight: 1, fontSize: lerp(60, 52, mix) }}>{text}</div>
|
|
25
|
+
);
|
|
26
|
+
const pic = (src: string, side: "left" | "right") => (
|
|
27
|
+
<div style={{ position: "absolute", top: lerp(268, 172, mix), [side]: lerp(60, 110, mix), width: lerp(420, 320, mix), height: lerp(500, 300, mix) }}>
|
|
28
|
+
<Img src={staticFile(src)} style={{ width: "100%", height: "100%", objectFit: "contain" }} />
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
const figWidth = lerp(360, 500, mix);
|
|
32
|
+
return (
|
|
33
|
+
<AbsoluteFill style={{ background: "#fff", color: "#000", fontFamily: '"Titan One", sans-serif' }}>
|
|
34
|
+
<div style={{ position: "absolute", left: 0, top: 0, width: "100%", height: 700, background: "linear-gradient(180deg, rgba(0,0,0,.22), rgba(0,0,0,.1) 20%, rgba(0,0,0,.03) 48%, rgba(0,0,0,0))" }} />
|
|
35
|
+
<div style={{ position: "absolute", left: 537, top: 70, width: 7, height: 400, borderRadius: 4, background: "#000", opacity: mix }} />
|
|
36
|
+
{label("CONCURRENCY", 0)}
|
|
37
|
+
{label("PARALLELISM", 540)}
|
|
38
|
+
{pic("cook-one.svg", "left")}
|
|
39
|
+
{pic("cook-two.svg", "right")}
|
|
40
|
+
<div style={{ position: "absolute", left: 0, width: "100%", top: 760, textAlign: "center", lineHeight: 1.05, fontSize: 104, opacity: 1 - mix * 1.6 }}>
|
|
41
|
+
What's the<br />difference?
|
|
42
|
+
</div>
|
|
43
|
+
<div style={{ position: "absolute", left: 540 - figWidth / 2, top: lerp(1010, 640, mix), width: figWidth, height: figWidth * 1.3 }}>
|
|
44
|
+
<Img src={staticFile(`vfrey/assets/stick-${pose}.svg`)} style={{ width: "100%", height: "100%" }} />
|
|
45
|
+
</div>
|
|
46
|
+
<Captions captionStyle="box" style={{ position: "absolute", left: 50, right: 50, bottom: 196, height: 250 }} />
|
|
47
|
+
</AbsoluteFill>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Concurrency vs parallelism: what's the difference?",
|
|
3
|
+
"hook": "What is the difference between concurrency and parallelism?",
|
|
4
|
+
"lines": [
|
|
5
|
+
"What is the difference between concurrency and parallelism?",
|
|
6
|
+
"Concurrency is one cook switching between two dishes: stir one, then chop for the other.",
|
|
7
|
+
"Only one thing happens at any instant, but both dishes make progress.",
|
|
8
|
+
"Parallelism is two cooks, each working on their own dish at the very same time.",
|
|
9
|
+
"Concurrency is about dealing with many things at once.",
|
|
10
|
+
"Parallelism is about doing many things at once.",
|
|
11
|
+
"So concurrency is how you structure the work, and parallelism is how it runs."
|
|
12
|
+
],
|
|
13
|
+
"hashtags": ["#programming", "#concurrency", "#parallelism"],
|
|
14
|
+
"subject": "concurrency vs parallelism"
|
|
15
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<!-- "3 facts about octopuses": a different idea, so a different picture. Each fact gets a full-screen colour and a huge
|
|
3
|
+
numeral; the octopus watches from the corner. Same helpers: vfrey.line() for when a fact is spoken, vfrey.captions
|
|
4
|
+
for the words. Nothing here came from a template. -->
|
|
5
|
+
<html lang="en">
|
|
6
|
+
<head>
|
|
7
|
+
<meta charset="UTF-8" />
|
|
8
|
+
<meta name="viewport" content="width=1080, height=1920" />
|
|
9
|
+
<link rel="stylesheet" href="vfrey/fonts/fonts.css" />
|
|
10
|
+
<script src="vfrey/gsap.min.js"></script>
|
|
11
|
+
<script src="vfrey/vfrey.js"></script>
|
|
12
|
+
<style>
|
|
13
|
+
html, body { margin: 0; width: 1080px; height: 1920px; overflow: hidden; }
|
|
14
|
+
#root { position: relative; width: 1080px; height: 1920px; overflow: hidden; background: #0d47a1; color: #fff; font-family: "Titan One", sans-serif; }
|
|
15
|
+
.panel { position: absolute; inset: 0; opacity: 0; }
|
|
16
|
+
.panel .big { position: absolute; left: 0; right: 0; top: 250px; text-align: center; font-size: 560px; line-height: 1; }
|
|
17
|
+
.panel .word { position: absolute; left: 60px; right: 60px; top: 860px; text-align: center; font-size: 110px; line-height: 1.05; }
|
|
18
|
+
#intro { opacity: 1; }
|
|
19
|
+
#intro .head { position: absolute; left: 60px; right: 60px; top: 300px; text-align: center; font-size: 150px; line-height: 1.02; }
|
|
20
|
+
#octo { position: absolute; width: 440px; height: 440px; left: 320px; top: 1010px; }
|
|
21
|
+
#captions { position: absolute; left: 50px; right: 50px; bottom: 196px; height: 260px; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<div id="root" data-composition-id="main" data-start="0" data-width="1080" data-height="1920">
|
|
26
|
+
<div class="panel" id="intro"><div class="head">3 facts about octopuses</div></div>
|
|
27
|
+
<div class="panel" id="f1" data-bg="#d84315"><div class="big">1</div><div class="word">three hearts</div></div>
|
|
28
|
+
<div class="panel" id="f2" data-bg="#00838f"><div class="big">2</div><div class="word">blue blood</div></div>
|
|
29
|
+
<div class="panel" id="f3" data-bg="#6a1b9a"><div class="big">3</div><div class="word">nine brains</div></div>
|
|
30
|
+
<img id="octo" src="octopus.svg" alt="" />
|
|
31
|
+
<div id="captions"></div>
|
|
32
|
+
</div>
|
|
33
|
+
<script>
|
|
34
|
+
const tl = vfrey.timeline();
|
|
35
|
+
const T = vfrey.timing;
|
|
36
|
+
// Which spoken line opens each fact: the lines that start with "One.", "Two." and "Three.".
|
|
37
|
+
const opens = ["One", "Two", "Three"].map((w) => T.lines.findIndex((l) => l.text.startsWith(w + ".")));
|
|
38
|
+
const end = T.durationSec;
|
|
39
|
+
const starts = opens.map((i) => (i >= 0 ? vfrey.line(i).start : end));
|
|
40
|
+
// Intro until the first fact; then each fact owns the screen until the next begins; the outro keeps the last colour.
|
|
41
|
+
tl.set("#root", { backgroundColor: "#0d47a1" }, 0);
|
|
42
|
+
["f1", "f2", "f3"].forEach((id, k) => {
|
|
43
|
+
const at = Math.max(0, starts[k] - 0.05);
|
|
44
|
+
const bg = document.getElementById(id).dataset.bg;
|
|
45
|
+
vfrey.at(at, (tl, t) => {
|
|
46
|
+
tl.set("#root", { backgroundColor: bg }, t);
|
|
47
|
+
tl.set("#intro", { opacity: 0 }, t);
|
|
48
|
+
if (k > 0) tl.set("#f" + k, { opacity: 0 }, t);
|
|
49
|
+
tl.set("#" + id, { opacity: 1 }, t);
|
|
50
|
+
tl.fromTo("#" + id + " .big", { scale: 0.4 }, { scale: 1, duration: 0.45, ease: "back.out(2.2)" }, t);
|
|
51
|
+
tl.fromTo("#" + id + " .word", { y: 40, opacity: 0 }, { y: 0, opacity: 1, duration: 0.35, ease: "power3.out" }, t + 0.15);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
tl.fromTo("#intro .head", { y: 60, opacity: 0 }, { y: 0, opacity: 1, duration: 0.5, ease: "power3.out" }, 0.1);
|
|
55
|
+
// The octopus sways all the way through (a finite loop: the video is a known length).
|
|
56
|
+
tl.to("#octo", { rotation: 6, y: -18, duration: 1.2, ease: "sine.inOut", yoyo: true, repeat: Math.max(0, Math.floor(end / 1.2) - 1) }, 0);
|
|
57
|
+
vfrey.captions("#captions", { style: "pop", highlight: "#ffd54f", color: "#ffffff", stroke: "#000000" });
|
|
58
|
+
</script>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" fill="none" stroke="#fff" stroke-width="10" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- an octopus: dome head, two eyes, eight wavy arms -->
|
|
3
|
+
<path d="M90 190c0-90 50-140 110-140s110 50 110 140c0 20-6 36-14 46H104c-8-10-14-26-14-46z" fill="#FF8A65"/>
|
|
4
|
+
<circle cx="160" cy="170" r="16" fill="#fff"/><circle cx="240" cy="170" r="16" fill="#fff"/>
|
|
5
|
+
<circle cx="164" cy="174" r="7" fill="#0D47A1" stroke="none"/><circle cx="244" cy="174" r="7" fill="#0D47A1" stroke="none"/>
|
|
6
|
+
<path d="M176 210q24 18 48 0"/>
|
|
7
|
+
<path d="M108 236c-30 30-10 60-44 80M138 240c-14 36 8 64-12 92M170 242c-4 40 14 60 4 98M200 244v100M230 242c4 40-14 60-4 98M262 240c14 36-8 64 12 92M292 236c30 30 10 60 44 80" stroke="#FF8A65" stroke-width="16"/>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "3 facts about octopuses",
|
|
3
|
+
"hook": "Here are three facts about octopuses that sound made up, but are true.",
|
|
4
|
+
"lines": [
|
|
5
|
+
"Here are three facts about octopuses that sound made up, but are true.",
|
|
6
|
+
"One. An octopus has three hearts.",
|
|
7
|
+
"Two of them pump blood through the gills, and the third pumps it to the rest of the body.",
|
|
8
|
+
"Two. An octopus has blue blood, because it carries oxygen with copper instead of iron.",
|
|
9
|
+
"Three. An octopus has nine brains: one central brain, and a small one in each of its eight arms.",
|
|
10
|
+
"Octopuses really are strange and clever animals."
|
|
11
|
+
],
|
|
12
|
+
"hashtags": ["#octopus", "#animalfacts", "#ocean"],
|
|
13
|
+
"subject": "3 facts about octopuses"
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vfrey-push
|
|
3
|
+
description: Answer a request to push a finished vfrey video to a platform. Use when the person says push, publish, or upload a video to YouTube or another platform.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Push
|
|
7
|
+
|
|
8
|
+
`npx vfrey push` is not built yet. It prints `✗ push is not built yet.` and `Fix: publishing runs inside \`vfrey tick\` once the platform keys are set.` and exits 1. Do not promise a push and do not call a platform API.
|
|
9
|
+
|
|
10
|
+
1. Say plainly that the video stays on this machine under `~/.vfrey/renders/` (or `$VFREY_HOME/renders/`).
|
|
11
|
+
2. Publishing runs inside `npx vfrey tick`, through the official platform APIs, and only with the operator's own platform keys. With no key, publish skips with `missing_key`. `npx vfrey desk snapshot --json` or `npx vfrey dashboard` shows the skipped publish.
|
|
12
|
+
3. Do not run `npx vfrey push` to look for a hidden upload. It has none.
|
|
13
|
+
4. Disclosure stays fail-closed: any upload is labeled synthetic. A missing label is `blocked`, not a retry without the label.
|
|
14
|
+
|
|
15
|
+
Nothing in this skill sends mail or collects topics.
|