tesseract-agent 0.12.2-beta.2 → 0.12.2-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist-bundle/builtin-skills/3d-product-shots/SKILL.md +16 -1
  2. package/dist-bundle/builtin-skills/comic-maker/SKILL.md +96 -0
  3. package/dist-bundle/builtin-skills/font-and-logo-design/SKILL.md +4 -3
  4. package/dist-bundle/builtin-skills/game-dev/SKILL.md +15 -2
  5. package/dist-bundle/builtin-skills/image-generation/SKILL.md +6 -5
  6. package/dist-bundle/builtin-skills/makers/SKILL.md +2 -1
  7. package/dist-bundle/builtin-skills/motion-graphics/SKILL.md +29 -1
  8. package/dist-bundle/builtin-skills/product-ads/SKILL.md +21 -2
  9. package/dist-bundle/builtin-skills/promo-videos/SKILL.md +21 -1
  10. package/dist-bundle/builtin-skills/social-posts/scripts/check_post.py +25 -7
  11. package/dist-bundle/builtin-skills/tesseract-help/SKILL.md +1 -1
  12. package/dist-bundle/builtin-skills/tesseract-help/references/app-control-map.md +1 -1
  13. package/dist-bundle/builtin-skills/tesseract-help/references/troubleshooting.md +1 -1
  14. package/dist-bundle/builtin-skills/thumbnails/SKILL.md +41 -7
  15. package/dist-bundle/builtin-skills/video-editing/references/edl.md +6 -0
  16. package/dist-bundle/builtin-skills/video-generation/SKILL.md +1 -1
  17. package/dist-bundle/builtin-skills/video-generation/references/prompting.md +29 -17
  18. package/dist-bundle/catalog-vectors/embeddinggemma-300m-q4@ort1.23.2.bin +0 -0
  19. package/dist-bundle/cli.js +25836 -17832
  20. package/dist-bundle/codex-rm-hook.js +919 -2
  21. package/dist-bundle/mesh-core/package.json +1 -1
  22. package/dist-bundle/office-page.css +1 -1
  23. package/dist-bundle/office-page.js +664 -664
  24. package/dist-bundle/office.js +310 -85
  25. package/dist-bundle/pdf.js +157 -26
  26. package/dist-bundle/serpapi-mcp.js +15193 -8176
  27. package/package.json +3 -2
@@ -2,7 +2,7 @@
2
2
  name: 3d-product-shots
3
3
  description: Make studio-quality product pictures and 3D-style renders of the person's own product — clean packshots on white or a seamless colour for a shop or a marketplace, a matching set of angles, hero shots with dramatic light, creative 3D scenes (floating ingredients, a miniature world around the product, an inflatable or surreal version, a product on a plinth), a 360° turntable or orbit clip, and true 3D renders when they have a 3D model file (GLB, glTF, OBJ, STL, FBX) placed under a camera and lights in Tesseract's motion editor — every one keeping the product exactly itself (shape, label, colour, parts), checked against the original photo. Use for product photography, e-commerce images, 3D renders, mockups or a spinning product video. Not for a finished video ad with words and a call to action (product-ads), another company's product, or a logo (makers).
4
4
  license: MIT AND CC-BY-4.0
5
- version: 1.0.1
5
+ version: 1.1.0
6
6
  metadata:
7
7
  tesseract.summary: Packshots, angle sets, 3D-style hero renders and turntable clips of your own product — kept exact.
8
8
  tesseract.category: media
@@ -56,6 +56,21 @@ image edit is a few cents to about $0.15; a 5-second clip about $0.25–0.50; an
56
56
  keys `generate_video` returns the estimate first; confirm with `confirmed_cost_usd`. Make **one** picture of the hardest
57
57
  look first, get a yes, then the rest in the same light and framing.
58
58
 
59
+ **The pilot sets the rest.** The approved pilot is the reference: every later picture repeats its light, ground and
60
+ scale, and a clip's `first_frame_image` is the approved packshot itself.
61
+
62
+ **Write every paid call**, in order, after the go-ahead: each `edit_image` naming the person's photo as its source and
63
+ the exact instruction, then `image_inspect` with the original and the result. Never `generate_image` from words alone
64
+ for the real product: a model that has not seen it redraws it. For a clip: `video_providers_status` and
65
+ `list_camera_moves` first. For a 3D file: the whole motion-editor sequence (`comp`, `place`, `camera`, `light`, the
66
+ turn, `render`), and the hero still comes from that same scene instead of a paid edit.
67
+
68
+ **What you may promise.** Never "exact", "100%" or "identical": say the picture will be compared with their photo and
69
+ every difference listed. A side they did not photograph is a reconstruction, named as one. With only some sides
70
+ photographed, a full turn cannot be truthful: offer the `arc-left` through the sides you have, and say which photos
71
+ would allow the full turn. A request to stand the product next to another brand's is declined in one plain sentence, with
72
+ a stronger solo picture offered; size or quality comparisons with another product are never drawn.
73
+
59
74
  ## 4. Check every picture against the real product
60
75
 
