Skip to content

Commit b9613e4

Browse files
committed
Merge branch 'release/1.18.3'
2 parents 4530987 + 2dc3049 commit b9613e4

File tree

16 files changed

+1155
-46
lines changed

16 files changed

+1155
-46
lines changed

docs/.vitepress/config.mjs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,19 @@ function pelliculeGuide() {
606606
{ text: 'Getting Started', link: '/pellicule/getting-started' }
607607
]
608608
},
609+
{
610+
text: 'Integrations',
611+
collapsed: false,
612+
items: [
613+
{ text: 'Overview', link: '/pellicule/integrations' },
614+
{ text: 'Vite', link: '/pellicule/vite' },
615+
{ text: 'The Boring Stack', link: '/pellicule/boring-stack' },
616+
{ text: 'Rsbuild', link: '/pellicule/rsbuild' },
617+
{ text: 'Laravel', link: '/pellicule/laravel' },
618+
{ text: 'Nuxt', link: '/pellicule/nuxt' },
619+
{ text: 'Quasar', link: '/pellicule/quasar' }
620+
]
621+
},
609622
{
610623
text: 'Concepts',
611624
collapsed: false,

docs/connect-sqlite/getting-started.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Configure your session store in `config/session.js`:
2323
module.exports.session = {
2424
secret: process.env.SESSION_SECRET,
2525
adapter: '@sailscastshq/connect-sqlite',
26-
url: 'sqlite:./db/sessions.db',
26+
url: './db/sessions.db',
2727

2828
cookie: {
2929
secure: true,
@@ -36,19 +36,23 @@ That's it! Sails will automatically use SQLite to store sessions.
3636

3737
## URL Formats
3838

39-
Connect SQLite supports multiple URL formats:
39+
Connect SQLite accepts any valid file path:
4040

4141
```javascript
42-
// File-based database (recommended for production)
43-
url: 'sqlite:./db/sessions.db'
42+
// Relative path (recommended)
43+
url: './db/sessions.db'
4444

4545
// Absolute path
46-
url: 'sqlite:/var/data/sessions.db'
46+
url: '/var/data/sessions.db'
4747

4848
// In-memory database (for testing)
49-
url: 'sqlite::memory:'
49+
url: ':memory:'
5050
```
5151

52+
::: tip
53+
The parent directory will be created automatically if it doesn't exist.
54+
:::
55+
5256
## Why SQLite for Sessions?
5357

5458
- **No external dependencies** - No Redis or Memcached server to manage

docs/pellicule/agent-skills.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ These are useful for AI agents like [Claude Code](https://claude.ai/claude-code)
99
You can install the skills using the following command:
1010

1111
```bash
12-
npx skills add sailscastshq/pellicule-skills
12+
npx skills add sailscastshq/pellicule/skills
1313
```
1414

1515
## What's Included
1616

1717
The skills package includes comprehensive documentation for:
1818

19-
- **getting-started** - Installation, basic setup, and core concepts
19+
- **getting-started** - Installation, setup, and framework integration (Nuxt, Quasar, Laravel, etc.)
2020
- **macros** - `defineVideoConfig` compiler macro for zero-config rendering
2121
- **animations** - Animation utilities: `interpolate`, `sequence`, and easing functions
2222
- **composables** - Vue composables: `useFrame`, `useVideoConfig`, `useSequence`
2323
- **sequences** - `Sequence` component and `useSequence` for scene management
2424
- **patterns** - Common animation patterns (typewriter, staggered, scenes, loops)
25-
- **rendering** - CLI options and video output configuration
25+
- **rendering** - CLI options, BYOS mode, auto-detection, and rendering
2626
- **styling** - CSS, fonts, colors, and visual design
2727

2828
## Usage
@@ -38,4 +38,4 @@ The AI will:
3838

3939
## Source
4040

41-
The skills are maintained at [sailscastshq/pellicule-skills](https://github.com/sailscastshq/pellicule-skills) on GitHub.
41+
The skills are maintained in the [skills/](https://github.com/sailscastshq/pellicule/tree/main/skills) directory of the Pellicule repository.

docs/pellicule/boring-stack.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
---
2+
prev:
3+
text: Vite
4+
link: /pellicule/vite
5+
next:
6+
text: Rsbuild
7+
link: /pellicule/rsbuild
8+
---
9+
10+
# The Boring Stack
11+
12+
If your app uses the [boring stack](https://docs.sailscasts.com/boring-stack) with Shipwright, Pellicule detects `config/shipwright.js` and reads your Rsbuild config from the `build` key. Your `@` and `~` aliases, your Vue plugin, your entire Shipwright config — Pellicule uses all of it.
13+
14+
## Setup
15+
16+
There is no setup. Pellicule reads your `config/shipwright.js`.
17+
18+
A typical Shipwright config:
19+
20+
```js
21+
// config/shipwright.js
22+
const { pluginVue } = require('@rsbuild/plugin-vue')
23+
module.exports.shipwright = {
24+
build: {
25+
plugins: [pluginVue()]
26+
}
27+
}
28+
```
29+
30+
Pellicule reads the `build` key — which is standard Rsbuild config — and uses the Rsbuild adapter to serve your video components with the same aliases and plugins your app uses.
31+
32+
## Project Structure
33+
34+
Create a `videos/` directory inside `assets/js/`, right next to your pages and components:
35+
36+
```
37+
my-app/
38+
├── assets/
39+
│ ├── js/
40+
│ │ ├── app.js
41+
│ │ ├── pages/
42+
│ │ │ └── invoices/
43+
│ │ │ └── index.vue
44+
│ │ ├── components/
45+
│ │ │ ├── InvoiceCard.vue
46+
│ │ │ └── PriceTag.vue
47+
│ │ └── videos/ ← your video components
48+
│ │ ├── InvoiceDemo.vue
49+
│ │ └── AppIntro.vue
50+
│ └── css/
51+
│ └── app.css
52+
├── config/
53+
│ └── shipwright.js
54+
└── package.json
55+
```
56+
57+
This follows the same convention as the rest of your boring stack app. Pages live in `pages/`, components in `components/`, videos in `videos/`.
58+
59+
## Rendering
60+
61+
```bash
62+
# Pellicule finds assets/js/videos/InvoiceDemo.vue automatically
63+
pellicule InvoiceDemo
64+
65+
# Or pass the full path
66+
pellicule assets/js/videos/InvoiceDemo.vue
67+
68+
# With options
69+
pellicule AppIntro -o marketing-intro.mp4
70+
```
71+
72+
## Example Video Component
73+
74+
```vue
75+
<script setup>
76+
import { computed } from 'vue'
77+
import { useFrame, useVideoConfig, interpolate, Easing } from 'pellicule'
78+
import InvoiceCard from '@/components/InvoiceCard.vue'
79+
import PriceTag from '@/components/PriceTag.vue'
80+
81+
defineVideoConfig({
82+
durationInSeconds: 8,
83+
width: 1920,
84+
height: 1080
85+
})
86+
87+
const frame = useFrame()
88+
const { fps } = useVideoConfig()
89+
90+
const cardOpacity = computed(() => interpolate(frame.value, [0, fps], [0, 1]))
91+
92+
const priceSlide = computed(() =>
93+
interpolate(frame.value, [fps * 0.5, fps * 1.5], [40, 0], {
94+
easing: Easing.easeOut
95+
})
96+
)
97+
</script>
98+
99+
<template>
100+
<div class="video">
101+
<InvoiceCard :style="{ opacity: cardOpacity }">
102+
<PriceTag
103+
amount="2,400"
104+
currency="USD"
105+
:style="{ transform: `translateY(${priceSlide}px)` }"
106+
/>
107+
</InvoiceCard>
108+
</div>
109+
</template>
110+
111+
<style scoped>
112+
.video {
113+
width: 100%;
114+
height: 100%;
115+
display: flex;
116+
align-items: center;
117+
justify-content: center;
118+
background: #f5f5f5;
119+
}
120+
</style>
121+
```
122+
123+
`InvoiceCard` and `PriceTag` are your real app components — the same ones your users see. The `@` alias resolves because Shipwright already maps it to `assets/js/`. When you update the component in your app, the video updates too.
124+
125+
## Using Composables and Layouts
126+
127+
Your `assets/js/composables/` are available too:
128+
129+
```vue
130+
<script setup>
131+
import { useFrame, interpolate } from 'pellicule'
132+
import { useCurrencyFormatter } from '@/composables/currency'
133+
134+
const frame = useFrame()
135+
const { format } = useCurrencyFormatter('USD')
136+
137+
const amount = computed(() => {
138+
const raw = interpolate(frame.value, [0, 60], [0, 2400])
139+
return format(Math.round(raw))
140+
})
141+
</script>
142+
143+
<template>
144+
<div class="video">
145+
<span class="counter">{{ amount }}</span>
146+
</div>
147+
</template>
148+
```
149+
150+
Your formatting logic, your utility functions, your design tokens — all reusable in videos without duplication.

docs/pellicule/cli.md

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,70 @@ npx pellicule Video # Looks for Video.vue
2121
npx pellicule Video.vue # Same result
2222
```
2323

24+
Pellicule also checks your project's default video directory based on the detected framework. In a boring stack app, `pellicule InvoiceDemo` finds `assets/js/videos/InvoiceDemo.vue`. In a Laravel app, it finds `resources/js/Videos/InvoiceDemo.vue`. See [Integrations](/pellicule/integrations) for details.
25+
2426
## Options
2527

26-
| Option | Short | Default | Description |
27-
| ------------ | ----- | -------------- | -------------------------------------- |
28-
| `--output` | `-o` | `./output.mp4` | Output file path |
29-
| `--duration` | `-d` | `90` | Duration in frames |
30-
| `--fps` | `-f` | `30` | Frames per second |
31-
| `--width` | `-w` | `1920` | Video width in pixels |
32-
| `--height` | `-h` | `1080` | Video height in pixels |
33-
| `--range` | `-r` | | Frame range to render (start:end) |
34-
| `--audio` | `-a` | | Audio file to include (mp3, wav, etc.) |
35-
| `--help` | | | Show help message |
36-
| `--version` | | | Show version number |
28+
| Option | Short | Default | Description |
29+
| -------------- | ----- | -------------- | ------------------------------------------------ |
30+
| `--output` | `-o` | `./output.mp4` | Output file path |
31+
| `--duration` | `-d` | `90` | Duration in frames |
32+
| `--fps` | `-f` | `30` | Frames per second |
33+
| `--width` | `-w` | `1920` | Video width in pixels |
34+
| `--height` | `-h` | `1080` | Video height in pixels |
35+
| `--range` | `-r` | | Frame range to render (start:end) |
36+
| `--audio` | `-a` | | Audio file to include (mp3, wav, etc.) |
37+
| `--server-url` | | | Use a running dev server instead of starting one |
38+
| `--bundler` | | | Force a specific bundler (`vite` or `rsbuild`) |
39+
| `--config` | | | Path to a specific config file |
40+
| `--videos-dir` | | | Override the default video directory |
41+
| `--out-dir` | | | Directory for rendered video output |
42+
| `--help` | | | Show help message |
43+
| `--version` | | | Show version number |
44+
45+
### Project Config (package.json)
46+
47+
Instead of passing integration flags on every command, set them once in your `package.json`:
48+
49+
```json
50+
{
51+
"pellicule": {
52+
"serverUrl": "http://localhost:3000",
53+
"videosDir": "app/videos",
54+
"outDir": "./renders",
55+
"bundler": "rsbuild"
56+
}
57+
}
58+
```
59+
60+
| Key | Type | Description |
61+
| ----------- | ------ | ----------------------------------------------------- |
62+
| `serverUrl` | string | URL of a running dev server (BYOS mode) |
63+
| `videosDir` | string | Custom directory for video components (relative path) |
64+
| `outDir` | string | Directory for rendered video output (relative path) |
65+
| `bundler` | string | Force `vite` or `rsbuild` |
66+
67+
When `outDir` is set and no `-o` flag is passed, the output filename is derived from the component name. For example, `pellicule InvoiceDemo` with `outDir` set to `./renders` writes to `./renders/InvoiceDemo.mp4`.
68+
69+
Resolution order: **CLI flags > package.json > auto-detected > defaults**.
70+
71+
### Integration Options
72+
73+
Most projects never need these — Pellicule auto-detects your project type and config, and the package.json `pellicule` key handles project-wide settings. These CLI flags are escape hatches for one-off overrides.
74+
75+
```bash
76+
# Override the default Nuxt server URL (defaults to localhost:3000)
77+
pellicule AppDemo --server-url http://localhost:4000
78+
79+
# Force Rsbuild adapter
80+
pellicule Video --bundler rsbuild
81+
82+
# Point at a specific config file
83+
pellicule Video --config ./custom/vite.config.js
84+
85+
# Override where Pellicule looks for video files
86+
pellicule InvoiceDemo --videos-dir ./my/videos
87+
```
3788

3889
## Examples
3990

docs/pellicule/getting-started.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,15 @@ Create a `Video.vue` file and run:
128128
npx pellicule Video.vue
129129
```
130130

131+
Pellicule auto-detects your project type and reads your existing config. No extra configuration needed — if you have a `vite.config.js`, `config/shipwright.js`, or `nuxt.config.ts`, Pellicule picks it up automatically. Your aliases and plugins just work.
132+
133+
See [Integrations](/pellicule/integrations) for framework-specific guides.
134+
131135
## Next Steps
132136

133137
Learn the core concepts:
134138

135139
- [Frames](/pellicule/frames) — The fundamental unit of video
136140
- [Video Config](/pellicule/video-config) — Understanding fps, duration, and dimensions
137141
- [Sequences](/pellicule/sequences) — Organizing videos into scenes
142+
- [Integrations](/pellicule/integrations) — Using Pellicule with Vite, Nuxt, Laravel, The Boring Stack, and Quasar

docs/pellicule/how-it-works.md

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,29 @@ When you render a video, Pellicule executes these steps:
1717

1818
```
1919
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
20-
Vite Dev │ -> │ Playwright │ -> │ Screenshot │ -> │ FFmpeg │
21-
Server │ │ (Browser) │ │ Capture │ │ Encode │
20+
│ Dev Server │ -> │ Playwright │ -> │ Screenshot │ -> │ FFmpeg │
21+
(auto) │ │ (Browser) │ │ Capture │ │ Encode │
2222
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
2323
```
2424

25-
### 1. Vite Dev Server
25+
### 1. Dev Server
2626

27-
Pellicule starts a Vite dev server that serves your Vue component. This gives you:
27+
Pellicule detects your project's build tool and starts a dev server that serves your Vue component. It reads your existing config automatically:
28+
29+
- `vite.config.js` → Vite adapter (standalone projects, Laravel + Inertia)
30+
- `rsbuild.config.js` → Rsbuild adapter (standalone Rsbuild projects)
31+
- `config/shipwright.js` → Rsbuild adapter (boring stack apps)
32+
- `nuxt.config.ts` → Connects to your running Nuxt dev server
33+
- No config → built-in Vite adapter (standalone projects via `create-pellicule`)
34+
35+
This gives you:
2836

29-
- Hot module replacement during development
3037
- Full Vue 3 support with single-file components
38+
- Your project's aliases and plugins, loaded automatically
3139
- Access to the entire npm ecosystem
3240

41+
See [Integrations](/pellicule/integrations) for framework-specific details.
42+
3343
### 2. Playwright Browser
3444

3545
A headless Chromium browser (via Playwright) loads your component. The browser provides:
@@ -108,19 +118,7 @@ Areas we're exploring for future versions:
108118

109119
## Audio Support
110120

111-
Audio is not currently supported. Pellicule focuses on visual rendering.
112-
113-
If you need audio, you can add it post-render with FFmpeg:
114-
115-
```bash
116-
# Render video with Pellicule
117-
npx pellicule -d 300 -o video.mp4
118-
119-
# Add audio track with FFmpeg
120-
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest final.mp4
121-
```
122-
123-
Audio sync is on the roadmap for future versions.
121+
Pellicule supports adding audio tracks to your videos via the `--audio` CLI flag or the `audio` property in `defineVideoConfig`. See the [CLI reference](/pellicule/cli) for details.
124122

125123
## Rendering Environment
126124

0 commit comments

Comments
 (0)