boomcode 0.5.2__tar.gz → 0.5.4__tar.gz
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.
- {boomcode-0.5.2 → boomcode-0.5.4}/PKG-INFO +1 -1
- {boomcode-0.5.2 → boomcode-0.5.4}/boomcode.egg-info/PKG-INFO +1 -1
- {boomcode-0.5.2 → boomcode-0.5.4}/boomcode.egg-info/SOURCES.txt +1 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/pyproject.toml +1 -1
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/__init__.py +1 -1
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/agent/build.md +6 -0
- boomcode-0.5.4/python/boomcode/layer/skills/ask-install/SKILL.md +51 -0
- boomcode-0.5.4/python/boomcode/layer/skills/lets-scroll/SKILL.md +291 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/pipeline.md +7 -1
- boomcode-0.5.2/python/boomcode/layer/skills/lets-scroll/SKILL.md +0 -877
- {boomcode-0.5.2 → boomcode-0.5.4}/LICENSE +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/README.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/boomcode.egg-info/dependency_links.txt +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/boomcode.egg-info/entry_points.txt +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/boomcode.egg-info/top_level.txt +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/cli.py +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/README.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/agent/debugger.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/agent/designer.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/agent/vision.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/agent/writer.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/ask.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/boom.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/explore.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/fix.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/open.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/command/review.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/opencode.json +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/themes/bangladeshi.json +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/themes/boomcode.json +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/config/tui.json +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/install.sh +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/__pycache__/patch-brand.cpython-312.pyc +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/boomcode +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/boomcode-browser +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/boomcode-menu +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/boomcode-uninstall +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/boomcode-vision +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/oc-settings.sh +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/scripts/patch-brand.py +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/android-app/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/api-integration/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/bash-cli-expert/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/bot-development/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/clean-code-performance/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/database/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/debugging-fixes/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/deploy-hosting/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/docker/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/firebase-supabase/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/git-workflow/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/index-template.html +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/knockout.py +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/prompts.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/scrub-engine.js +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/project-structure/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/python-automation/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/react-next-best-practices/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/security-review/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/seo-basics/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/testing/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/ui-ux-responsive/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/website-builder/SKILL.md +0 -0
- {boomcode-0.5.2 → boomcode-0.5.4}/setup.cfg +0 -0
|
@@ -35,6 +35,7 @@ python/boomcode/layer/scripts/patch-brand.py
|
|
|
35
35
|
python/boomcode/layer/scripts/__pycache__/patch-brand.cpython-312.pyc
|
|
36
36
|
python/boomcode/layer/skills/android-app/SKILL.md
|
|
37
37
|
python/boomcode/layer/skills/api-integration/SKILL.md
|
|
38
|
+
python/boomcode/layer/skills/ask-install/SKILL.md
|
|
38
39
|
python/boomcode/layer/skills/bash-cli-expert/SKILL.md
|
|
39
40
|
python/boomcode/layer/skills/bot-development/SKILL.md
|
|
40
41
|
python/boomcode/layer/skills/clean-code-performance/SKILL.md
|
|
@@ -111,6 +111,12 @@ You are text-only — you cannot see images directly. **Delegate EVERY image-vie
|
|
|
111
111
|
|
|
112
112
|
**Never** invent image content you could not actually see. If vision fails, tell the user honestly that you could not see it.
|
|
113
113
|
|
|
114
|
+
## Installs — always ask first
|
|
115
|
+
If anything is missing or an install becomes needed (pkg/pip/npm/apt, downloaded
|
|
116
|
+
tools — anything), follow the **ask-install** skill: tell the user what is missing
|
|
117
|
+
and why in plain words, then WAIT for a yes. Never install silently; "no" means
|
|
118
|
+
find another way.
|
|
119
|
+
|
|
114
120
|
## When stuck
|
|
115
121
|
- Read the full error message — then decide
|
|
116
122
|
- If two attempts fail: try a different approach
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask-install
|
|
3
|
+
description: >
|
|
4
|
+
Install guard for every task. Whenever a tool, package, library, or
|
|
5
|
+
dependency is missing — or becomes needed mid-work (pkg, pip, npm, apt,
|
|
6
|
+
curl-downloaded tools, any installer) — the AI STOPS and asks the user
|
|
7
|
+
first in plain words: what is missing, why it is needed, and "should I
|
|
8
|
+
install it?". Never install anything silently. Use on any task where
|
|
9
|
+
something needs installing or setting up.
|
|
10
|
+
allowed-tools: Bash, Read, Write, Edit, AskUserQuestion, Skill
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ask-install
|
|
14
|
+
|
|
15
|
+
Nothing gets installed behind the user's back. Ask first, always.
|
|
16
|
+
|
|
17
|
+
## The rule
|
|
18
|
+
|
|
19
|
+
While working, if you find something missing — or the task now needs a new
|
|
20
|
+
tool/package/library — do NOT install it yourself. Instead:
|
|
21
|
+
|
|
22
|
+
1. **Stop and tell the user, in three simple lines:**
|
|
23
|
+
- what is missing (name, one plain-words meaning)
|
|
24
|
+
- why it is needed for their task (one line)
|
|
25
|
+
- "Should I install it?" — plus a rough size/time estimate when known
|
|
26
|
+
2. **Wait for the answer.** "No" means no — do not install; instead offer an
|
|
27
|
+
alternative path that avoids it (skip the feature, use what is already
|
|
28
|
+
there, or change approach).
|
|
29
|
+
3. **On yes:** install it, then confirm in one line ("ffmpeg installed ✅ —
|
|
30
|
+
continuing"). If the install fails, show the real error honestly and
|
|
31
|
+
suggest the next step (retry, reinstall, or an alternative).
|
|
32
|
+
|
|
33
|
+
## What counts as "installing" (all of these need asking)
|
|
34
|
+
|
|
35
|
+
- `pkg install …` / `apt install …` / `apt-get …` (Termux/Linux packages)
|
|
36
|
+
- `pip install …` / `pip3 install …` (Python libraries)
|
|
37
|
+
- `npm install …` / `npx …` (Node packages)
|
|
38
|
+
- downloading and running any tool via `curl`/`wget`
|
|
39
|
+
- anything else that brings NEW software onto the device
|
|
40
|
+
|
|
41
|
+
## Exceptions (no need to ask again)
|
|
42
|
+
|
|
43
|
+
- The user already said yes for this exact thing earlier in the same session.
|
|
44
|
+
- The user explicitly ordered the install themselves ("install ffmpeg").
|
|
45
|
+
- Updating files inside the project, or using tools that are already
|
|
46
|
+
installed — none of that is an install.
|
|
47
|
+
|
|
48
|
+
## Style
|
|
49
|
+
|
|
50
|
+
Beginner-friendly, short sentences. Never blame the user or the tool;
|
|
51
|
+
just say what happened and what comes next.
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lets-scroll
|
|
3
|
+
description: >
|
|
4
|
+
Build an immersive scroll-driven "fly through the world" landing page for any
|
|
5
|
+
business or idea. As the visitor scrolls, a pre-rendered camera flies through
|
|
6
|
+
3D scenes with NO cuts — one continuous journey. FREE BY DESIGN: the AI designs
|
|
7
|
+
everything and writes a kit of copy-paste prompts (images + videos) into the
|
|
8
|
+
project's lets-scroll/ folder with a step-by-step beginner guide; the user
|
|
9
|
+
generates the assets in ANY AI tool they like (free tools work) and pastes the
|
|
10
|
+
results next to the prompts. Then the AI verifies, encodes, and wires a
|
|
11
|
+
portable scroll-scrub engine. Use when the user wants a "3D world" site, a
|
|
12
|
+
scroll cinematic, a diorama landing, or to turn a business into a scrollable
|
|
13
|
+
world. Paid render automation (Monid/Higgsfield CLIs) exists as an OPTIONAL
|
|
14
|
+
appendix in references/pipeline.md for users who already have those tools.
|
|
15
|
+
allowed-tools: Bash, Read, Write, Edit, AskUserQuestion, Skill
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# lets-scroll
|
|
19
|
+
|
|
20
|
+
Build a landing page where scrolling flies the visitor through a little 3D
|
|
21
|
+
world — scene after scene, no cuts — ending at the brand.
|
|
22
|
+
|
|
23
|
+
> **BEGINNER VOICE — mandatory for the whole skill.** The user may be a complete
|
|
24
|
+
> beginner on a phone. Short sentences. Simple words. Every technical term gets a
|
|
25
|
+
> one-line plain meaning the first time it appears. Never dump jargon; explain
|
|
26
|
+
> what to do, in order, like a friendly guide. All user-facing writing (chat,
|
|
27
|
+
> GUIDE.md, file names) uses the plain `image-…` / `video-…` vocabulary below —
|
|
28
|
+
> never internal words like "still", "dive", "connector", "leg".
|
|
29
|
+
|
|
30
|
+
## The idea in one minute
|
|
31
|
+
|
|
32
|
+
1. You interview the user about their business/idea (simple questions).
|
|
33
|
+
2. You design the scenes and the camera journey.
|
|
34
|
+
3. You write a **kit** into the project — one folder, `lets-scroll/`:
|
|
35
|
+
- `GUIDE.md` — a friendly step-by-step guide for the user
|
|
36
|
+
- one prompt file per picture (`image-01-….txt`) and per video clip
|
|
37
|
+
(`video-01-….txt`, `video-connector-1.txt`)
|
|
38
|
+
4. The user copies each prompt into ANY AI image/video tool (free ones are fine),
|
|
39
|
+
downloads the result, and saves it **in the same folder, same name**:
|
|
40
|
+
`image-01-….txt` → `image-01-….png`, `video-01-….txt` → `video-01-….mp4`.
|
|
41
|
+
5. When they say "done", you verify every file, polish it with ffmpeg, wire the
|
|
42
|
+
scroll engine, open it with `boomcode preview`, and check it together.
|
|
43
|
+
|
|
44
|
+
The kit is the contract. The folder tells everyone (you and the user) exactly
|
|
45
|
+
what exists, what is waiting, and what is still missing.
|
|
46
|
+
|
|
47
|
+
## Step 0 — Quick check (10 seconds)
|
|
48
|
+
|
|
49
|
+
You need only **ffmpeg + ffprobe** on this path. Check `ffmpeg -version` and
|
|
50
|
+
`ffprobe -version`. If missing or broken:
|
|
51
|
+
|
|
52
|
+
- **Termux (Android):** `pkg install ffmpeg` (or `pkg reinstall ffmpeg` if a
|
|
53
|
+
broken install reports linker errors). Also `pkg install python` if python is
|
|
54
|
+
missing (needed later for the local preview server).
|
|
55
|
+
- Everything else — image/video generation — happens in the USER's tools, so
|
|
56
|
+
nothing else is required from this machine.
|
|
57
|
+
- Scratch files go to `$TMPDIR` (never `/tmp` — Termux has no `/tmp`).
|
|
58
|
+
|
|
59
|
+
Optional: if the user already pays for render CLIs, automation lives in
|
|
60
|
+
`references/pipeline.md`. Do not bring it up unless they ask.
|
|
61
|
+
|
|
62
|
+
## Step 1 — Interview (simple questions, one at a time)
|
|
63
|
+
|
|
64
|
+
Ask these in plain words. Accept answers in any language. Record the answers
|
|
65
|
+
(the checklist in `references/prompts.md` is your write-down format).
|
|
66
|
+
|
|
67
|
+
1. **What is this about?** (their business/idea — open question, never
|
|
68
|
+
multiple-choice)
|
|
69
|
+
2. **Brand kit** — name + a few brand colors if they have them (or offer to
|
|
70
|
+
propose a palette). Keep it to: name, 4–6 colors, tone.
|
|
71
|
+
3. **Look & feel** — show the options by feel, one line each (default: **clay
|
|
72
|
+
diorama**; alternates in `references/prompts.md`: papercraft, glossy toy,
|
|
73
|
+
claymation, neon night, photoreal). One choice for the whole site.
|
|
74
|
+
4. **Camera style** — ask by feel: *"should the camera walk through the world
|
|
75
|
+
(walkthrough) or dive down into it from above (fly-through)?"*
|
|
76
|
+
- walkthrough → architecture **A** (one continuous forward take — simpler,
|
|
77
|
+
recommended)
|
|
78
|
+
- fly-through, god's-eye → architecture **B** (dive + connector clips)
|
|
79
|
+
- If they want a fixed isometric camera the whole way, that's A with the
|
|
80
|
+
locked-iso clause from `references/prompts.md`.
|
|
81
|
+
5. **How many scenes?** Offer 2 / 4 / 6 (6 is the max that stays smooth).
|
|
82
|
+
Then propose the scene list from their answer to #1 — each scene gets a
|
|
83
|
+
subject, a short headline idea, one-line body, 0–3 tags; the last scene is
|
|
84
|
+
the hero + call-to-action. Confirm the list with the user.
|
|
85
|
+
6. **Phone version?** ("should the site also have a vertical version for
|
|
86
|
+
phones?") — if yes, the kit doubles the video prompts (a 9:16 copy of each)
|
|
87
|
+
— say plainly that it's about twice the generating work for them.
|
|
88
|
+
|
|
89
|
+
## Step 2 — Write the kit into the project
|
|
90
|
+
|
|
91
|
+
Create ONE folder in the project root:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
lets-scroll/
|
|
95
|
+
├── GUIDE.md ← the friendly how-to (project root level)
|
|
96
|
+
└── prompts/ ← THE prompt folder — prompts AND outputs live here
|
|
97
|
+
├── image-01-<short-scene-name>.txt ← picture prompt
|
|
98
|
+
│ image-01-<short-scene-name>.png ← user saves the result HERE, same name
|
|
99
|
+
├── image-02-<name>.txt
|
|
100
|
+
│ image-02-<name>.png
|
|
101
|
+
├── video-01-<what-it-does>.txt ← video prompt
|
|
102
|
+
│ video-01-<what-it-does>.mp4
|
|
103
|
+
└── video-connector-1.txt ← only for architecture B
|
|
104
|
+
video-connector-1.mp4
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Naming rules (this is the whole system):**
|
|
108
|
+
- `image-…` = it makes a PICTURE. `video-…` = it makes a VIDEO CLIP.
|
|
109
|
+
- The number is the order to generate in.
|
|
110
|
+
- The prompt file `X.txt` and the user's saved result `X.png` / `X.mp4` share
|
|
111
|
+
the exact same name and live in the exact same folder.
|
|
112
|
+
- Architecture A: `image-01…` to `image-N` (one per scene) and `video-01…` to
|
|
113
|
+
`video-N` (one journey clip per scene).
|
|
114
|
+
- Architecture B: the same images, but videos are `video-01…` (dive into each
|
|
115
|
+
scene) plus `video-connector-1…` (the linking flight between scenes).
|
|
116
|
+
|
|
117
|
+
**STRONG PROMPT RULES — every prompt must be rich, specific, and self-contained.**
|
|
118
|
+
A weak prompt gives a generic result and breaks the world's cohesion. Every
|
|
119
|
+
prompt you write must include ALL of:
|
|
120
|
+
- **Subject in detail** — what exactly is in the scene, named and described
|
|
121
|
+
(materials, colors, props, tiny details that make it feel real)
|
|
122
|
+
- **Environment** — surroundings, ground, sky, background depth cues
|
|
123
|
+
- **Lighting** — direction, warmth, time of day, mood of the light
|
|
124
|
+
- **Camera** — angle, height, lens feel (for videos: the exact movement,
|
|
125
|
+
speed, and "no camera shake / no cuts / smooth" clauses)
|
|
126
|
+
- **Style block** — the full style preamble from `references/prompts.md`
|
|
127
|
+
baked in verbatim (never "same style as before" — every file works alone)
|
|
128
|
+
- **Negatives** — "no text, no watermark, no logo, no people unless asked,
|
|
129
|
+
no motion blur"
|
|
130
|
+
One prompt = one full paragraph of specifics. If a prompt could describe a
|
|
131
|
+
hundred different scenes, it is too weak — rewrite it.
|
|
132
|
+
|
|
133
|
+
**Every prompt file starts with a marker line, then the full prompt:**
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
=== IMAGE PROMPT (generates 1 picture) ===
|
|
137
|
+
…complete prompt, self-contained (style preamble baked in from references/prompts.md)…
|
|
138
|
+
|
|
139
|
+
SAVE AS: image-01-shopfront.png (3:2 landscape, at least 1536px wide,
|
|
140
|
+
solid background, no text in the picture)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
=== VIDEO PROMPT (generates 1 short clip) ===
|
|
145
|
+
…complete prompt…
|
|
146
|
+
FIRST FRAME: attach video-01-start.png (provided next to this prompt) —
|
|
147
|
+
your tool must support a start/first frame.
|
|
148
|
+
SAVE AS: video-01-shopfront.mp4 (16:9, ~8 seconds, no sound)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Use the templates in `references/prompts.md` (scene still, leg/dive, connector)
|
|
152
|
+
— they bake in the style preamble so every prompt works alone in any tool.
|
|
153
|
+
|
|
154
|
+
**Start frames (architecture A chain):** the journey must be seamless, so
|
|
155
|
+
video-02 continues from the LAST frame of video-01. Do it step by step:
|
|
156
|
+
1. Write all image prompts + the FIRST video prompt now.
|
|
157
|
+
2. When `video-01….mp4` arrives, extract its last frame:
|
|
158
|
+
`ffmpeg -sseof -0.1 -i video-01-x.mp4 -frames:v 1 video-02-start.png`
|
|
159
|
+
3. Write/update `video-02….txt` to attach that frame, and tell the user.
|
|
160
|
+
(For architecture B, connectors get BOTH a first and a last frame — extract
|
|
161
|
+
them from the two videos they link.)
|
|
162
|
+
|
|
163
|
+
**GUIDE.md** — write it for a total beginner, roughly:
|
|
164
|
+
|
|
165
|
+
```markdown
|
|
166
|
+
# Your 3D website — how to finish it
|
|
167
|
+
|
|
168
|
+
Each .txt file here is one prompt. Generate them in number order (01, 02, …).
|
|
169
|
+
|
|
170
|
+
- image-… files make PICTURES → paste into any AI image tool
|
|
171
|
+
- video-… files make SHORT VIDEOS → paste into any AI video tool
|
|
172
|
+
(it must accept a start/first frame — the file is already in this folder)
|
|
173
|
+
|
|
174
|
+
For every prompt: open it, copy everything under the === line, run it in your
|
|
175
|
+
tool, download the result, and save it in THIS folder with the exact name from
|
|
176
|
+
the "SAVE AS" line (image-01-shopfront.png, video-01-shopfront.mp4, …).
|
|
177
|
+
|
|
178
|
+
The videos connect like a chain — that's why the order matters. If a video
|
|
179
|
+
prompt says "FIRST FRAME: attach …", upload that frame together with the prompt.
|
|
180
|
+
|
|
181
|
+
When everything has its file next to its prompt, tell the AI: **done**.
|
|
182
|
+
If a result looks wrong, just delete that file and try again.
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Also show the user a simple status table in chat** (never a wall of prose):
|
|
186
|
+
|
|
187
|
+
| # | file to make | kind | needs start frame? | status |
|
|
188
|
+
|---|---|---|---|---|
|
|
189
|
+
| 1 | image-01-shopfront.png | picture | — | waiting |
|
|
190
|
+
|
|
191
|
+
Keep it updated as files arrive.
|
|
192
|
+
|
|
193
|
+
## Step 3 — As files arrive: check them kindly
|
|
194
|
+
|
|
195
|
+
After the user says files are in (or anytime they say "check"):
|
|
196
|
+
|
|
197
|
+
1. `ls lets-scroll/` — match every `X.txt` to its `X.png`/`X.mp4`.
|
|
198
|
+
2. Verify each new file before relying on it:
|
|
199
|
+
- pictures: opens, 3:2 landscape, ≥ ~1536px wide (`ffprobe` or PIL)
|
|
200
|
+
- videos: plays, 16:9 (or 9:16 mobile), duration ≈ 8s (dives) / 5s
|
|
201
|
+
(connectors), **frame 0 must match the start frame** you handed over —
|
|
202
|
+
extract frame 0 with ffmpeg and compare by composition (or
|
|
203
|
+
`boomcode-vision` on both). A video whose tool ignored the start frame
|
|
204
|
+
will break its seam — ask for a re-run of that one prompt.
|
|
205
|
+
3. Update the status table and tell the user in one friendly line what's left.
|
|
206
|
+
4. Architecture A: extract each accepted video's last frame and unlock the
|
|
207
|
+
next video prompt (Step 2 chain rule).
|
|
208
|
+
|
|
209
|
+
Never scold a bad file — just say which number to re-run and why in one line.
|
|
210
|
+
|
|
211
|
+
## Step 4 — Assemble (once every file is accepted)
|
|
212
|
+
|
|
213
|
+
1. **Optional floating scenes** (only if the style wants it, e.g. product
|
|
214
|
+
close-ups floating beside the world): strip the background with
|
|
215
|
+
`references/knockout.py` (needs PIL — `pkg install python pillow` /
|
|
216
|
+
`pip install pillow`).
|
|
217
|
+
2. **Encode for smooth scrolling** — scrubbing means the page sets
|
|
218
|
+
`video.currentTime` as you scroll, so clips must be encoded kindly:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
ffmpeg -i src.mp4 -an -vf "unsharp=5:5:0.8:5:5:0.0" \
|
|
222
|
+
-c:v libx264 -preset slow -crf 20 -pix_fmt yuv420p \
|
|
223
|
+
-g 8 -keyint_min 8 -sc_threshold 0 -movflags +faststart out.mp4
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Native resolution, no downscale. If the user opted into the phone version,
|
|
227
|
+
also make each clip a 9:16 native portrait copy encoded 720 wide with
|
|
228
|
+
`-g 4`, crf 23 (cheaper seeks on phone decoders), plus each portrait clip's
|
|
229
|
+
first frame as the phone poster image.
|
|
230
|
+
3. **Place files** (project root, served by the page):
|
|
231
|
+
- `assets/<scene>.webp` — the stills (`cwebp -q 84`, resize to 1800)
|
|
232
|
+
- `assets/vid/<scene>.mp4` + `-m.mp4` portrait copies + connector clips
|
|
233
|
+
4. **Wire the engine** — copy `references/scrub-engine.js` and
|
|
234
|
+
`references/index-template.html` into the project and fill the
|
|
235
|
+
`mountLetsScroll(config)` block: `brand`, `diveScroll: 1.3`,
|
|
236
|
+
`connScroll: 0.9`, one `sections[]` entry per scene
|
|
237
|
+
(`id, label, still, clip, clipMobile, stillMobile, scroll, linger, accent,
|
|
238
|
+
eyebrow, title, body, tags, cta`), `connectors[]` for architecture B
|
|
239
|
+
(architecture A: `connectors: []` and a small crossfade ~0.08).
|
|
240
|
+
Copy rules (eyebrow/title/body/tags) are in `references/prompts.md`.
|
|
241
|
+
|
|
242
|
+
## Step 5 — See it and check it (phone-friendly QA)
|
|
243
|
+
|
|
244
|
+
There is no headless browser here — check it the human way:
|
|
245
|
+
|
|
246
|
+
1. `boomcode preview` — opens the page in the phone/desktop browser.
|
|
247
|
+
2. Scroll through slowly, then fast. Ask the user to look for one thing:
|
|
248
|
+
**does any scene "jump" or flash at a boundary?** (a jump = the video's
|
|
249
|
+
first frame didn't match — re-check that pair's start frame; a flash = the
|
|
250
|
+
crossfade band is too short).
|
|
251
|
+
3. Verify the technical parts from the shell:
|
|
252
|
+
- file specs re-run through `ffprobe` (aspect, duration)
|
|
253
|
+
- first-frame matching via ffmpeg extract + `boomcode-vision` comparison
|
|
254
|
+
- page loads over the preview server (no `file://` — browsers block it;
|
|
255
|
+
that's why `boomcode preview` exists)
|
|
256
|
+
4. Phone version (if built): open the same link on the phone — portrait clips
|
|
257
|
+
must be served there (natively portrait, not squashed), posters must match
|
|
258
|
+
each clip's first frame, scrolling with the URL-bar collapsing must not
|
|
259
|
+
jump the page, and reduced-motion users should see the stills, no videos.
|
|
260
|
+
5. Fix round: adjust `crossfade`/`linger`, re-encode a clip, or ask for one
|
|
261
|
+
re-run — then check again. Only ship when the user says it feels smooth.
|
|
262
|
+
|
|
263
|
+
## Gotchas (hard-won, the free-path subset)
|
|
264
|
+
|
|
265
|
+
- **Start frames are sacred.** A tool that ignores the attached first frame
|
|
266
|
+
will break every seam after it. Verify frame 0 on arrival, every time.
|
|
267
|
+
- **Architecture A is a chain.** Video 2 starts from video 1's actual last
|
|
268
|
+
frame — never from the original image. Extract, don't assume.
|
|
269
|
+
- **No `file://` previewing** — browsers block the scripts and blob fetching
|
|
270
|
+
the engine needs. Always `boomcode preview`.
|
|
271
|
+
- **Blob loading is why scrubbing works** — the engine fetches clips as blobs
|
|
272
|
+
(fully seekable) so plain static serving is fine; don't switch to
|
|
273
|
+
byte-range hacks.
|
|
274
|
+
- **Never downscale the masters** — encode at native resolution, crf ~20,
|
|
275
|
+
small GOP (`-g 8`; portrait 720-wide `-g 4`).
|
|
276
|
+
- **ffmpeg on Termux** can arrive broken (linker errors) — `pkg reinstall
|
|
277
|
+
ffmpeg` fixes it; check before blaming the videos.
|
|
278
|
+
- **Six scenes is the ceiling** — more scenes = more seams = harder to keep
|
|
279
|
+
smooth.
|
|
280
|
+
- iOS Safari is the strictest judge: if the priming/poster logic is touched,
|
|
281
|
+
test that the first scene paints instantly with no black flash.
|
|
282
|
+
|
|
283
|
+
## References
|
|
284
|
+
|
|
285
|
+
- `references/prompts.md` — intake checklist + style preambles + all prompt
|
|
286
|
+
templates (scene picture, journey video, connector video) + copy rules
|
|
287
|
+
- `references/pipeline.md` — OPTIONAL paid automation (Monid/Higgsfield CLIs)
|
|
288
|
+
and the full encode/asset recipes (§6/§6b) for users who have those tools
|
|
289
|
+
- `references/scrub-engine.js` — the scroll engine (zero dependencies)
|
|
290
|
+
- `references/index-template.html` — the page template with the config block
|
|
291
|
+
- `references/knockout.py` — optional background removal for floating scenes
|
{boomcode-0.5.2 → boomcode-0.5.4}/python/boomcode/layer/skills/lets-scroll/references/pipeline.md
RENAMED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
# Pipeline: copy-paste scripts (bash 3.2 safe)
|
|
2
2
|
|
|
3
|
+
> **OPTIONAL AUTOMATION.** The default lets-scroll flow (SKILL.md) is FREE and
|
|
4
|
+
> manual: the AI writes a prompt kit into the project's `lets-scroll/` folder
|
|
5
|
+
> and the user renders in any tool they like. THIS file is only for users who
|
|
6
|
+
> already have render CLIs (Monid / Higgsfield / Codex) and want them driven
|
|
7
|
+
> automatically. Nothing here is required for the free flow.
|
|
8
|
+
|
|
3
9
|
Set these once. `NAMES` is the ordered section ids; the last is the hero/finale.
|
|
4
10
|
|
|
5
11
|
```bash
|
|
6
|
-
WORK
|
|
12
|
+
WORK="${TMPDIR:-/tmp}/lets-scroll" # scratch dir (Termux-safe: $TMPDIR, never /tmp)
|
|
7
13
|
ASSETS=./assets # where the site reads stills (webp) + clips (mp4)
|
|
8
14
|
mkdir -p "$WORK" "$ASSETS/vid"
|
|
9
15
|
NAMES="farm kitchen shop delivery plaza finale" # <-- your section ids, in order
|