61
76
  `image_inspect` with the original photo and the result: "Compare the product in both pictures: shape, proportions,
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: comic-maker
3
+ description: Make a comic, manga or webtoon from an idea or a whole script — chapters, pages and panels with the same characters, speech balloons as real editable text, left to right or right to left — and edit it in the comic editor, by hand and by you. Saves as PDF, CBZ and a vertical strip. Use for comics, manga, graphic novels, webtoons, comic strips, gag strips and storybook comics. Not for one comic-style picture (image-generation) or an animated video (video-generation).
4
+ license: MIT
5
+ version: 1.0.0
6
+ metadata:
7
+ tesseract.summary: A comic, manga or webtoon from an idea or script, with real balloons you can edit, in PDF, CBZ and a vertical strip.
8
+ tesseract.category: media
9
+ tesseract.needs: desktop
10
+ tesseract.examples: "make a manga about two rival bakers | turn this script into a comic | make a webtoon episode from my story | change the words in the second balloon on page 3 | make my comic read right to left | save it as a CBZ"
11
+ tesseract.tools: app_studio, cast_list, cast_save, find_ideas, get_idea, image_inspect
12
+ ---
13
+
14
+ # Comics
15
+
16
+ The deliverable is a `.tscomic` in its own folder under `~/Documents/Tesseract/Comics/`, open in the comic editor beside
17
+ the chat, and whatever the person saves from it: a PDF, a CBZ, a vertical strip. The words are never in the pictures. A
18
+ panel holds a picture with no lettering; its balloons are text on top. That is the point of this maker: a line can
19
+ be changed or translated at any time, for free, and the picture stays as it is.
20
+
21
+ ## The rules, before anything else
22
+
23
+ - **Real people.** A real person appears only through a saved card that holds their consent (`cast_list`; `cast_save`
24
+ with `consent_from`). Never by name in words, never from a photo that is not on a card. The maker refuses a real
25
+ private person with no card, and the drawing refuses a card whose check has not passed: say why in one plain sentence
26
+ and offer a made-up character instead.
27
+ - **No public figures**, in any role, satire included. Nobody who looks under 18 in anything romantic or sexual, and
28
+ nothing sexual about a real person. A story about a real private person that could hurt them is declined.
29
+ - **Other people's characters and brands stay out.** No superhero, cartoon or game character the person does not own, by
30
+ name or by costume. An original character can do the same job. "In the style of" a living artist is declined; a
31
+ look (manga, noir, clear line) is fine.
32
+ - **Drawing costs money.** `panel.draw` with `artist: "model"` and `character.draw_reference` are paid pictures, one per
33
+ panel: say how many and roughly what it costs, and wait for a yes. `artist: "sketch"` is free, and so is every
34
+ word, layout and export.
35
+
36
+ ## Starting one
37
+
38
+ Use the maker for a new comic: `app_studio` `studio.start` `{ kind: "comic", about: <their words> }`. A pasted script goes
39
+ in `about` whole. It asks only what is left open, shows the plan beside the chat, and writes every chapter with
40
+ free sketches. No plan yet ("give me comic ideas for my bakery"): `find_ideas` with `category: "comics"`, offer two or
41
+ three, then `get_idea` the one they pick.
42
+
43
+ For a character who must look the same everywhere, use a saved card: "@maya" in what they said ties her to the card, and
44
+ its pictures go with every panel she is in. A made-up character gets a text sheet, the same fixed words said in
45
+ every panel; `character.draw_reference` draws one picture of them that then goes with every panel too. Do that before
46
+ drawing the panels, not after: it is what keeps a face the same.
47
+
48
+ ## Working in it
49
+
50
+ Everything goes through `documents.*` with the comic's `path`, and the person sees it happen.
51
+
52
+ | To | Command |
53
+ |---|---|
54
+ | See it all | `documents.read` with no arguments: chapters, characters, how many panels are drawn |
55
+ | See a page | `documents.read` `{ page: 3 }`; add `render: true` to get the page as a picture, and look at it |
56
+ | Change words | `balloon.set_text` `{ balloon, text }` |
57
+ | Add a line | `balloon.add` `{ panel, text, kind, speaker }` |
58
+ | Kinds of balloon | `speech`, `thought`, `shout`, `whisper`, `caption` (narration, no tail), `sfx` (a noise, no shape) |
59
+ | Place it | `balloon.move`, `balloon.resize`, `balloon.set_tail` (fractions of the panel), `balloon.set_vertical` for Japanese or Chinese |
60
+ | Pages | `page.add`, `page.delete`, `page.move`, `page.set_layout` (it refuses to lose a panel with work in it) |
61
+ | Panels | `panel.set_shot` (what is drawn), `panel.set_cast`, `panel.move`, `panel.resize`, `panel.crop`, `panel.set_picture` for their own art |
62
+ | Chapters | `chapter.add`, `chapter.rename`, `chapter.move`, `chapter.delete` |
63
+ | Reading order | `page.auto_order` from where things stand, or `panel.reorder`, `balloon.reorder`; `comic.show_order` numbers them on screen |
64
+ | Manga | `comic.set_direction` `{ direction: "rtl" }` mirrors every page, panels and balloons; the pictures are not flipped |
65
+ | Draw | `panel.draw` `{ panel }`, `{ page }` or `{ all: true }`, with `artist`; it keeps what is drawn if it stops |
66
+ | Touch up a picture | `panel.edit_picture` opens it in the image editor |
67
+ | Undo | `edit.undo`, `edit.redo` |
68
+ | Save it | `export.pdf`, `export.cbz`, `export.webtoon` |
69
+
70
+ Arguments may name a panel by id or by its number on the open page; `documents.commands` lists every command.
71
+
72
+ ## Good comics
73
+
74
+ - **One beat per panel, one idea per page.** A page turn is the comic's best trick: put the surprise on the first panel of
75
+ a new page.
76
+ - **Short lines.** About 20 words at most in a balloon, two balloons in most panels. If `documents.read` flags a balloon
77
+ `overflow`, cut the words first; make the balloon bigger only after that.
78
+ - **The shot never holds dialogue.** `shot` says place, action, camera and mood. A panel with text in the picture is a
79
+ panel that cannot be translated.
80
+ - **Vary the panels.** Wide for places, tight for faces, one big panel for the moment everything turns on.
81
+ - **Look at it.** After a page is drawn, `documents.read` `{ page, render: true }` and check that balloons do not cover
82
+ faces, tails point at the right mouth, and the reading order is the one you meant. Compare a character across
83
+ pages with `image_inspect` before saying they match.
84
+
85
+ ## Saving it
86
+
87
+ | Format | For | What it holds |
88
+ |---|---|---|
89
+ | `export.pdf` | printing, sending | every page at print size, chapters as bookmarks, the reading direction set, the words searchable where the letters are Latin |
90
+ | `export.cbz` | comic reader apps | pictures in reading order, with `ComicInfo.xml`; a right-to-left comic is marked as manga |
91
+ | `export.webtoon` | WEBTOON, Tapas, phones | each chapter stacked panel by panel in images 800 px wide and at most 1280 px tall, cut in the gaps, with a page to read them; a chapter too big for one episode is named |
92
+
93
+ They land in the comic's `Exports` folder. A CBZ and a strip are pictures by nature: to change a line, change it in the
94
+ comic and save again.
95
+
96
+ Hand-offs: `image-generation` for one picture; `video-generation` to animate a panel; `social-posts` to post pages.
@@ -2,7 +2,7 @@
2
2
  name: font-and-logo-design
3
3
  description: Turn a person's handwriting (a photo or a filled-in template) into an installable font — TTF, plus WOFF2 and CSS for the web — test that a font file really renders and covers the characters it should, and make wordmarks, monograms and simple logos as clean SVG. Use when someone wants a font from their handwriting or in a described style, wants a font file checked or previewed, or wants a wordmark or logo for a name or brand. Fonts in a described style and full brand kits are made in Tesseract's Fonts tab, which this skill hands over to; for illustrations, photos or painterly images use image-generation, for a project's colour and type tokens use design-system, and for a logo made with the person on the canvas beside the chat, or switched to from a picture or an app, use makers.
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.0.2
6
6
  metadata:
