flomotion 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -2
- package/LICENSE +1 -1
- package/README.md +29 -20
- package/dist/bin.mjs +6279 -2582
- package/dist/chunks/{chunk-QG2MOGKO.mjs → chunk-IGG2VZB6.mjs} +178 -14
- package/dist/chunks/{chunk-AVP5XX4G.mjs → chunk-PEC2UVQY.mjs} +138 -108
- package/dist/chunks/{chunk-IUSYVGP6.mjs → chunk-TTHAZGRG.mjs} +7 -7
- package/dist/chunks/{chunk-JCLRAREG.mjs → chunk-XWY6CUY6.mjs} +16 -16
- package/dist/chunks/{lock-MLQUU7X3.mjs → lock-WGPR7CJ2.mjs} +3 -3
- package/dist/components.mjs +19 -13
- package/dist/core.mjs +12 -12
- package/dist/hooks.mjs +8 -12
- package/dist/jsx-dev-runtime.mjs +1 -1
- package/dist/jsx-runtime.mjs +1 -1
- package/docs/components/Adjustment.md +2 -2
- package/docs/components/Audio.md +2 -2
- package/docs/components/B.md +3 -3
- package/docs/components/Captions.md +2 -2
- package/docs/components/Card.md +2 -2
- package/docs/components/Center.md +2 -2
- package/docs/components/Chart.md +2 -2
- package/docs/components/Chip.md +2 -2
- package/docs/components/Circle.md +2 -2
- package/docs/components/Clip.md +2 -2
- package/docs/components/CodeBlock.md +2 -2
- package/docs/components/Composition.md +2 -2
- package/docs/components/Counter.md +2 -2
- package/docs/components/Cursor.md +2 -2
- package/docs/components/Fonts.md +2 -2
- package/docs/components/GlassCard.md +2 -2
- package/docs/components/Grid.md +2 -2
- package/docs/components/Group.md +2 -2
- package/docs/components/Highlight.md +3 -3
- package/docs/components/I.md +3 -3
- package/docs/components/Image.md +2 -2
- package/docs/components/Line.md +2 -2
- package/docs/components/Marker.md +2 -2
- package/docs/components/Path.md +2 -2
- package/docs/components/Polygon.md +2 -2
- package/docs/components/Precomp.md +2 -2
- package/docs/components/ProgressRing.md +2 -2
- package/docs/components/Rect.md +2 -2
- package/docs/components/RoundRect.md +2 -2
- package/docs/components/SafeArea.md +2 -2
- package/docs/components/Scene.md +2 -2
- package/docs/components/Sequence.md +2 -2
- package/docs/components/Span.md +3 -3
- package/docs/components/SplitText.md +2 -2
- package/docs/components/Stack.md +2 -2
- package/docs/components/Stagger.md +2 -2
- package/docs/components/Strike.md +3 -3
- package/docs/components/Svg.md +2 -2
- package/docs/components/Text.md +2 -2
- package/docs/components/Title.md +2 -2
- package/docs/components/Track.md +2 -2
- package/docs/components/UIMock.md +2 -2
- package/docs/components/Underline.md +3 -3
- package/docs/components/Video.md +2 -2
- package/docs/gate2-manual-checklist.md +10 -9
- package/docs/hyperframes-notes.md +20 -20
- package/docs/later.md +23 -16
- package/docs/spec.md +83 -22
- package/package.json +1 -2
- package/skills/flomotion-studio/CHANGELOG.md +39 -0
- package/skills/flomotion-studio/README.md +81 -0
- package/skills/flomotion-studio/SKILL.md +90 -0
- package/skills/flomotion-studio/config/thresholds.md +191 -0
- package/skills/flomotion-studio/dataset/annotations/ansarada.md +53 -0
- package/skills/flomotion-studio/dataset/annotations/canva.md +49 -0
- package/skills/flomotion-studio/dataset/annotations/clickup.md +60 -0
- package/skills/flomotion-studio/dataset/annotations/gemini-stub.md +39 -0
- package/skills/flomotion-studio/dataset/annotations/monday.md +51 -0
- package/skills/flomotion-studio/dataset/annotations/phantom.md +53 -0
- package/skills/flomotion-studio/dataset/annotations/slack.md +54 -0
- package/skills/flomotion-studio/dataset/annotations/unknown-7.md +39 -0
- package/skills/flomotion-studio/dataset/annotations/vaylens.md +53 -0
- package/skills/flomotion-studio/dataset/brief-template.md +110 -0
- package/skills/flomotion-studio/dataset/rating-sheet.md +28 -0
- package/skills/flomotion-studio/dataset/schema.md +44 -0
- package/skills/flomotion-studio/evals/README.md +33 -0
- package/skills/flomotion-studio/evals/briefs/briefs.md +25 -0
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/kinetic.scene.tsx +1 -1
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/minimal.scene.tsx +1 -1
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/sketch.scene.tsx +1 -1
- package/skills/flomotion-studio/examples/flomotion-ad/LOG.md +39 -0
- package/skills/flomotion-studio/examples/flomotion-ad/brief.md +41 -0
- package/skills/flomotion-studio/examples/flomotion-ad/ideas.md +12 -0
- package/skills/flomotion-studio/examples/flomotion-ad/project.tsx +1694 -0
- package/skills/flomotion-studio/examples/flomotion-ad/script.md +28 -0
- package/skills/flomotion-studio/examples/flomotion-ad/storyboard.md +93 -0
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/README.md +1 -1
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/make-assets.sh +1 -1
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/project.tsx +3 -3
- package/skills/flomotion-studio/looks/bold-kinetic.md +122 -0
- package/skills/flomotion-studio/looks/clean-light.md +122 -0
- package/skills/flomotion-studio/looks/dark-product.md +120 -0
- package/skills/flomotion-studio/references/anti-patterns.md +36 -0
- package/skills/flomotion-studio/references/assets.md +42 -0
- package/skills/flomotion-studio/references/block-recipes.md +249 -0
- package/skills/flomotion-studio/references/blocks.md +114 -0
- package/skills/flomotion-studio/references/catalogue.md +53 -0
- package/skills/flomotion-studio/references/checks.md +87 -0
- package/skills/flomotion-studio/references/clean-styles.md +56 -0
- package/skills/{motion-studio → flomotion-studio}/references/components.md +94 -94
- package/skills/flomotion-studio/references/copywriting.md +64 -0
- package/skills/flomotion-studio/references/decision-tables.md +80 -0
- package/skills/flomotion-studio/references/interview.md +145 -0
- package/skills/flomotion-studio/references/looks.md +45 -0
- package/skills/flomotion-studio/references/mcp-tools.md +70 -0
- package/skills/flomotion-studio/references/motion.md +68 -0
- package/skills/flomotion-studio/references/patterns.md +45 -0
- package/skills/flomotion-studio/references/review.md +56 -0
- package/skills/flomotion-studio/references/script-craft.md +59 -0
- package/skills/flomotion-studio/references/sound.md +57 -0
- package/skills/flomotion-studio/references/story-templates.md +52 -0
- package/skills/flomotion-studio/references/storyboard.md +62 -0
- package/skills/flomotion-studio/references/styles.md +70 -0
- package/skills/flomotion-studio/references/transitions.md +62 -0
- package/skills/flomotion-studio/references/typography.md +46 -0
- package/skills/flomotion-studio/references/workflow.md +96 -0
- package/skills/motion-studio/SKILL.md +0 -87
- package/skills/motion-studio/looks/kinetic.json +0 -89
- package/skills/motion-studio/looks/minimal.json +0 -91
- package/skills/motion-studio/looks/sketch.json +0 -83
- package/skills/motion-studio/references/motion.md +0 -73
- package/skills/motion-studio/references/review.md +0 -32
- package/skills/motion-studio/references/saas-promo.md +0 -29
- package/skills/motion-studio/references/sound.md +0 -47
- package/skills/motion-studio/references/typography.md +0 -50
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Reference annotation: Vaylens
|
|
2
|
+
|
|
3
|
+
Patterns seen in a public ad, annotated from stills. Never reproduce another brand's work (see `SKILL.md` rule 2).
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| id | vaylens |
|
|
8
|
+
| brand | Vaylens |
|
|
9
|
+
| source | user-collected stills from a compilation, rank 4 in overlay |
|
|
10
|
+
| url | none |
|
|
11
|
+
| format | 16:9 |
|
|
12
|
+
| duration_s | none |
|
|
13
|
+
| platform | none |
|
|
14
|
+
| style_family | S4 |
|
|
15
|
+
| confidence | M |
|
|
16
|
+
| rating | none |
|
|
17
|
+
| rating_notes | none |
|
|
18
|
+
| pain_share | 0.1 |
|
|
19
|
+
| turn | circles close in; 'we built' |
|
|
20
|
+
| motif | circles and blobs |
|
|
21
|
+
| palette_source | single-accent |
|
|
22
|
+
| palette_notes | one electric blue plus pale lavender; purple-blue gradient |
|
|
23
|
+
| type_notes | light-weight neo-grotesque, generous space |
|
|
24
|
+
| text_emphasis | karaoke highlight, dim to bright |
|
|
25
|
+
| grain | light |
|
|
26
|
+
| blur_on_motion | none |
|
|
27
|
+
| sentence_split | 3 |
|
|
28
|
+
| human_presence | b-roll |
|
|
29
|
+
| ui_fidelity | stylized |
|
|
30
|
+
| transitions | shape close-in, blob morph |
|
|
31
|
+
| proof_type | scale |
|
|
32
|
+
| sound_notes | none |
|
|
33
|
+
| patterns | 2, 4, 5, 11, 12, 13, 14 |
|
|
34
|
+
|
|
35
|
+
## beats
|
|
36
|
+
|
|
37
|
+
| n | role | block | text | notes |
|
|
38
|
+
| --- | --- | --- | --- | --- |
|
|
39
|
+
| 1 | hook | KaraokeLine | As the need to use electric cars becomes the norm | flat blue; current word bright, others dim |
|
|
40
|
+
| 2 | pain | FramedFootage | the way we [photo] recharge them | pale bg; photo in a clean rectangle, text flanks it |
|
|
41
|
+
| 3 | turn | ShapePivot | we built | two blue circles close in on the text |
|
|
42
|
+
| 4 | brand | ShapeMorph | vaylens | white blob pinches and morphs into the wordmark |
|
|
43
|
+
| 5 | promise | CategoryLine | It's a charging management software | purple-blue gradient, light type |
|
|
44
|
+
| 6 | product | GlassUI | none | frosted glass dashboard over blurred top-down footage of a team |
|
|
45
|
+
| 7 | proof | ProofMosaic | helping thousands of companies | mosaic of industry footage on dark panel |
|
|
46
|
+
|
|
47
|
+
## Lessons
|
|
48
|
+
|
|
49
|
+
- open from an agreeable market fact
|
|
50
|
+
- split one sentence across scenes
|
|
51
|
+
- shapes as punctuation
|
|
52
|
+
- plain category line
|
|
53
|
+
- glass UI over real-world context
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Brief template (output of the interview)
|
|
2
|
+
|
|
3
|
+
Every field is an object {value, source, status}. source: user | asset | assumption. status: confirmed | assumed | unknown.
|
|
4
|
+
|
|
5
|
+
Write `brief.md` in the project folder with one `##` section per group below and one line per field:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
- field: the answer · source: user · status: confirmed · quote: "their words" · note: why
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`source` is `user`, `asset` or `assumption`; `status` is `confirmed`, `assumed` or `unknown`. An unknown stays visibly unknown; never invent it.
|
|
12
|
+
|
|
13
|
+
Required groups: product, audience, goal, message, proof, format, taste, voice, constraints, clarity.
|
|
14
|
+
|
|
15
|
+
## product
|
|
16
|
+
|
|
17
|
+
- name: · source: · status:
|
|
18
|
+
- oneLiner: · source: · status:
|
|
19
|
+
- pain: · source: · status:
|
|
20
|
+
- wowFeature: · source: · status:
|
|
21
|
+
- features: · source: · status:
|
|
22
|
+
- competitors: · source: · status:
|
|
23
|
+
|
|
24
|
+
## audience
|
|
25
|
+
|
|
26
|
+
- primary: · source: · status:
|
|
27
|
+
- buyerVsUser: · source: · status:
|
|
28
|
+
- awareness: · source: · status:
|
|
29
|
+
- triggerMoment: · source: · status:
|
|
30
|
+
- language: · source: · status:
|
|
31
|
+
|
|
32
|
+
## goal
|
|
33
|
+
|
|
34
|
+
- action: · source: · status:
|
|
35
|
+
- cta: · source: · status:
|
|
36
|
+
- destination: · source: · status:
|
|
37
|
+
- offer: · source: · status:
|
|
38
|
+
- deadline: · source: · status:
|
|
39
|
+
|
|
40
|
+
## message
|
|
41
|
+
|
|
42
|
+
- promise: · source: · status:
|
|
43
|
+
- oneSentenceToRemember: · source: · status:
|
|
44
|
+
- avoid: · source: · status:
|
|
45
|
+
|
|
46
|
+
## proof
|
|
47
|
+
|
|
48
|
+
- items: · source: · status:
|
|
49
|
+
- noProof: · source: · status:
|
|
50
|
+
|
|
51
|
+
## assets
|
|
52
|
+
|
|
53
|
+
- logo: · source: · status:
|
|
54
|
+
- brandColors: · source: · status:
|
|
55
|
+
- fonts: · source: · status:
|
|
56
|
+
- screens: · source: · status:
|
|
57
|
+
- footage: · source: · status:
|
|
58
|
+
- music: · source: · status:
|
|
59
|
+
- voice: · source: · status:
|
|
60
|
+
- forbiddenToShow: · source: · status:
|
|
61
|
+
|
|
62
|
+
## format
|
|
63
|
+
|
|
64
|
+
- platform: · source: · status:
|
|
65
|
+
- aspect: · source: · status:
|
|
66
|
+
- lengthSeconds: · source: · status:
|
|
67
|
+
- deliverables: · source: · status:
|
|
68
|
+
|
|
69
|
+
## taste
|
|
70
|
+
|
|
71
|
+
- adjectivesYes: · source: · status:
|
|
72
|
+
- adjectivesNo: · source: · status:
|
|
73
|
+
- tone: · source: · status:
|
|
74
|
+
- likedRefs: · source: · status:
|
|
75
|
+
- dislikedRefs: · source: · status:
|
|
76
|
+
- styleFamilyRanking: · source: · status:
|
|
77
|
+
- lookChoice: · source: · status:
|
|
78
|
+
- motionTaste: · source: · status:
|
|
79
|
+
- typeTaste: · source: · status:
|
|
80
|
+
|
|
81
|
+
## voice
|
|
82
|
+
|
|
83
|
+
- plan: · source: · status:
|
|
84
|
+
- language: · source: · status:
|
|
85
|
+
- pronunciations: · source: · status:
|
|
86
|
+
- musicMood: · source: · status:
|
|
87
|
+
- soundAppetite: · source: · status:
|
|
88
|
+
|
|
89
|
+
## constraints
|
|
90
|
+
|
|
91
|
+
- legalLines: · source: · status:
|
|
92
|
+
- platformRules: · source: · status:
|
|
93
|
+
- approver: · source: · status:
|
|
94
|
+
- revisionTolerance: · source: · status:
|
|
95
|
+
- budgetNotes: · source: · status:
|
|
96
|
+
|
|
97
|
+
## assumptions
|
|
98
|
+
|
|
99
|
+
- assumptions: · source: · status:
|
|
100
|
+
|
|
101
|
+
## openItems
|
|
102
|
+
|
|
103
|
+
- openItems: · source: · status:
|
|
104
|
+
|
|
105
|
+
## clarity
|
|
106
|
+
|
|
107
|
+
- mustHaveTotal: · source: · status:
|
|
108
|
+
- confirmed: · source: · status:
|
|
109
|
+
- score: · source: · status:
|
|
110
|
+
- readbackApproved: · source: · status:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Rating sheet
|
|
2
|
+
|
|
3
|
+
Copy one block per reference ad (to fill the dataset) or per generated draft (to tune the system). Rate 1-5. Free text welcome.
|
|
4
|
+
|
|
5
|
+
## For a reference ad
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Ad id:
|
|
9
|
+
Source link:
|
|
10
|
+
Format / platform:
|
|
11
|
+
Duration (s):
|
|
12
|
+
Would this convince a buyer? (1-5):
|
|
13
|
+
What worked (one line):
|
|
14
|
+
What did not (one line):
|
|
15
|
+
Hook (1-5): Story (1-5): Polish (1-5): Motion (1-5): Typography (1-5): Sound (1-5):
|
|
16
|
+
Moments to copy as patterns (timestamps + what):
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## For a generated draft
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Draft id / brief:
|
|
23
|
+
Hook: Story clarity: Visual polish: Motion quality: Typography: Sound: Look consistency: Would I post this:
|
|
24
|
+
Notes (what feels off, with timestamps):
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Aggregation (evals/README.md)
|
|
28
|
+
Averages per dimension and per look/style; flag a change that lowers any average by >= 0.3 versus the previous run.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Reference ad annotation
|
|
2
|
+
|
|
3
|
+
One record per reference ad. Store annotations, never the video or its assets. Unknown values are null.
|
|
4
|
+
|
|
5
|
+
Required: id, brand, style_family, beats, confidence.
|
|
6
|
+
|
|
7
|
+
| Field | Type | Notes |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| id | string | |
|
|
10
|
+
| brand | string | |
|
|
11
|
+
| source | string | |
|
|
12
|
+
| url | string (may be none) | |
|
|
13
|
+
| format | string (may be none) · one of 9:16, 16:9, 1:1, 4:5 | |
|
|
14
|
+
| duration_s | number (may be none) | |
|
|
15
|
+
| platform | string (may be none) | |
|
|
16
|
+
| style_family | string · one of S1, S2, S3, S4, S5, S6, S7, unknown | |
|
|
17
|
+
| confidence | string · one of H, M, L | confidence of annotation from stills only |
|
|
18
|
+
| rating | integer (may be none) | |
|
|
19
|
+
| rating_notes | string (may be none) | |
|
|
20
|
+
| beats | array | |
|
|
21
|
+
| beats[].n | integer | |
|
|
22
|
+
| beats[].role | string · one of hook, pain, turn, promise, product, proof, brand, cta, bridge, other | |
|
|
23
|
+
| beats[].block | string (may be none) | |
|
|
24
|
+
| beats[].text | string (may be none) | |
|
|
25
|
+
| beats[].t_start_s | number (may be none) | |
|
|
26
|
+
| beats[].t_end_s | number (may be none) | |
|
|
27
|
+
| beats[].notes | string (may be none) | |
|
|
28
|
+
| pain_share | number (may be none) | |
|
|
29
|
+
| turn | string (may be none) | technique of the problem-to-solution switch |
|
|
30
|
+
| motif | string (may be none) | |
|
|
31
|
+
| palette_source | string (may be none) · one of brand, single-accent, per-scene-blocks, gradient, mixed | |
|
|
32
|
+
| palette_notes | string (may be none) | |
|
|
33
|
+
| type_notes | string (may be none) | |
|
|
34
|
+
| text_emphasis | array (may be none) | |
|
|
35
|
+
| grain | string (may be none) · one of none, light, heavy | |
|
|
36
|
+
| blur_on_motion | boolean (may be none) | |
|
|
37
|
+
| sentence_split | integer (may be none) | number of scenes one sentence spans |
|
|
38
|
+
| human_presence | string (may be none) · one of none, b-roll, talking-head, story | |
|
|
39
|
+
| ui_fidelity | string (may be none) · one of skeleton, stylized, real, none | |
|
|
40
|
+
| transitions | array (may be none) | |
|
|
41
|
+
| proof_type | string (may be none) | |
|
|
42
|
+
| sound_notes | string (may be none) | |
|
|
43
|
+
| patterns | array (may be none) | pattern ids from references/patterns.md |
|
|
44
|
+
| lessons | array (may be none) | |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Evaluation procedure
|
|
2
|
+
|
|
3
|
+
Purpose: make quality measurable and make every change to the skill prove itself.
|
|
4
|
+
|
|
5
|
+
## Run
|
|
6
|
+
1. For each brief in `briefs/briefs.md`, start a fresh Claude session with the skill and the brief as the intake answers (G0 prefilled).
|
|
7
|
+
2. Let it run through gates with approvals auto-given at G1-G4 (to measure the machine), or manually (to measure the whole loop).
|
|
8
|
+
3. Save to `evals/runs/<YYYY-MM-DD>/<brief-id>/`: `brief.md`, `storyboard.md`, draft video, contact sheet, `review` output, timing, token/cost notes.
|
|
9
|
+
4. Paid or network services (voice generation, sound search) run with test doubles in automated runs; list which steps were doubled.
|
|
10
|
+
|
|
11
|
+
## Metrics
|
|
12
|
+
| Metric | How |
|
|
13
|
+
|---|---|
|
|
14
|
+
| HARD-check pass after round 1 / round 3 | `review` output |
|
|
15
|
+
| Rounds to clean | count |
|
|
16
|
+
| Anti-pattern hits | scan list |
|
|
17
|
+
| Invented-fact violations | manual check against brief (must be 0) |
|
|
18
|
+
| Human ratings (8 dimensions) | `dataset/rating-sheet.md` |
|
|
19
|
+
| Time to draft | timing |
|
|
20
|
+
|
|
21
|
+
## Aggregation
|
|
22
|
+
Write `evals/runs/<date>/summary.md`: table per brief (checks, rounds, ratings), per-dimension averages, per-style and per-look averages, and a diff against the previous run (flag changes of >= 0.3 or any new HARD failure).
|
|
23
|
+
|
|
24
|
+
## Regression rule
|
|
25
|
+
After any change to a look, block, check, threshold or reference, rerun the 10 briefs. Keep the change only if no dimension average drops by >= 0.3 and no new HARD failure appears. Record result in `CHANGELOG.md`.
|
|
26
|
+
|
|
27
|
+
## Targets (initial)
|
|
28
|
+
- Every draft passes all HARD checks within 3 rounds.
|
|
29
|
+
- Average rating >= 4.0 per dimension on >= 8 of 10 briefs.
|
|
30
|
+
- Zero invented facts.
|
|
31
|
+
|
|
32
|
+
## What cannot be automated
|
|
33
|
+
Taste (look, font pairing), sound (needs listening), voice tone, and whether it "feels" professional. The person rates; the system learns from the ratings.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 10 test briefs (invented products)
|
|
2
|
+
|
|
3
|
+
Each brief is a complete intake answer. Vary format, tone and assets. Facts below are invented for testing; none are real claims.
|
|
4
|
+
|
|
5
|
+
| # | Product | Audience | Goal | Format | Length | Tone | Assets | Proof available | Expected style |
|
|
6
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
7
|
+
| 1 | **QueryLens**: traces slow database queries | Backend developers | Sign up | 16:9 | 30 s | Serious | Screenshots | "Finds the slow query in minutes" (own metric, source: internal test) | S5 or S3 |
|
|
8
|
+
| 2 | **LedgerLeaf**: bookkeeping for freelancers | Freelancers | Free trial | 9:16 | 30 s | Calm | None | Quote from a fictional beta user (permission: yes) | S6 or S2 |
|
|
9
|
+
| 3 | **NoteWise**: AI meeting notes | Team leads | Demo booking | 9:16 | 15 s | Energetic | Screen recording | None | S2 or S5 |
|
|
10
|
+
| 4 | **ShiftGrid**: shift planning | Shop managers | Install | 1:1 | 30 s | Playful | Screenshots | "Saves 3 hours a week" (source: pilot) | S7 or S5 |
|
|
11
|
+
| 5 | **MetricBay**: product analytics dashboard | Product managers | Demo | 16:9 | 45 s | Serious | Real dashboard UI | Number: "10,000 teams" (source: sales deck) | S3 or S4 |
|
|
12
|
+
| 6 | **PaperTrail Design**: design collaboration | Designers | Trial | 9:16 | 30 s | Energetic | Logo, brand colors | None | S2 |
|
|
13
|
+
| 7 | **SafeStep**: security awareness training | HR/IT leads | Demo | 16:9 | 30 s | Serious | None | Certification: "SOC 2 Type II" (source: audit letter) | S1 |
|
|
14
|
+
| 8 | **CartCrafter**: store builder for small shops | Small shop owners | Free trial | 9:16 | 15 s | Playful | Screenshots | None | S6 or S7 |
|
|
15
|
+
| 9 | **CalmClinic Booking**: appointment booking | Clinic admins | Demo | 16:9 | 30 s | Calm | UI mock | "Cuts no-shows" must NOT be used (no source) | S5 or S4 |
|
|
16
|
+
| 10 | **FocusFern**: habit and focus tracker | Students | Install | 9:16 | 30 s | Playful | None | None | S6 or S7 |
|
|
17
|
+
|
|
18
|
+
## What each brief tests
|
|
19
|
+
- 2, 8, 10: no assets, no proof (does the system avoid inventing?).
|
|
20
|
+
- 9: a forbidden claim (does the system refuse and flag it?).
|
|
21
|
+
- 5, 7: proof handling (number with source, credential).
|
|
22
|
+
- 6: brand override.
|
|
23
|
+
- 1, 5: dense UI at 16:9; contrast and min size.
|
|
24
|
+
- 3, 8: 15 s hook-led.
|
|
25
|
+
- Mixed formats: 9:16 (2,3,6,8,10), 16:9 (1,5,7,9), 1:1 (4).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# LOG: flomotion-ad
|
|
2
|
+
|
|
3
|
+
## Decisions
|
|
4
|
+
|
|
5
|
+
- 30 s, 9:16, 128 bpm (one beat = 0.46875 s, 64 beats). Every cut is on a beat and has its own transition (the `wipes` track).
|
|
6
|
+
- Look `bold-kinetic` (energetic): flat colour blocks, heavy type, dark text on every block (it passes the contrast lint).
|
|
7
|
+
- Turn: two big dots converge, merge, split, grow into the next slide. A vault door (circles and rounded rectangles) then opens onto the name, and closes over the ledger later. Both ideas are the person's.
|
|
8
|
+
- Hero: a mascot dot with eyes on its own track; it blinks, looks at the product, spins on "Again.", hides in the turn, and pulses on the beat after the drop.
|
|
9
|
+
- Voice: ElevenLabs "Jessica" (a library voice such as "Zara" cannot be used through the API on a free plan: `paid_plan_required`), `eleven_multilingual_v2`, one clip per phrase placed on its beat (`scripts/build-voice.py`). 14 clips, about 350 characters of the free allowance.
|
|
10
|
+
- Music: three CC0 Freesound loops (Loop 128 Bpm, Electro House drums, Piano arp pitched down 4 semitones into the bed's key), arranged offline with a drop on the turn (`scripts/build-music.py`). Real whooshes, a glitch and a riser-hit from Freesound; small ticks, pops, types and hits are original synthesized sounds.
|
|
11
|
+
- The copy was rewritten with `references/script-craft.md`. "Live" was dropped because it is a heteronym; the line is "come alive". "Same video every time" was cut (see below) and replaced by "Diff it like code."
|
|
12
|
+
- Product shots are real captures of the live view (`asset_capture`) of a demo project a script worked on; the licence panel is this video's own ledger. It is not a recording of a live Claude session.
|
|
13
|
+
|
|
14
|
+
## What ran
|
|
15
|
+
|
|
16
|
+
- `lint`: 0 errors, 0 warnings.
|
|
17
|
+
- `review` (several rounds): 17 checks run, 0 failing. Warning 7 (text moving through the edge of the frame while it enters, and wipes covering text at the cuts, both by design). Warning 16: the voice is ElevenLabs output on a free plan and is not cleared for commercial use. Check 9 once failed (white captions on light blocks) and was fixed with dark one-word captions.
|
|
18
|
+
- `mix_preview` / render: -14.9 LUFS, true peak -1.5 dBTP (targets -14 +/-1, <= -1.0).
|
|
19
|
+
- Render `final`: 1080x1920, 30 fps, 30.0 s, H.264 + AAC, 9.6 MB, 17 ledger entries. Frames pulled from the MP4 were checked by eye.
|
|
20
|
+
|
|
21
|
+
## What I found while making it (engine)
|
|
22
|
+
|
|
23
|
+
- The audio mix was not repeatable: two renders of the same project differed in the last samples (`sidechaincompress` paired frames in thread order). Fixed in `packages/render/src/audio.ts`, with a regression test that fails without the fix. The mix is now byte-identical.
|
|
24
|
+
- `local:` sounds did not resolve on a fresh checkout (they resolved only through an ignored cache). Fixed; a clean-clone render matched the original at the time.
|
|
25
|
+
- **The video is not byte-identical between renders of this project.** About 1-pixel edge differences appear on elements with animated transforms (the counters, the mascot, rotated cards). Single frames are identical every time, and software GL and one worker do not change it. HyperFrames' own deterministic path is `--docker`. Simple scenes (the engine tests) are identical. I did not trace it to one element. This is why the ad does not claim "same video every time".
|
|
26
|
+
|
|
27
|
+
## Not run / unverified (read this)
|
|
28
|
+
|
|
29
|
+
- **Nobody has listened to anything.** The voice, the music and the effects are choices made from measurements. Audition them.
|
|
30
|
+
- The three reference pieces were studied from frames and loudness only; I could not hear their speech or music.
|
|
31
|
+
- The voice is on ElevenLabs' free plan. As I understand its terms, the output needs attribution and is not licensed for commercial use: check them before you publish.
|
|
32
|
+
- A lot of this was written with the file tools, not `scene_write`, so `history_*` holds only the font snapshots.
|
|
33
|
+
- No real Claude Code session, no Whisper (the word times come from ElevenLabs).
|
|
34
|
+
- Keys for Freesound and ElevenLabs were pasted into the chat: regenerate them.
|
|
35
|
+
- Pixabay music was preferred, but the file path was not supplied, so none is used.
|
|
36
|
+
|
|
37
|
+
## Gate state
|
|
38
|
+
|
|
39
|
+
G0-G4 done in the files; G5 draft and G6 final rendered; approval is the person's.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Brief: flomotion ad
|
|
2
|
+
|
|
3
|
+
Every line: `value · source · status` (source: user, asset or assumption; status: confirmed, assumed or unknown).
|
|
4
|
+
|
|
5
|
+
## product
|
|
6
|
+
- name: flomotion · user · confirmed
|
|
7
|
+
- oneLiner: a video is one TSX file; Claude edits it through typed MCP tools while you watch · asset (the repo) · confirmed
|
|
8
|
+
- wowFeature: the live view, and every control is a typed prop · assumption · assumed
|
|
9
|
+
|
|
10
|
+
## audience
|
|
11
|
+
- primary: developers and creators who use Claude Code · assumption · assumed
|
|
12
|
+
|
|
13
|
+
## goal
|
|
14
|
+
- action: run `npx flomotion` · assumption · assumed
|
|
15
|
+
- cta: npx flomotion · assumption · assumed
|
|
16
|
+
|
|
17
|
+
## format
|
|
18
|
+
- size: 1080x1920, 30 fps, 30 s, 128 bpm · user ("a SaaS style ad") + assumption · assumed
|
|
19
|
+
|
|
20
|
+
## taste
|
|
21
|
+
- look: bold-kinetic, energetic: flat colour blocks, heavy type, hard cuts, a mascot dot · user ("energetic") · confirmed
|
|
22
|
+
- references: three short motion pieces the person collected (see `references/clean-styles.md` in the skill) · user · confirmed
|
|
23
|
+
- turn: two big dots converge into a small dot, split in two, and grow into the next slide · user · confirmed
|
|
24
|
+
- metaphor: a vault door (safe), as in a reference ad for data rooms · user · confirmed
|
|
25
|
+
|
|
26
|
+
## voice
|
|
27
|
+
- voice: ElevenLabs premade "Jessica", a girl's voice · user ("a girl voice suits better") · confirmed
|
|
28
|
+
- model: eleven_multilingual_v2 (the person's free plan has no expressive model) · user · confirmed
|
|
29
|
+
|
|
30
|
+
## facts allowed on screen (each verified in the repo)
|
|
31
|
+
- 39 MCP tools: `tools/list` of the packaged server · asset · confirmed
|
|
32
|
+
- 17 automatic review checks: `review` returns 17 · asset · confirmed
|
|
33
|
+
- the ad is one TSX file: `examples/flomotion-ad/project.tsx` · asset · confirmed
|
|
34
|
+
|
|
35
|
+
## forbidden
|
|
36
|
+
- testimonials, customer logos, user counts, speed claims, superlatives
|
|
37
|
+
- "same video every time": not true byte for byte for this project (see LOG.md)
|
|
38
|
+
|
|
39
|
+
## constraints
|
|
40
|
+
- music: Freesound CC0 loops, arranged; no paid music · user ("pixabay is better" but could not supply a file) · assumed
|
|
41
|
+
- clarity: unattended run, readings recorded above · assumption
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Ideas
|
|
2
|
+
|
|
3
|
+
One line per idea: `- [ ] text (you)` or `- [x] text (claude)`. Tick it when it is used or dropped.
|
|
4
|
+
|
|
5
|
+
- [x] two big dots converge into a small dot, split into two, grow into the next slide (you)
|
|
6
|
+
- [x] a vault door like the data-room ad, to say "safe" (you)
|
|
7
|
+
- [x] a girl's voice (you)
|
|
8
|
+
- [x] a mascot dot with eyes that reacts to the story (claude)
|
|
9
|
+
- [x] close the loop: the prompt typed in the hook comes back "rendered" in the CTA (claude)
|
|
10
|
+
- [x] reveal at the end: "This whole ad is one TSX file." (claude)
|
|
11
|
+
- [ ] a second cut for 16:9 with the same script (claude)
|
|
12
|
+
- [ ] a glowing line that threads the scenes together, like the language-app piece (claude)
|