7
7
  tesseract.summary: "Fonts from handwriting, font files checked, a wordmark or logo as SVG to stated needs. Made beside the chat: makers."
8
8
  tesseract.category: design
@@ -18,8 +18,9 @@ same on every machine, checked at favicon size and on dark backgrounds. The agen
18
18
  blob is which letter, whether a glyph looks right); deterministic tools do the geometry. Never edit glyph
19
19
  outlines or path coordinates by hand.
20
20
 
21
- If the person wants a logo made with them beside the chat — a brand to look at and change, or a picture or an app
22
- they are switching into a logo — load `makers` now and start its logo maker.
21
+ A logo asked for in plain words ("make me a logo for my bakery") is the logo maker's: load `makers` now and start it,
22
+ before anything else here. So is a picture or an app they are switching into a logo. This skill is for what the maker
23
+ does not do: a font, a font file checked, or a logo as a named file ("a wordmark as an SVG").
23
24
 
24
25
  ## 1. Pick the route
25
26
 
@@ -2,12 +2,12 @@
2
2
  name: game-dev
3
3
  description: Make a small game people can play, or a generative or interactive art piece, in the browser — on the canvas beside the chat (render_canvas) or as an HTML file — an arcade, puzzle or platform game, a p5.js sketch, a flow field or particle piece, a shader, a three.js 3D scene. Covers the game loop, keyboard and touch input, a pause, both themes, phone width, no flashing, frame rate and memory, playing it once headless to prove it runs, and a concept-art loop for scenes that must look stunning. Use when someone wants to make, fix or polish a browser game, a sketch, generative art or an animated visual they can steer. For tools, forms and dashboards use interactive-ui; for static pages canvas-design; for pictures, sprites and textures image-generation (pixel sprites pixel-art); to play chess, play_chess.
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.1.0
6
6
  metadata:
7
7
  tesseract.summary: Make a small playable game or a generative art piece on the canvas or as a file, and prove it runs.
8
8
  tesseract.category: learning
9
9
  tesseract.examples: "make a little snake game I can play here | build me a generative art piece in p5.js I can reseed | my canvas game runs way too fast on the new monitor, fix it | programmier mir ein kleines Jump'n'Run, das man auch am Handy spielen kann | làm giúp mình một game 3D nhỏ bằng three.js chơi được trên điện thoại"
10
- tesseract.tools: render_canvas, generate_image, edit_image, image_inspect, design_judge, tesseract_spawn_subagent, browser_open, site_publish, ask_user
10
+ tesseract.tools: render_canvas, generate_image, edit_image, image_inspect, design_judge, tesseract_spawn_subagent, browser_open, site_publish, ask_user, make_playable_ad
11
11
  ---
12
12
 
13
13
  # Game dev
@@ -135,3 +135,16 @@ Built from Hermes Agent's `p5js` skill, with its `dream-loop` skill merged in (M
135
135
  `LICENSE-MIT-NousResearch.txt`); dream-loop is itself adapted from Anshu Chimala's dream-loop (MIT, © 2026 Anshu
136
136
  Chimala, see `LICENSE-MIT-AnshuChimala.txt`). `templates/sketch.html` is adapted from the p5js viewer template;
137
137
  `scripts/game_check.mjs` and `templates/arcade.html` are written for Tesseract. Modified by Tesseract.
138
+
139
+ ## A playable ad of the game
140
+
141
+ `make_playable_ad` packs a browser game into the one file an ad network takes: every asset inside it, libraries from a
142
+ CDN fetched at export, the network's own install call, weighed against its limit (5 MB for most, 2 MB for one HTML to
143
+ Meta or Moloco). Three things keep a game fit for it:
144
+
145
+ - **Name assets whole.** `'assets/hero.png'` is found and embedded; `'assets/' + name + '.png'` is not, and the answer
146
+ lists what was left out.
147
+ - **Call the ad's hooks when it is an ad.** `window.tesseractAd?.cta()` at the install moment, `.end()` at win or loss,
148
+ `.retry()` on a replay. A game that calls none still gets a button and an end card.
149
+ - **Stay light.** A three.js game with no big models packs to about 1.2 MB as one HTML, and 0.35 MB zipped. An engine's
150
+ web build (Unity, Godot) does not fit: build a small browser version of its best minute for the ad.
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: image-generation
3
- description: Generate or edit images directly in the chat (OpenAI gpt-image-2 or Google Nano Banana Pro), including transparent-background PNGs. Use when the user asks to create, generate, draw, or make an image / picture / icon / logo / illustration, to edit an existing image, or to make variations of one. A logo with its brand, made with the person on the canvas beside the chat, is makers, and so is a picture they switch into a logo, an app or a video; a vector (SVG) wordmark is font-and-logo-design.
3
+ description: Generate or edit images directly in the chat (GPT Image 2.5 or Google Nano Banana 2), including transparent-background PNGs. Use when the user asks to create, generate, draw, or make an image / picture / icon / logo / illustration, to edit an existing image, or to make variations of one. A logo with its brand, made with the person on the canvas beside the chat, is makers, and so is a picture they switch into a logo, an app or a video; a vector (SVG) wordmark is font-and-logo-design.
4
4
  license: MIT
5
- version: 1.3.4
5
+ version: 1.3.5
6
6
  metadata:
7
7
  tesseract.summary: "One picture, icon or illustration generated or edited in the chat, transparent PNGs included."
8
8
  tesseract.category: media
@@ -15,10 +15,11 @@ metadata:
15
15
  You can generate images directly in the chat with the `generate_image` tool and edit existing
16
16
  images with the `edit_image` tool (both from the `tesseract-imagegen` MCP server).
17
17
  `generate_image` creates **4 images by default** and displays them to the user automatically.
18
- Two providers are supported, each using the user's own API key:
18
+ Three providers are supported, one with no key and two on the user's own API key:
19
19
 
20
- - **OpenAI** — `gpt-image-2`
21
- - **Google** — Nano Banana Pro (`gemini-3-pro-image`)
20
+ - **Tesseract** — `gpt-image-2.5-flare`, no key needed
21
+ - **OpenAI** — `gpt-image-2.5-flare`
22
+ - **Google** — Nano Banana 2 (`gemini-3.1-flash-image`)
22
23
 
23
24
  ## How to handle a request to generate an image
24
25
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: makers
3
3
  description: Tesseract's makers — the guided flows behind the Home cards that make a picture, a logo (a brand), a website, a mobile app, a video, a presentation, a personal assistant, a deep research report, a data analysis, a game (played in the browser on the canvas, or a real Unity, Unreal or Godot project), a skin for the Tesseract app itself, a new project folder set up the way the person describes, a piece of writing (an email, a letter, a blog post, a CV), a postcard, a set of social media posts or one of their photos enhanced, on a canvas beside the chat. Use whenever the person wants one of these made (in any chat, not only one opened from a card), when the conversation is already making one and the person answers it or asks for a change, and when they want to switch from one kind to another ("make it a logo instead", "now turn this into an app"). Code the person builds in a project of their own, or putting an existing site online, is build-website-or-app; a font, or a wordmark or logo as an SVG file to stated requirements, is font-and-logo-design.
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  metadata:
6
6
  tesseract.summary: "A logo, website, app, video or deck made for the person beside the chat, watched as it forms, or switched to another."
7
7
  tesseract.category: general
@@ -35,6 +35,7 @@ own tools, so prefer it.
35
35
  | `writing` | a piece of writing — an email, a letter, a blog post, a CV, a speech — outlined first, then drafted in a document they edit by hand and by asking; copied, saved as Word or PDF, or opened as an email |
36
36
  | `postcard` | a postcard: a picture with a headline on the front; the message, a stamp box and address lines on the back — turned over on the canvas, saved as a PDF at a real postcard size to print, or as pictures to send |
37
37
  | `social` | social media posts: a plan of posts, each with a caption written for every platform it goes to (Instagram, Facebook, LinkedIn, X, TikTok, Threads, Pinterest) and a matching picture — shown as each feed shows it, saved with a CSV the schedulers import |
38
+ | `comic` | a comic, manga or webtoon: from an idea or a whole script to chapters, pages and panels, the lines in real balloons, the same characters through the Cast, in the comic editor; saved as a PDF, a CBZ or a vertical strip (the `comic-maker` skill) |
38
39
  | `photo` | their own photo, enhanced: looked at, then the few steps it needs (light and colour, sharpening, a cut-out, made bigger — free, on this computer; restoring, colourising, retouching, restyling — with AI), shown before and after. `picture` is for a new picture |
39
40
 
40
41
  ## The tool
@@ -2,7 +2,7 @@
2
2
  name: motion-graphics
3
3
  description: Animate titles, logos and graphics in Tesseract's own motion-graphics editor (a .tsmotion project, driven with App Control documents.*) — title cards, logo reveals, lower thirds, kinetic typography and animated quotes, end cards with a call to action, animated stats and callouts, 3D extruded text, a 3D model of a product turning under a camera and lights, text over tracked footage — with keyframes, easing, text animators, expressions, 76 ready presets (backgrounds, behaviours, transitions, text), masks and effects, rendered to MP4 (or exported as Lottie for an app or a website) and dropped into an edit. Use when someone wants something animated rather than filmed or generated — an intro, an outro, a logo sting, a title sequence, an animated explainer graphic, or words that move. Not for cutting footage (video-editing), AI-generated footage (video-generation) or a still logo (makers, font-and-logo-design).
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.1.0
6
6
  metadata:
7
7
  tesseract.summary: Animated titles, logo reveals, lower thirds, kinetic type and 3D text in Tesseract's motion editor.
8
8
  tesseract.category: media
@@ -19,6 +19,34 @@ render to MP4. You drive it through App Control: `app_documents` with `documents
19
19
  over at any moment. Timing and easing rules: [references/motion-principles.md](references/motion-principles.md).
20
20
  Ready recipes: [references/recipes.md](references/recipes.md).
21
21
 
22
+ ## The job, call by call
23
+
24
+ Write the whole list of `app_documents` calls in your plan, down to `render` and `save`, one call per line. Each is
25
+ `{ "action": "documents.run", "path": "…", "command": "<name>", "args": { … } }`, and the build always starts on `comp`.
26
+ A title that eases in, in full:
27
+
28
+ ```json
29
+ { "action": "documents.read", "path": "/abs/intro.tsmotion" }
30
+ { "action": "documents.commands", "path": "/abs/intro.tsmotion", "filter": "layer" }
31
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "comp", "args": { "width": 1920, "height": 1080, "fps": 30, "seconds": 4, "background": "#14213D" } }
32
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "layer", "args": { "add": "text", "text": "Oak & Iron", "x": 960, "y": 540, "size": 120, "fill": "#FFF4E0" } }
33
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "properties", "args": { "layer": "Oak & Iron" } }
34
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "set", "args": { "layer": "Oak & Iron", "path": "transform/opacity", "value": 0, "atSec": 0, "key": true } }
35
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "set", "args": { "layer": "Oak & Iron", "path": "transform/opacity", "value": 100, "atSec": 0.6, "key": true } }
36
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "keyInterp", "args": { "layer": "Oak & Iron", "path": "transform/opacity", "atSec": [0, 0.6], "kind": "ease" } }
37
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "render", "args": {} }
38
+ { "action": "documents.run", "path": "/abs/intro.tsmotion", "command": "save", "args": {} }
39
+ ```
40
+
41
+ Take the real property paths from `properties`; the ones above show the shape. No project open yet: ask for one in the
42
+ reply and still write the whole list with the path it will have.
43
+
44
+ **Design.** A background has no lettering: a solid, a gradient, a preset, or a picture made with "no text, no letters".
45
+ Each word appears once, as a text layer: never a picture of the same title behind it. One idea per frame, at most
46
+ three text layers, one type family, a lower third only in its lower third. In the 16:9 title-safe area the longest
47
+ line at `size` 120 is about 28 characters; break longer lines into separate layers. Quotes: check the attribution
48
+ and say so when it cannot be confirmed.
49
+
22
50
  ## 1. Open a project
23
51
 
24
52
  - **A motion project is a `.tsmotion` file.** An existing one: its path (`app_documents` `documents.list` shows what is
@@ -2,12 +2,12 @@
2
2
  name: product-ads
3
3
  description: Make a finished short video ad for the person's own physical product — from a product photo, a saved product card or the page of the product in their own shop — in the shapes TikTok, Reels, Stories, Shorts, the Instagram and Facebook feeds, YouTube, LinkedIn, X and Pinterest want (9:16, 1:1, 4:5, 16:9), with packshots that move, clips or product effects made from them, an optional voice-over or a talking presenter (the person, or a character who agreed), music, the brand's colours, logo and words kept inside each platform's safe zone, and a call-to-action end card; priced once before anything is paid, then rendered per format and kept as editable projects, with free variants of the hook or call to action. Use when someone wants an ad, a promo clip or a set of ad variants for something they make or sell. Not for another company's product or brand, software demos from screen captures (product-videos), entertaining feed posts (social-posts), or researching competitors' ads (ad-research).
4
4
  license: MIT
5
- version: 1.1.1
5
+ version: 1.2.0
6
6
  metadata:
7
7
  tesseract.summary: A ready-to-post video ad for your own product in every platform's shape — priced once, editable.
8
8
  tesseract.category: media
9
9
  tesseract.examples: "give me ad ideas for my dental clinic | make a 15-second TikTok ad for my candles from this photo | turn my shop's product page into Reels and feed ads | haz un anuncio en vídeo de mi mochila para Instagram y YouTube | faça três versões do anúncio com ganchos diferentes | 用这张产品照片给我的茶叶做一个竖版广告视频"
10
- tesseract.tools: make_ad, find_ideas, get_idea, ask_form, edit_image, generate_image, image_inspect, image_providers_status, cast_list, cast_save, list_voices, list_effects, video_providers_status, list_camera_moves, extract_video_frames, probe_video, browser_open, browser_eval, check_video_job
10
+ tesseract.tools: make_ad, make_playable_ad, find_ideas, get_idea, ask_form, edit_image, generate_image, image_inspect, image_providers_status, cast_list, cast_save, list_voices, list_effects, video_providers_status, list_camera_moves, extract_video_frames, probe_video, browser_open, browser_eval, check_video_job
11
11
  ---
12
12
 
13
13
  # Product ads
@@ -57,6 +57,25 @@ rough cost — and `get_idea` the one they pick.
57
57
  - An idea is a starting point, not a script to copy: the person's product, voice and offer make it theirs. Creator
58
58
  formats are the `short-form-video` skill's; a promo that is not one product's ad is `promo-videos`.
59
59
 
60
+ ## A playable ad, for a game or an app
61
+
62
+ When the thing advertised is the person's own game or app and they want an ad people can play, this is not a video:
63
+ `make_playable_ad` packs a browser game from the game maker (or any folder with an `index.html`) as the one file an ad
64
+ network takes, with the network's own install call, inside its size limit. It is free. No game yet: start the game
65
+ maker for a short version of the game's best minute; a playable is 15 to 30 seconds of play, then the end card.
66
+
67
+ | Network | File | Limit | Needs |
68
+ |---|---|---|---|
69
+ | AppLovin, any MRAID network | one HTML | 5 MB | the store address |
70
+ | Unity Ads | one HTML | 5 MB | both store addresses |
71
+ | Meta, Moloco | one HTML | 2 MB | nothing more; Meta also wants a lead-in video |
72
+ | Google Ads, Mintegral | a zip | 5 MB | nothing more |
73
+ | TikTok | a zip with config.json | 5 MB | a picture or video beside it |
74
+ | Liftoff | one HTML | 5 MB | nothing more |
75
+
76
+ Only their own game and their own store pages. These limits were read from guides, not from every network's own page:
77
+ tell them to try each file in the network's preview tool before paying for a campaign.
78
+
60
79
  ## 1. Brief
61
80
 
62
81
  One `ask_form` for what is missing:
@@ -2,7 +2,7 @@
2
2
  name: promo-videos
3
3
  description: Make promotional videos that are not a single product's ad — a launch or "coming soon" teaser, a trailer for a book, course, game, podcast, app or opening, an animated explainer of an idea or a service, an event or sale promo with the date and place exact, a brand film or manifesto, a crowdfunding pitch, a recap — built on a proven structure (hook, on-ramp, proof, one call to action), mixing real stock photos, AI-generated hero shots, animated titles and end cards from the motion editor, a voice-over and music, one colour look in the editor, and cut-downs for every placement (6, 15, 30, 60 seconds; 16:9, 9:16, 4:5, 1:1), scored against an ad-review rubric before handover. Use for a promo, teaser, trailer, explainer, event video or brand video. Not for a video ad for one physical product from its photo (product-ads), a software demo from real screen captures (product-videos), or fun creator content (short-form-video).
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.1.0
6
6
  metadata:
7
7
  tesseract.summary: Launch teasers, trailers, explainers, event and brand promos — structured, mixed media, every cut-down.
8
8
  tesseract.category: media
@@ -39,6 +39,11 @@ Belief → Tension → Promise → Sign-off (a brand film), Countdown — and ch
39
39
  video ads Google's research names: **attract** in the first seconds, **brand** early and naturally, **connect** with a
40
40
  feeling or a story, **direct** with one clear call to action.
41
41
 
42
+ The order of calls: their files first — `probe_video` and `transcribe_video` for clips, `image_inspect` for photos
43
+ (ask for any file the brief mentions but does not give a path for; never invent one) — then `list_voices` before a
44
+ voice-over, one pilot of the riskiest made shot after the price is approved, then the rest, `render_edl`, and the
45
+ checks.
46
+
42
47
  Write the shot list: beat · seconds · picture · words on screen · voice · sound · the route for the picture (§ 3) ·
43
48
  its price. Show it in a few lines; get a yes before anything paid.
44
49
 
@@ -76,6 +81,20 @@ tries at one shot, stop and say why.
76
81
  - Brand within the first 5 seconds (logo, the name said, or the product on screen) and again on the end card; the call
77
82
  to action on screen at least 3 seconds, the address readable.
78
83
 
84
+ ### Words on screen and the end card
85
+
86
+ - **Pictures carry no words.** Every generated or edited background is made "no text, no letters, no logos"; all
87
+ words are set once, by `render_edl` `titles` or the motion editor, so they are spelled right and sharp.
88
+ - **The end card has three groups, in this order of size:** the one action ("Book your free tasting"), the facts it
89
+ needs (date · time · place, or price · offer end), the address or handle. The logo or name above them. Nothing
90
+ else — no second offer, no list of benefits.
91
+ - **Fit every line.** Titles do not wrap: break them with `\n`. On 1920×1080 at `size` 72 each character takes about
92
+ 2.4% of the width (at most ~30 characters a line); on 1080×1920 at `size` 46, about 4.5% (at most 12 characters). Keep
93
+ words inside 5% margins (vertical: x 0.044–0.822, y 0.15–0.65) and off faces; count the characters of each line.
94
+ - **Each placement is designed, not squeezed.** For every length and aspect asked for, write its own timed shot list
95
+ (which beats stay, the voice line cut to fit, how long each title holds) and its own framing: `reframe_video` per
96
+ shot with the subject kept in, or a keyframe drawn again vertically when a group or a wide scene does not fit.
97
+
79
98
  ## 5. Review before handover
80
99
 
81
100
  Score the cut with [references/review-rubric.md](references/review-rubric.md) — hook, clarity, visual quality,
@@ -85,6 +104,7 @@ scores and what you changed.
85
104
 
86
105
  ## 6. Truth, rights and labels
87
106
 
107
+ - Before writing, list every claim the brief asks for and check each one: the person can prove it, or it goes. Turn a claim they cannot prove (earnings promised to students, "cures", safety results, "best") into one they can (what the course teaches, what testers saw, the guarantee they really offer) and say so kindly in the reply, with the sentence you would use instead.
88
108
  - Every claim, number, review and date is the person's own and true; no invented testimonials, customers, awards or
89
109
  "as seen on". Industry rules hold (health claims, financial risk lines, alcohol age limits, fair housing).
90
110
  - Only their own brand; no other company's logo, characters or music. Stock photos never pass as their own venue,
@@ -33,13 +33,31 @@ BROAD = {"#ai", "#tech", "#technology", "#business", "#worklife", "#work", "#pro
33
33
  DEAD = {"#fyp", "#foryou", "#foryoupage", "#viral", "#explore", "#explorepage", "#trending", "#like4like", "#likeforlike",
34
34
  "#followforfollow", "#follow4follow", "#f4f", "#l4l", "#followme"}
35
35
 
36
- AI_NOTE = re.compile(
37
- r"\((?:image|video|photo|picture|clip|art)?\s*(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo|midjourney|dall[- ·]?e|gpt[- ]?image)[^)]*\)"
38
- r"|\b(?:image|video|photo|picture|clip|this)\s+(?:was\s+)?(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo|midjourney|dall[- ·]?e|gpt[- ]?image)\b"
39
- r"|^\s*(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo)\b"
40
- r"|#(?:madewithai|aigenerated|aiart|generatedbyai)\b",
41
- re.IGNORECASE | re.MULTILINE,
42
- )
36
+ # The same list as packages/shared/src/ai-note.ts (the test keeps them level): a note on how it was MADE, in the languages
37
+ # the makers write in. Words about AI ("two AI agents", "AI-powered") are not one.
38
+ _ENGINE = r"ai|a\.i\.|artificial\s+intelligence|generative\s+ai|chatgpt|midjourney|dall[- ·]?e|gpt[- ]?image|stable\s+diffusion"
39
+ _ENGINE_AFTER_NOUN = _ENGINE + r"|veo|sora|gemini|claude|firefly|kling|flux"
40
+ _VERB = r"made|created|generated|produced|designed|drawn|written|edited|built|crafted|animated|rendered|illustrated|composed"
41
+ _HOW = r"with(?:\s+the\s+help\s+of)?|by|using|via"
42
+ _HOW_MUCH = r"(?:(?:entirely|fully|completely|partly|partially)\s+)?"
43
+ _NOUN = r"image|video|photo|picture|clip|art|artwork|visuals?|illustration|footage"
44
+ _PHRASES = [
45
+ rf"(?:{_VERB})\s+{_HOW_MUCH}(?:{_HOW})\s+(?:an?\s+|the\s+)?(?:{_ENGINE})",
46
+ rf"(?:{_NOUN}|this)\s+(?:(?:was|is)\s+)?(?:{_VERB})\s+{_HOW_MUCH}(?:{_HOW})\s+(?:an?\s+|the\s+)?(?:{_ENGINE_AFTER_NOUN})",
47
+ r"ai[- ](?:generated|made|created|produced)",
48
+ rf"(?:{_NOUN})\s*(?:by|:|credit:)\s*(?:{_ENGINE})",
49
+ r"(?:hech[oa]|cread[oa]|generad[oa]|producid[oa]|diseñad[oa])\s+(?:con|por|mediante)\s+(?:la\s+|una\s+)?(?:ia|inteligencia\s+artificial)",
50
+ r"(?:feit[oa]|criad[oa]|gerad[oa])\s+(?:com|por|pela)\s+(?:a\s+|uma\s+)?(?:ia|inteligência\s+artificial)",
51
+ r"(?:fait|faite|créée?|générée?|réalisée?|conçue?)\s+(?:avec|par)\s+(?:l['’]|une\s+)?(?:ia|intelligence\s+artificielle)",
52
+ r"(?:mit|durch|von)\s+(?:einer\s+)?(?:ki|künstlicher?\s+intelligenz)\s+(?:erstellt|generiert|gemacht|erzeugt)",
53
+ r"ki-(?:generiert|erstellt|erzeugt)\w*",
54
+ r"(?:fatt[oa]|creat[oa]|generat[oa]|realizzat[oa])\s+(?:con|da|dalla)\s+(?:l['’])?(?:ia|intelligenza\s+artificiale)",
55
+ r"(?:făcut[ăa]?|facut[ăa]?|creat[ăa]?|generat[ăa]?|realizat[ăa]?)\s+(?:cu\s+ajutorul|cu|de|prin)\s+(?:ai|ia|inteligen[țt][ăa]\s+artificial[ăa])",
56
+ r"(?:создан[оа]?|сделан[оа]?|сгенерирован[оа]?)\s+(?:с\s+помощью\s+|при\s+помощи\s+|с\s+)?(?:ии|нейросет\w*|искусственн\w*\s+интеллект\w*)",
57
+ ]
58
+ _HASHTAG = r"#(?:madewithai|madebyai|aigenerated|generatedbyai|createdwithai|createdbyai|aiart|aiartwork|aivideo|aiimage|aiphoto|aimade|aicreated)"
59
+ _JOINED = r"AI生成|AI製作|AI作成|AIで(?:作成|生成)|人工智能生成"
60
+ AI_NOTE = re.compile(rf"(?<!\w)(?:{'|'.join(_PHRASES)})(?!\w)|{_HASHTAG}(?!\w)|{_JOINED}", re.IGNORECASE)
43
61
  URL = re.compile(r"\b(?:https?://|www\.)\S+|\b[a-z0-9-]+\.(?:com|dev|app|io|ai|net|org)\b(?:/\S*)?", re.IGNORECASE)
44
62
  HASHTAG = re.compile(r"(?<![\w#])#\w+", re.UNICODE)
45
63
 
@@ -69,7 +69,7 @@ request or drop policy, approving, joining a network, join codes), any settings
69
69
  and sending the person's files to someone else (`drops.prepare` fills in the Send sheet — they press Send) is theirs.
70
70
 
71
71
  To **show** the person something, open it: `navigation.open_settings {section}` (general, appearance, shortcuts,
72
- runners, agent, voice, extensions, account, perks, team, privacy, remote-desktop, network, about),
72
+ projects, runners, agent, capabilities, voice, extensions, developer, account, perks, team, privacy, remote-desktop, network, about),
73
73
  `navigation.open_tab`, `navigation.open_file` — then `navigation.state` says what is in front. Or write a link to one
74
74
  panel — `tesseract://settings/<section>` with `appearance`, `editor`, `runners`, `agent`, `extensions`,
75
75
  `voice`, `image-edit`, `search`, `account`, `team`, `general`, `shortcuts`, `about`,
@@ -16,7 +16,7 @@ it runs in Chat and Plan too.
16
16
 
17
17
  ## navigation — `app_navigation` (the window; needs the app open on this machine)
18
18
  - `navigation.state` R — the project, the view, the tab in front, every tab open, the Settings page if open, which panels show.
19
- - `navigation.open_settings {section?}` (general, appearance, shortcuts, runners, agent, voice, extensions, account, perks, team, privacy, remote-desktop, network, about).
19
+ - `navigation.open_settings {section?}` (general, appearance, shortcuts, projects, runners, agent, capabilities, voice, extensions, developer, account, perks, team, privacy, remote-desktop, network, about).
20
20
  - `navigation.open_tab {tab: home|files|settings|computers|community|team|vault|remote-desktop|stage|fonts|whats-new|image-search|report-issue}` (team = Atrium).
21
21
  - `navigation.open_file {path}` (the app's editor/viewer), `open_browser {url?}`, `open_panel {panel: conversations|files|terminal}`.
22
22
  - `navigation.split {direction: right|down}`, `close_tab` (the tab in front — never your own conversation), `reopen_closed_tab`.
@@ -14,7 +14,7 @@ by name, delete `~/.tesseract` or settings files, or reinstall the app on your o
14
14
  | A remote machine shows offline | `hosts.list` | It has to be on and signed in; repair runs on that machine itself |
15
15
  | Computer control cannot see or click | `permissions.status` for `screen-recording` and `accessibility` | `permissions.open_settings`, then relaunch Tesseract; check computer control is switched on in Settings |
16
16
  | Voice: nothing heard / no reply | `permissions.status {id: "microphone"}`; `voice.has_provider_key {provider: "gemini"}` | Grant the mic; add the key in `tesseract://settings/voice`. Realtime voice is the least proven part of the product — say so if it still fails |
17
- | Web search fails | `settings.has_search_key` | Brokered quota: 1,000 searches a month signed in, 10 signed out; sign in, or wait for the month to roll over |
17
+ | Web search fails | `settings.has_search_key` | Brokered quota: 1,000 searches a month signed in, 500 signed out; sign in, or wait for the month to roll over |
18
18
  | Images do not generate | `image_providers_status` / `image.list_providers` | Add an OpenAI or Google key in `tesseract://settings/image-edit` |
19
19
  | Video does not generate | `video_providers_status` | Sign in (free tier) or add a Google key in image-edit settings |
20
20
  | Music / speech / voice clone fail | `voice.has_provider_key {provider: "elevenlabs"}` | ElevenLabs key in `tesseract://settings/voice` |
@@ -2,7 +2,7 @@
2
2
  name: thumbnails
3
3
  description: Design the picture that gets a video clicked — YouTube thumbnails (1280×720), covers for Shorts, Reels and TikTok, and podcast or series cover art — from the video's promise and title, in three or four different concepts, built from a frame of the person's own video, their own photo or a saved character, a found photo or a generated scene, with the words set exactly in a bold font, checked at the size people really see it on a phone, and saved at the platform's size and file limit, ready for the youtube-channel skill to set. Use when someone wants a thumbnail, a cover or a set of thumbnail options to test, or wants an existing one made clearer or more clickable. Not for the video itself (video-generation, short-form-video), a social post picture (social-posts) or a logo (makers, font-and-logo-design).
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.2.1
6
6
  metadata:
7
7
  tesseract.summary: Clickable YouTube thumbnails and Shorts/Reels/podcast covers — concepts, exact text, phone-size check.
8
8
  tesseract.category: media
@@ -32,8 +32,11 @@ Ask (or read from the request) only:
32
32
  - **The channel's look**, if it has one (colours, a font, a recurring layout) — reuse it so the channel's grid reads
33
33
  as one.
34
34
 
35
- The title and the thumbnail never say the same words: the title says **what**, the picture shows **the feeling**
36
- or the stake. Suggest a title tweak when it repeats the picture.
35
+ The title and the thumbnail never say the same words: the title says **what** (the topic, the place, the budget, the
36
+ time), the picture shows **the feeling** or the stake. Not one word of the title goes on the picture. With every set
37
+ of concepts, write the title it is paired with — the person's own, or a tweak when theirs and the picture overlap — and
38
+ say in one line what each half adds ("title: I built a working computer in Minecraft / picture: the glowing build and
39
+ 'IT WORKS?!'").
37
40
 
38
41
  ## 2. Three or four concepts, different on purpose
39
42
 
@@ -44,6 +47,10 @@ Write them first, in one line each, and show them:
44
47
  - C — **A → B split**: before / after, cheap / expensive, day 1 / day 100.
45
48
  - D — a wild card: the strangest true moment in the video.
46
49
 
50
+ Every moment shown must be in the video: a before/after uses their real day-1 and day-7 frames, a reaction is one
51
+ they really had (or a stronger expression of their own face they approve), a number is the real one. A concept that
52
+ needs a moment the video does not have is dropped, not drawn.
53
+
47
54
  Each concept: at most **three elements** (for example face + object + setting), one emotion, at most **2–4 words** on
48
55
  it, one or two hero colours on a contrasting ground.
49
56
 
@@ -62,6 +69,12 @@ Make 2–4 per concept (`count`), keep the best, and fix details with `edit_imag
62
69
 
63
70
  ## 4. Put the words on exactly
64
71
 
72
+ **The words:** 2–4 in total on the picture (none is fine), in the viewer's language, saying what neither the picture
73
+ nor the title says — the question, the stake, a real number: "IT WORKS?!", "$10/DAY?", "WHY FLAT?". **The style:**
74
+ heavy sans-serif, white or a channel colour, with a thick dark outline and shadow — no translucent grey bars, which
75
+ look unfinished and hide faces; a solid brand-colour plate only behind words on a busy ground. The words sit in the
76
+ empty third opposite the face, never over eyes, mouth or the object that proves the stake.
77
+
65
78
  Picture models misspell. Set the 2–4 words yourself, in a heavy sans-serif with a thick outline or a shadow, at least
66
79
  about 80 px tall on a 1280×720 frame:
67
80
 
@@ -69,8 +82,29 @@ about 80 px tall on a 1280×720 frame:
69
82
  `app_documents` `documents.run` `text` (the editor's Type tool; `documents.commands` with filter "text" shows its
70
83
  argument — font, size, colour, position), crop to 16:9 with `crop` if needed, and `documents.save`.
71
84
  - **Or with `render_edl`**: one image segment (`durationSec: 1`), `output: { width: 1280, height: 720 }` (1080×1920 for
72
- a vertical cover), the words as `titles` (`bold: true`, `size` 120–200, `color`, `box` for a plate behind them;
73
- `output.fontsDir` for the channel's own font), then `extract_video_frames` at 0.5 s gives the JPEG.
85
+ a vertical cover), the words as `titles` (`bold: true`, `size` 120–200 on 1280×720, `color`, no `box` — the renderer
86
+ outlines and shadows the letters; `output.fontsDir` for the channel's own font), then `extract_video_frames` at 0.5 s
87
+ gives the JPEG. A complete call for one concept:
88
+
89
+ ```json
90
+ { "version": 1, "output": { "width": 1280, "height": 720, "name": "thumb-A" },
91
+ "assets": { "p": { "path": "/abs/concept-A.png", "kind": "image" } },
92
+ "video": [ { "asset": "p", "durationSec": 1 } ],
93
+ "titles": [ { "text": "IT WORKS?!", "startSec": 0, "endSec": 1, "x": 0.33, "y": 0.22, "size": 150, "bold": true, "color": "#FFE600" } ] }
94
+ ```
95
+
96
+ Titles do not wrap: break long ones with `\n`. Keep every letter inside x 0.05–0.78 and y 0.08–0.78 of a 16:9 frame
97
+ (the duration stamp covers the bottom right). **Check the fit before rendering**: on 1280×720 at `size` 150 a character
98
+ takes about 5% of the width, so a line of 10 spans half the frame: centre it far enough in that no letter is cut. On a
99
+ 1080×1920 cover `size` is scaled up, so a character takes about 8% of the width at `size` 70: use `size` 60–70, at most
100
+ 9 characters a line, centred at x 0.43, and keep every letter inside x 0.05–0.82 and y 0.15–0.65 of the cover. A longer
101
+ line is cut off: break it with `\n` or use a shorter word, never a smaller size.
102
+
103
+ **The order of calls:** `image_providers_status` → for their video: `probe_video`, `transcribe_video` and
104
+ `extract_video_frames` at the moments the transcript points to (never at guessed times), `image_inspect` to pick; for
105
+ a photo they gave (a .jpg or .png): use it directly in `edit_image` — never `extract_video_frames` on a still → the
106
+ picture per concept (`edit_image` / `generate_image`, "no text, no letters") → the words per concept (`render_edl` or
107
+ the image editor) → the phone check (§ 5) → the final file at the platform's size, under 2 MB.
74
108
 
75
109
  ## 5. Check it at phone size
76
110
 
@@ -78,8 +112,8 @@ about 80 px tall on a 1280×720 frame:
78
112
  is the emotion? Can you read every word?" If the answer is unclear at that size, simplify — fewer elements, bigger
79
113
  face, fewer words.
80
114
  - On YouTube the **bottom-right corner** is covered by the duration stamp: nothing important there. On vertical covers
81
- keep the top 12% and the bottom quarter clear (the app's name, caption and buttons) and the right-hand 15% free of
82
- faces and text.
115
+ the apps' name, caption and buttons cover everything outside x 0.05–0.82 and y 0.15–0.65: no face and no word there,
116
+ and look at both side edges for a letter cut off.
83
117
  - Compare the concepts side by side and say which you would test first and why.
84
118
 
85
119
  ## 6. Sizes and delivery
@@ -75,6 +75,7 @@ Ease into a moment and back out — the impact in slow motion, the jump frozen a
75
75
 
76
76
  ```json
77
77
  { "asset": "jump", "in": 0, "out": 6, "ramps": [ { "atSec": 2.4, "speed": 0.25, "holdSec": 2, "easeSec": 0.5 } ] }
78
+ { "asset": "jump", "in": 0, "out": 6, "ramps": [ { "preset": "hit-beat", "atSec": 2.4 } ] }
78
79
  ```
79
80
 
80
81
  | Field | Meaning |
@@ -85,6 +86,11 @@ Ease into a moment and back out — the impact in slow motion, the jump frozen a
85
86
  | `easeSec` | source seconds the speed takes to change before and after the moment, 0–2 (default 0.5; 0 = a hard switch) |
86
87
  | `pieces` | steps in each ease, 2–12 (default 5) |
87
88
 
89
+ A ramp can be asked for by name (`list_director_controls` `ramps`); a number given beside the name wins.
90
+ `hit-beat` snaps to slow motion on the moment, `slow-beat` and `deep-slow` savour it, `freeze-beat` and
91
+ `freeze-snap` stop it, `burst-in` and `build-up` rush into `atSec` and land on it, `burst-out` rushes away
92
+ from it, `wind-down` drains the speed, `surge` is a short push.
93
+
88
94
  Up to 4 ramps a segment, apart from each other; the segment needs `in` and `out` and cannot be
89
95
  `reverse`d. The rest of the segment plays at its own `speed`; the sound follows the picture
90
96
  (silent through a freeze). The renderer cuts the segment into pieces of one speed each, fitted to
@@ -60,7 +60,7 @@ packshots, 3D-style renders or a turntable → `3d-product-shots`; a video ad fo
60
60
  animated titles, a logo sting or 3D text → `motion-graphics`; the thumbnail or cover → `thumbnails`.
61
61
 
62
62
  Name the camera move instead of describing it: `camera_move` takes an id from `list_camera_moves`
63
- (for example `dolly-in`, `orbit`, `crane-up`, `crash-zoom-in`, `locked-off`) or two that stack, on
63
+ (for example `dolly-in`, `orbit`, `crane-up`, `crash-zoom-in`, `locked-off`) or up to three that stack, on
64
64
  `generate_video` and on each scene of `create_video_from_scenario`. Choose one per beat — see
65
65
  [references/prompting.md](references/prompting.md) § Camera moves.
66
66