@mulmoclaude/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/helps/billing-clients-worklog.md +215 -0
- package/assets/helps/billing-invoice.md +458 -0
- package/assets/helps/business.md +104 -0
- package/assets/helps/collection-skills.md +810 -0
- package/assets/helps/custom-view.md +433 -0
- package/assets/helps/feeds.md +114 -0
- package/assets/helps/gemini.md +57 -0
- package/assets/helps/github.md +23 -0
- package/assets/helps/guide.md +61 -0
- package/assets/helps/index.md +89 -0
- package/assets/helps/lessons-collection.md +400 -0
- package/assets/helps/mulmoscript.md +249 -0
- package/assets/helps/portfolio-tracker.md +211 -0
- package/assets/helps/presentation-deck.md +828 -0
- package/assets/helps/presenthtml.md +89 -0
- package/assets/helps/sandbox.md +97 -0
- package/assets/helps/spreadsheet.md +43 -0
- package/assets/helps/storyteller.md +101 -0
- package/assets/helps/telegram.md +136 -0
- package/assets/helps/todo-collection.md +140 -0
- package/assets/helps/vocabulary.md +109 -0
- package/assets/helps/wiki.md +168 -0
- package/assets/skills-preset/mc-cooking-coach/SKILL.md +217 -0
- package/assets/skills-preset/mc-library/SKILL.md +188 -0
- package/assets/skills-preset/mc-manage-automations/SKILL.md +119 -0
- package/assets/skills-preset/mc-manage-skills/SKILL.md +141 -0
- package/assets/skills-preset/mc-wiki-deep-lint/SKILL.md +108 -0
- package/assets/skills-preset/mc-wiki-health-check/SKILL.md +61 -0
- package/assets/skills-preset/mc-wiki-ingest/SKILL.md +182 -0
- package/assets/skills-preset/mc-wiki-promote/SKILL.md +175 -0
- package/assets/skills-preset/mc-zenn/SKILL.md +136 -0
- package/dist/chunk-CKQMccvm.cjs +28 -0
- package/dist/collection/core/actionVisible.d.ts +34 -0
- package/dist/collection/core/calendarGrid.d.ts +120 -0
- package/dist/collection/core/deriveAll.d.ts +38 -0
- package/dist/collection/core/derivedFormula.d.ts +18 -0
- package/dist/collection/core/draft.d.ts +18 -0
- package/dist/collection/core/enumColors.d.ts +33 -0
- package/dist/collection/core/errorMessage.d.ts +4 -0
- package/dist/collection/core/itemLabel.d.ts +12 -0
- package/dist/collection/core/presentCollection.d.ts +13 -0
- package/dist/collection/core/promptSafety.d.ts +1 -0
- package/dist/collection/core/schema.d.ts +355 -0
- package/dist/collection/core/shortHexId.d.ts +8 -0
- package/dist/collection/core/sortItems.d.ts +29 -0
- package/dist/collection/core/uiTypes.d.ts +106 -0
- package/dist/collection/index.cjs +793 -0
- package/dist/collection/index.cjs.map +1 -0
- package/dist/collection/index.d.ts +14 -0
- package/dist/collection/index.js +740 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/paths.cjs +44 -0
- package/dist/collection/paths.cjs.map +1 -0
- package/dist/collection/paths.js +41 -0
- package/dist/collection/paths.js.map +1 -0
- package/dist/collection/server/atomic.d.ts +1 -0
- package/dist/collection/server/delete.d.ts +38 -0
- package/dist/collection/server/derive.d.ts +8 -0
- package/dist/collection/server/discoveredCollection.d.ts +18 -0
- package/dist/collection/server/discovery.d.ts +227 -0
- package/dist/collection/server/host.d.ts +77 -0
- package/dist/collection/server/index.cjs +1721 -0
- package/dist/collection/server/index.cjs.map +1 -0
- package/dist/collection/server/index.d.ts +11 -0
- package/dist/collection/server/index.js +1671 -0
- package/dist/collection/server/index.js.map +1 -0
- package/dist/collection/server/io.d.ts +114 -0
- package/dist/collection/server/paths.d.ts +52 -0
- package/dist/collection/server/spawn.d.ts +55 -0
- package/dist/collection/server/templatePath.d.ts +25 -0
- package/dist/collection/server/util.d.ts +3 -0
- package/dist/collection/server/validate.d.ts +19 -0
- package/dist/collection/server/views.d.ts +20 -0
- package/dist/deriveAll-C15OpM3K.cjs +399 -0
- package/dist/deriveAll-C15OpM3K.cjs.map +1 -0
- package/dist/deriveAll-C6BYnpBL.js +364 -0
- package/dist/deriveAll-C6BYnpBL.js.map +1 -0
- package/dist/file-change/index.cjs +72 -0
- package/dist/file-change/index.cjs.map +1 -0
- package/dist/file-change/index.d.ts +43 -0
- package/dist/file-change/index.js +66 -0
- package/dist/file-change/index.js.map +1 -0
- package/dist/notifier/engine.d.ts +72 -0
- package/dist/notifier/index.cjs +484 -0
- package/dist/notifier/index.cjs.map +1 -0
- package/dist/notifier/index.d.ts +3 -0
- package/dist/notifier/index.js +464 -0
- package/dist/notifier/index.js.map +1 -0
- package/dist/notifier/store.d.ts +18 -0
- package/dist/notifier/types.d.ts +118 -0
- package/dist/notifier/validate.d.ts +17 -0
- package/dist/scheduler/adapter.d.ts +48 -0
- package/dist/scheduler/index.cjs +352 -0
- package/dist/scheduler/index.cjs.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.js +343 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/task-manager.d.ts +51 -0
- package/dist/whisper/client.cjs +241 -0
- package/dist/whisper/client.cjs.map +1 -0
- package/dist/whisper/client.d.ts +35 -0
- package/dist/whisper/client.js +239 -0
- package/dist/whisper/client.js.map +1 -0
- package/dist/whisper/ffmpeg.d.ts +6 -0
- package/dist/whisper/index.cjs +433 -0
- package/dist/whisper/index.cjs.map +1 -0
- package/dist/whisper/index.d.ts +5 -0
- package/dist/whisper/index.js +425 -0
- package/dist/whisper/index.js.map +1 -0
- package/dist/whisper/internal.d.ts +11 -0
- package/dist/whisper/models.d.ts +49 -0
- package/dist/whisper/sidecar.d.ts +8 -0
- package/dist/whisper/whisper.d.ts +28 -0
- package/dist/workspace-setup/assets.d.ts +10 -0
- package/dist/workspace-setup/index.d.ts +3 -0
- package/dist/workspace-setup/index.js +556 -0
- package/dist/workspace-setup/index.js.map +1 -0
- package/dist/workspace-setup/slug.d.ts +6 -0
- package/dist/workspace-setup/slug.js +13 -0
- package/dist/workspace-setup/slug.js.map +1 -0
- package/dist/workspace-setup/sync.d.ts +94 -0
- package/package.json +95 -0
|
@@ -0,0 +1,828 @@
|
|
|
1
|
+
# MulmoCast Business Presentation Deck — Authoring Guide (for LLMs)
|
|
2
|
+
|
|
3
|
+
This guide is for generating **business presentation decks** (pitches, investor updates, strategy
|
|
4
|
+
reviews, product briefings). You generate a **MulmoScript** JSON file. There are **two ways** to
|
|
5
|
+
author such a deck. Pick one per deck (don't mix), then imitate the matching sample below.
|
|
6
|
+
|
|
7
|
+
## The two approaches
|
|
8
|
+
|
|
9
|
+
1. **`slide`** — structured layouts (`title`, `stats`, `table`, `timeline`, …). Static images.
|
|
10
|
+
Pick this by **default**: compact, consistent, hard to break.
|
|
11
|
+
For impact-heavy decks (opening / closing / principles / credo) add the **Polish toolkit**
|
|
12
|
+
expressions documented after Sample A — hero titles, `manifesto` layout, glass theme,
|
|
13
|
+
`eyebrow` / `chips`, icon bullets, inline color spans.
|
|
14
|
+
|
|
15
|
+
2. **`html_tailwind` + `animation: true`** — free-form HTML/CSS/JS, rendered to an animated video.
|
|
16
|
+
Pick this **only when motion is wanted** (count-up numbers, sequential reveals, animated opener).
|
|
17
|
+
|
|
18
|
+
Each beat is `{ "text": "narration…", "image": { … } }`. The two approaches differ only in what goes
|
|
19
|
+
inside `image`. Study the samples — every field you need appears there.
|
|
20
|
+
|
|
21
|
+
## MulmoClaude conventions (this app)
|
|
22
|
+
|
|
23
|
+
This guide runs inside MulmoClaude, which renders MulmoScript in the canvas. A few app-specific rules
|
|
24
|
+
override the generic guidance above:
|
|
25
|
+
|
|
26
|
+
- **Tool**: hand the finished JSON to the `presentMulmoScript` tool — that is how a deck is rendered here.
|
|
27
|
+
- **Narration / TTS**: declare a speaker once in `speechParams.speakers` with `isDefault: true` and
|
|
28
|
+
the **Google** provider (`"provider": "gemini", "voiceId": "Kore"`). Beats then inherit it without
|
|
29
|
+
repeating `speaker`. Both samples below include this block — keep it.
|
|
30
|
+
- **Providers are Google-only.** This app configures only Google providers; never emit `openai`,
|
|
31
|
+
`elevenlabs`, etc. Neither approach generates AI images or video, so `imageParams` / `movieParams`
|
|
32
|
+
are not needed (the `slide` type renders static layouts; `html_tailwind` + `animation` renders from
|
|
33
|
+
your own HTML).
|
|
34
|
+
- **`description`**: put a 1–2 sentence summary of the whole deck in the top-level `description` field.
|
|
35
|
+
- **Visual editor**: when every beat in the resulting script is a `slide`, MulmoClaude swaps the per-beat list view for an interactive deck editor in the canvas — the user can drag, reorder, and tweak slide fields without touching JSON. You don't have to do anything to enable it; just produce a script where `beats[].image.type === "slide"` for every beat. Mixed scripts (slide + movie / textSlide / etc.) fall back to the per-beat list.
|
|
36
|
+
|
|
37
|
+
## Styling: shared vs. repeated per beat
|
|
38
|
+
|
|
39
|
+
The two approaches handle the color scheme / fonts differently — this matters when you generate the JSON:
|
|
40
|
+
|
|
41
|
+
- **`slide`**: define the theme **once** in `slideParams.theme`. Every beat inherits it. Do **not**
|
|
42
|
+
repeat it per slide.
|
|
43
|
+
- **`html_tailwind`**: there is **no shared theme**. Each beat is an isolated HTML document, so you
|
|
44
|
+
must **repeat the same `<style>:root{…}</style>` palette block (and the wrapper styling) in every
|
|
45
|
+
single beat**. Keep that block byte-for-byte identical across all beats so the deck looks uniform.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Sample A — `slide` (structured layouts)
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"$mulmocast": { "version": "1.1" },
|
|
54
|
+
"lang": "en",
|
|
55
|
+
"title": "Aurora Analytics — Slide Deck Showcase",
|
|
56
|
+
"description": "An investor-facing tour of Aurora Analytics: where the product stands today and where its roadmap leads.",
|
|
57
|
+
"speechParams": {
|
|
58
|
+
"speakers": {
|
|
59
|
+
"Presenter": { "provider": "gemini", "voiceId": "Kore", "isDefault": true, "displayName": { "en": "Presenter" } }
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"slideParams": {
|
|
63
|
+
"theme": {
|
|
64
|
+
"colors": {
|
|
65
|
+
"bg": "0F172A", "bgCard": "1E293B", "bgCardAlt": "334155",
|
|
66
|
+
"text": "F8FAFC", "textMuted": "CBD5E1", "textDim": "64748B",
|
|
67
|
+
"primary": "38BDF8", "accent": "A78BFA", "success": "34D399",
|
|
68
|
+
"warning": "FBBF24", "danger": "F87171", "info": "22D3EE", "highlight": "F472B6"
|
|
69
|
+
},
|
|
70
|
+
"fonts": { "title": "Georgia", "body": "Helvetica", "mono": "Menlo" }
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"beats": [
|
|
74
|
+
{
|
|
75
|
+
"text": "Welcome to Aurora Analytics. Today we will walk through where we are and where we are going.",
|
|
76
|
+
"image": {
|
|
77
|
+
"type": "slide",
|
|
78
|
+
"slide": {
|
|
79
|
+
"layout": "title",
|
|
80
|
+
"title": "Aurora Analytics",
|
|
81
|
+
"subtitle": "Turning raw events into decisions, in real time",
|
|
82
|
+
"author": "Mei Tanaka, Head of Product | Q2 2026",
|
|
83
|
+
"note": "Every slide in this deck inherits the deck-level theme defined once in slideParams.theme."
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"text": "We believe data should speak the moment it arrives, not the morning after.",
|
|
89
|
+
"image": {
|
|
90
|
+
"type": "slide",
|
|
91
|
+
"slide": {
|
|
92
|
+
"layout": "bigQuote",
|
|
93
|
+
"accentColor": "primary",
|
|
94
|
+
"quote": "Data should speak the moment it arrives, not the morning after.",
|
|
95
|
+
"author": "Aurora Founding Principle",
|
|
96
|
+
"role": "Every beat inherits the deck-level theme from slideParams.theme."
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"text": "Our pipeline works in three stages: ingest, transform, and serve.",
|
|
102
|
+
"image": {
|
|
103
|
+
"type": "slide",
|
|
104
|
+
"slide": {
|
|
105
|
+
"layout": "columns",
|
|
106
|
+
"accentColor": "primary",
|
|
107
|
+
"stepLabel": "PIPELINE",
|
|
108
|
+
"title": "How Aurora Works",
|
|
109
|
+
"subtitle": "From raw events to live dashboards in three stages",
|
|
110
|
+
"showArrows": true,
|
|
111
|
+
"columns": [
|
|
112
|
+
{
|
|
113
|
+
"title": "Ingest",
|
|
114
|
+
"num": 1,
|
|
115
|
+
"accentColor": "primary",
|
|
116
|
+
"content": [
|
|
117
|
+
{ "type": "text", "value": "Events stream in from SDKs, webhooks, and warehouses." },
|
|
118
|
+
{ "type": "bullets", "items": ["50+ source connectors", "Exactly-once delivery", "Schema autodetect"] }
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"title": "Transform",
|
|
123
|
+
"num": 2,
|
|
124
|
+
"accentColor": "accent",
|
|
125
|
+
"content": [
|
|
126
|
+
{ "type": "text", "value": "Streaming SQL enriches and aggregates on the fly." },
|
|
127
|
+
{ "type": "bullets", "items": ["Windowed joins", "Sub-second latency", "Versioned models"] }
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"title": "Serve",
|
|
132
|
+
"num": 3,
|
|
133
|
+
"accentColor": "success",
|
|
134
|
+
"content": [
|
|
135
|
+
{ "type": "text", "value": "Results push to dashboards, alerts, and reverse-ETL." },
|
|
136
|
+
{ "type": "bullets", "items": ["Live dashboards", "Slack & PagerDuty", "API + reverse-ETL"] }
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"callout": {
|
|
141
|
+
"label": "Tip",
|
|
142
|
+
"text": "The same MulmoScript can render to video, PDF, and a self-contained HTML deck.",
|
|
143
|
+
"color": "info",
|
|
144
|
+
"leftBar": true
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"text": "The numbers tell the story of the last quarter.",
|
|
151
|
+
"image": {
|
|
152
|
+
"type": "slide",
|
|
153
|
+
"slide": {
|
|
154
|
+
"layout": "stats",
|
|
155
|
+
"accentColor": "primary",
|
|
156
|
+
"title": "Quarter in Numbers",
|
|
157
|
+
"subtitle": "FY2026 Q1 snapshot",
|
|
158
|
+
"stats": [
|
|
159
|
+
{ "value": "+47%", "label": "Revenue YoY", "color": "success", "change": "+12pts" },
|
|
160
|
+
{ "value": "1.9M", "label": "Daily Active Orgs", "color": "primary" },
|
|
161
|
+
{ "value": "320ms", "label": "p99 Query Latency", "color": "info", "change": "-38%" },
|
|
162
|
+
{ "value": "99.98%", "label": "Uptime", "color": "accent" }
|
|
163
|
+
],
|
|
164
|
+
"callout": { "text": "All metrics are sourced live from Aurora running on itself.", "align": "center" }
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"text": "Revenue has compounded for four straight quarters, accelerating quarter over quarter.",
|
|
170
|
+
"image": {
|
|
171
|
+
"type": "slide",
|
|
172
|
+
"slide": {
|
|
173
|
+
"layout": "split",
|
|
174
|
+
"accentColor": "success",
|
|
175
|
+
"left": {
|
|
176
|
+
"title": "Revenue Trend",
|
|
177
|
+
"label": "GROWTH",
|
|
178
|
+
"accentColor": "success",
|
|
179
|
+
"ratio": 45,
|
|
180
|
+
"content": [
|
|
181
|
+
{ "type": "text", "value": "Four straight quarters of accelerating ARR.", "bold": true },
|
|
182
|
+
{ "type": "bullets", "items": ["+71% over the trailing year", "Expansion now outpaces new logos", "Q1 2026 closed at $21.2M ARR"] }
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
"right": {
|
|
186
|
+
"title": "Quarterly ARR",
|
|
187
|
+
"ratio": 55,
|
|
188
|
+
"content": [
|
|
189
|
+
{
|
|
190
|
+
"type": "chart",
|
|
191
|
+
"title": "Quarterly ARR ($M)",
|
|
192
|
+
"chartData": {
|
|
193
|
+
"type": "bar",
|
|
194
|
+
"data": {
|
|
195
|
+
"labels": ["Q2 '25", "Q3 '25", "Q4 '25", "Q1 '26"],
|
|
196
|
+
"datasets": [{ "label": "ARR", "data": [12.4, 14.1, 16.8, 21.2] }]
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"text": "Four capabilities set Aurora apart from batch tooling.",
|
|
207
|
+
"image": {
|
|
208
|
+
"type": "slide",
|
|
209
|
+
"slide": {
|
|
210
|
+
"layout": "grid",
|
|
211
|
+
"accentColor": "accent",
|
|
212
|
+
"title": "What You Get",
|
|
213
|
+
"subtitle": "Core capabilities at a glance",
|
|
214
|
+
"gridColumns": 4,
|
|
215
|
+
"items": [
|
|
216
|
+
{ "title": "Real-time", "icon": "⚡", "accentColor": "primary", "description": "Sub-second freshness from source to screen" },
|
|
217
|
+
{ "title": "Governed", "icon": "🔒", "accentColor": "info", "description": "Row-level security and full audit trails" },
|
|
218
|
+
{ "title": "Open", "icon": "🔌", "accentColor": "accent", "description": "SQL-native, no proprietary lock-in" },
|
|
219
|
+
{ "title": "Scalable", "icon": "📈", "accentColor": "success", "description": "From one stream to a million per second" }
|
|
220
|
+
],
|
|
221
|
+
"footer": "Every capability ships on day one — no add-on tiers."
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"text": "Compare the old batch world with the Aurora way.",
|
|
227
|
+
"image": {
|
|
228
|
+
"type": "slide",
|
|
229
|
+
"slide": {
|
|
230
|
+
"layout": "comparison",
|
|
231
|
+
"accentColor": "primary",
|
|
232
|
+
"stepLabel": "WHY NOW",
|
|
233
|
+
"title": "Batch vs. Streaming",
|
|
234
|
+
"subtitle": "Why teams are leaving nightly jobs behind",
|
|
235
|
+
"left": {
|
|
236
|
+
"title": "Nightly Batch",
|
|
237
|
+
"accentColor": "danger",
|
|
238
|
+
"content": [
|
|
239
|
+
{ "type": "bullets", "items": ["Data is hours stale", "Failures found next morning", "Rigid, brittle schedules"], "icon": "✗" },
|
|
240
|
+
{ "type": "metric", "value": "~8h", "label": "Decision lag", "color": "danger" }
|
|
241
|
+
],
|
|
242
|
+
"footer": "Yesterday's answers, today"
|
|
243
|
+
},
|
|
244
|
+
"right": {
|
|
245
|
+
"title": "Aurora Streaming",
|
|
246
|
+
"accentColor": "success",
|
|
247
|
+
"content": [
|
|
248
|
+
{ "type": "bullets", "items": ["Always-fresh data", "Alerts the moment it breaks", "Self-healing pipelines"], "icon": "✓" },
|
|
249
|
+
{ "type": "metric", "value": "<1s", "label": "Decision lag", "color": "success" }
|
|
250
|
+
],
|
|
251
|
+
"footer": "Answers as events happen"
|
|
252
|
+
},
|
|
253
|
+
"callout": { "label": "Result", "text": "From 8 hours to under a second — a 28,000x improvement in freshness.", "color": "success", "leftBar": true }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"text": "Here is the architecture and a taste of the developer experience.",
|
|
259
|
+
"image": {
|
|
260
|
+
"type": "slide",
|
|
261
|
+
"slide": {
|
|
262
|
+
"layout": "split",
|
|
263
|
+
"accentColor": "primary",
|
|
264
|
+
"left": {
|
|
265
|
+
"title": "Developer Experience",
|
|
266
|
+
"label": "DX",
|
|
267
|
+
"accentColor": "primary",
|
|
268
|
+
"ratio": 50,
|
|
269
|
+
"content": [
|
|
270
|
+
{ "type": "text", "value": "Define a streaming view in plain SQL — Aurora handles the rest.", "bold": true },
|
|
271
|
+
{ "type": "divider", "color": "primary" },
|
|
272
|
+
{ "type": "bullets", "items": ["No Kafka to babysit", "Version-controlled models", "Local-to-prod parity"] },
|
|
273
|
+
{ "type": "callout", "text": "Ships with a typed SDK for TypeScript, Python, and Go.", "style": "info" }
|
|
274
|
+
]
|
|
275
|
+
},
|
|
276
|
+
"right": {
|
|
277
|
+
"title": "Define a live view",
|
|
278
|
+
"dark": true,
|
|
279
|
+
"ratio": 50,
|
|
280
|
+
"content": [
|
|
281
|
+
{ "type": "code", "code": "CREATE LIVE VIEW active_orgs AS\nSELECT\n org_id,\n count(*) AS events,\n max(ts) AS last_seen\nFROM stream.events\nWHERE ts > now() - INTERVAL '5 minutes'\nGROUP BY org_id;" }
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"text": "We position Aurora on flexibility versus ease of use.",
|
|
289
|
+
"image": {
|
|
290
|
+
"type": "slide",
|
|
291
|
+
"slide": {
|
|
292
|
+
"layout": "matrix",
|
|
293
|
+
"accentColor": "info",
|
|
294
|
+
"title": "The Landscape",
|
|
295
|
+
"subtitle": "Where each approach lands on flexibility and ease of use",
|
|
296
|
+
"xAxis": { "low": "Low Flexibility", "high": "High Flexibility" },
|
|
297
|
+
"yAxis": { "low": "Hard to Use", "high": "Easy to Use" },
|
|
298
|
+
"cells": [
|
|
299
|
+
{ "label": "Hand-rolled Kafka", "accentColor": "warning", "items": ["Total control", "Heavy ops burden"] },
|
|
300
|
+
{ "label": "Aurora", "accentColor": "success", "items": ["Flexible SQL", "Fully managed", "Sweet spot"] },
|
|
301
|
+
{ "label": "Spreadsheets", "accentColor": "danger", "items": ["Anyone can use", "Breaks at scale"] },
|
|
302
|
+
{ "label": "Closed BI Suite", "accentColor": "info", "items": ["Polished UI", "Vendor lock-in"] }
|
|
303
|
+
]
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"text": "Our roadmap takes us from launch to an open ecosystem.",
|
|
309
|
+
"image": {
|
|
310
|
+
"type": "slide",
|
|
311
|
+
"slide": {
|
|
312
|
+
"layout": "timeline",
|
|
313
|
+
"accentColor": "primary",
|
|
314
|
+
"stepLabel": "ROADMAP",
|
|
315
|
+
"title": "Where We Are Headed",
|
|
316
|
+
"subtitle": "Major milestones across 2026",
|
|
317
|
+
"items": [
|
|
318
|
+
{ "date": "Q1 2026", "title": "GA Launch", "description": "Public availability\n50 connectors", "color": "primary", "done": true },
|
|
319
|
+
{ "date": "Q2 2026", "title": "Live Views 2.0", "description": "Incremental joins\nMaterialized caching", "color": "accent", "done": true },
|
|
320
|
+
{ "date": "Q3 2026", "title": "Governance Suite", "description": "Row-level policies\nLineage graph", "color": "info" },
|
|
321
|
+
{ "date": "Q4 2026", "title": "Marketplace", "description": "Community connectors\nShared models", "color": "success" }
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"text": "Adoption flows from sign-up to active production teams.",
|
|
328
|
+
"image": {
|
|
329
|
+
"type": "slide",
|
|
330
|
+
"slide": {
|
|
331
|
+
"layout": "funnel",
|
|
332
|
+
"accentColor": "primary",
|
|
333
|
+
"title": "Adoption Funnel",
|
|
334
|
+
"subtitle": "From first sign-up to production champions",
|
|
335
|
+
"stages": [
|
|
336
|
+
{ "label": "Sign-ups", "value": "32K", "description": "Free tier activations", "color": "primary" },
|
|
337
|
+
{ "label": "Connected", "value": "9.1K", "description": "First data source wired in", "color": "accent" },
|
|
338
|
+
{ "label": "In Production", "value": "2.4K", "description": "Live view powering a real workflow", "color": "info" },
|
|
339
|
+
{ "label": "Paid Teams", "value": "610", "description": "Upgraded to a paid plan", "color": "warning" },
|
|
340
|
+
{ "label": "Champions", "value": "95", "description": "Multi-team rollout", "color": "success" }
|
|
341
|
+
],
|
|
342
|
+
"callout": { "text": "1.9% sign-up to paid conversion, well above category benchmarks.", "align": "center" }
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"text": "This bridge shows how we turned last year's profit into this year's.",
|
|
348
|
+
"image": {
|
|
349
|
+
"type": "slide",
|
|
350
|
+
"slide": {
|
|
351
|
+
"layout": "waterfall",
|
|
352
|
+
"title": "FY2026 ARR Bridge",
|
|
353
|
+
"subtitle": "YoY +$6.2M (+41%)",
|
|
354
|
+
"unit": "$M",
|
|
355
|
+
"items": [
|
|
356
|
+
{ "label": "FY2025\nARR", "value": 15.0, "isTotal": true },
|
|
357
|
+
{ "label": "New\nLogos", "value": 5.4 },
|
|
358
|
+
{ "label": "Expansion", "value": 3.1 },
|
|
359
|
+
{ "label": "Churn", "value": -2.3 },
|
|
360
|
+
{ "label": "FX", "value": -0.0 },
|
|
361
|
+
{ "label": "FY2026\nARR", "value": 21.2, "isTotal": true }
|
|
362
|
+
],
|
|
363
|
+
"callout": { "label": "Summary", "text": "New logos and expansion more than offset churn, lifting ARR past $21M." }
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"text": "Finally, here is how every plan compares feature by feature.",
|
|
369
|
+
"image": {
|
|
370
|
+
"type": "slide",
|
|
371
|
+
"slide": {
|
|
372
|
+
"layout": "table",
|
|
373
|
+
"accentColor": "primary",
|
|
374
|
+
"title": "Plan Comparison",
|
|
375
|
+
"subtitle": "Pick the tier that fits your stage",
|
|
376
|
+
"headers": ["Feature", "Free", "Team", "Enterprise"],
|
|
377
|
+
"rowHeaders": true,
|
|
378
|
+
"rows": [
|
|
379
|
+
["Live views", "3", "Unlimited", "Unlimited"],
|
|
380
|
+
["Connectors", "5", "50", "50+ custom"],
|
|
381
|
+
["Row-level security", "—", { "text": "✓", "color": "success", "bold": true }, { "text": "✓", "color": "success", "bold": true }],
|
|
382
|
+
["SSO & audit logs", "—", "—", { "text": "✓", "color": "success", "bold": true }],
|
|
383
|
+
["Support", "Community", "8x5", { "text": "24x7", "color": "primary", "bold": true }]
|
|
384
|
+
],
|
|
385
|
+
"callout": { "label": "Note", "text": "All tiers include sub-second freshness — performance is never gated.", "color": "info", "leftBar": true }
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Polish toolkit — optional `slide` expressions
|
|
396
|
+
|
|
397
|
+
The `slide` approach has a **polish layer** for impact-heavy decks (opening, closing, principles,
|
|
398
|
+
credos, milestone callouts). Every field below is **optional** — Sample A above still validates
|
|
399
|
+
without any of them. Reach for them when the deck needs a richer visual register than the
|
|
400
|
+
default chrome. Sample C at the end of this section bundles them in one short deck.
|
|
401
|
+
|
|
402
|
+
### Slide-level fields
|
|
403
|
+
|
|
404
|
+
Add these directly inside `image.slide` next to `title` / `subtitle`:
|
|
405
|
+
|
|
406
|
+
- **`eyebrow`** — small label rendered above the title.
|
|
407
|
+
`{ "label": "Phase 1", "color"?: "primary" | "accent" | "success" | "warning" | "danger" | "info" | "highlight" }`
|
|
408
|
+
- **`titleSize`** — `"default" | "small" | "large" | "hero"`. Use `"hero"` for the opening slide; `"small"` for compact / dense slides.
|
|
409
|
+
- **`subtitleSize`** — `"default" | "lead" | "big"`. `"lead"` for an emphasized one-liner under the title.
|
|
410
|
+
- **`density: "compact"`** — packs more content vertically. Use sparingly on text-heavy slides.
|
|
411
|
+
- **`chips`** — `string[]` of short pill-shaped tags under the title (emoji-friendly):
|
|
412
|
+
`"chips": ["🚀 deploy or die", "⚡ weekly output", "🔁 dogfooding"]`
|
|
413
|
+
|
|
414
|
+
### Theme extensions
|
|
415
|
+
|
|
416
|
+
Inside `slideParams.theme` (alongside `colors` / `fonts`):
|
|
417
|
+
|
|
418
|
+
- **`bgGradient`** — full CSS background string for the page. Stack a radial + linear for depth:
|
|
419
|
+
`"radial-gradient(1200px 700px at 12% -10%, rgba(56,189,248,.16), transparent 60%), linear-gradient(160deg, #0A0F24, #16224D)"`
|
|
420
|
+
- **`titleGradient`** — gradient applied to titles (rendered with `background-clip: text`).
|
|
421
|
+
- **`cardStyle`** — `"glass"` (frosted/translucent cards) or `"solid"` (default). `"glass"` pairs well with `bgGradient`.
|
|
422
|
+
- **`fonts.accent`** — extra font slot the renderer uses for `eyebrow` and `chips`.
|
|
423
|
+
|
|
424
|
+
### New `manifesto` layout
|
|
425
|
+
|
|
426
|
+
For credos / principles / design rules — a numbered list of strong statements. One slide can hold
|
|
427
|
+
4–6 items comfortably.
|
|
428
|
+
|
|
429
|
+
```json
|
|
430
|
+
{
|
|
431
|
+
"layout": "manifesto",
|
|
432
|
+
"eyebrow": { "label": "Culture" },
|
|
433
|
+
"title": "Our operating principles",
|
|
434
|
+
"columns": 2,
|
|
435
|
+
"items": [
|
|
436
|
+
{ "title": "Ship, then talk.", "description": "Discussion follows working code, never replaces it.", "accentColor": "primary" },
|
|
437
|
+
{ "title": "No permission needed.", "description": "Act first, report second.", "accentColor": "warning" },
|
|
438
|
+
{ "title": "Deploy or die.", "description": "Software in production is the only kind that counts.", "accentColor": "primary" },
|
|
439
|
+
{ "title": "A messy demo beats a polished plan.", "description": "Get it out — feedback is the only fuel.", "accentColor": "success" }
|
|
440
|
+
]
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Content tweaks (work inside any `content[]`)
|
|
445
|
+
|
|
446
|
+
- **`bullets` items as objects** — give each bullet an icon: `"ok"` (✓), `"no"` (✗), `"warn"` (⚠).
|
|
447
|
+
`{ "type": "bullets", "items": [{ "text": "Real-time freshness", "icon": "ok" }, { "text": "Hours-stale data", "icon": "no" }] }`
|
|
448
|
+
- **`bullets.size: "lead"`** — bigger bullet text for prominent lists.
|
|
449
|
+
- **`text` `size: "sub"`** + **`dim: true`** — smaller / dimmed body text for footnotes.
|
|
450
|
+
- **`tag` content type** — labeled pill chip in front of body text:
|
|
451
|
+
`{ "type": "tag", "text": "MVP", "color": "warning" }`
|
|
452
|
+
- **`callout` `size: "sub"`** + **`leftBar: true`** — compact + left-bar-emphasized variants.
|
|
453
|
+
- **`comparison` `left/right` `cardless: true`** — drops the card chrome on a side. Useful when the bullets themselves are the visual.
|
|
454
|
+
|
|
455
|
+
### Inline color spans + markdown
|
|
456
|
+
|
|
457
|
+
These work inside any text-rendering field (title, subtitle, quote, bullet item text, `text.value`):
|
|
458
|
+
|
|
459
|
+
- **`**bold**`** / **`*italic*`** — standard markdown emphasis.
|
|
460
|
+
- **`{primary:text}` / `{accent:text}` / `{success:text}` / `{warning:text}` / `{danger:text}` / `{info:text}` / `{highlight:text}`** —
|
|
461
|
+
inline spans tinted in the theme color. Compose with markdown freely:
|
|
462
|
+
`"100 discussions, or {primary:**one shipped prototype.**}"`
|
|
463
|
+
|
|
464
|
+
### `timeline` emphasis flags
|
|
465
|
+
|
|
466
|
+
`timeline.items[i]` accepts:
|
|
467
|
+
|
|
468
|
+
- **`hot: true`** — highlight the active / current step (renders with a glow/halo).
|
|
469
|
+
- **`done: true`** — mark a completed past step.
|
|
470
|
+
- **`color`** — tints the dot and stem; combine with `hot` for the "you are here" effect.
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Sample C — polished `slide` (hero open + manifesto + glass theme)
|
|
475
|
+
|
|
476
|
+
A 4-beat deck demonstrating the polish toolkit bundled together. Use as the template for
|
|
477
|
+
opening / principles / closing slides; mix freely with Sample A's layouts inside the same deck.
|
|
478
|
+
|
|
479
|
+
```json
|
|
480
|
+
{
|
|
481
|
+
"$mulmocast": { "version": "1.1" },
|
|
482
|
+
"lang": "en",
|
|
483
|
+
"title": "Aurora — Operating Principles",
|
|
484
|
+
"description": "A short principles deck — hero opening, manifesto, comparison, and a closing CTA, all on a glass-card dark theme.",
|
|
485
|
+
"speechParams": {
|
|
486
|
+
"speakers": {
|
|
487
|
+
"Presenter": { "provider": "gemini", "voiceId": "Kore", "isDefault": true, "displayName": { "en": "Presenter" } }
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
"slideParams": {
|
|
491
|
+
"theme": {
|
|
492
|
+
"colors": {
|
|
493
|
+
"bg": "0A0F24", "bgCard": "111A3A", "bgCardAlt": "16224D",
|
|
494
|
+
"text": "EEF2FF", "textMuted": "9FB0D8", "textDim": "6F7FA0",
|
|
495
|
+
"primary": "38BDF8", "accent": "818CF8", "success": "34D399",
|
|
496
|
+
"warning": "FBBF24", "danger": "FB7185", "info": "38BDF8", "highlight": "F0ABFC"
|
|
497
|
+
},
|
|
498
|
+
"fonts": { "title": "Georgia", "body": "Helvetica", "mono": "Menlo", "accent": "Outfit" },
|
|
499
|
+
"bgGradient": "radial-gradient(1200px 700px at 12% -10%, rgba(56,189,248,.16), transparent 60%), radial-gradient(1000px 600px at 100% 0%, rgba(129,140,248,.16), transparent 55%), linear-gradient(160deg, #0A0F24, #111A3A 55%, #16224D)",
|
|
500
|
+
"titleGradient": "linear-gradient(100deg, #FFFFFF, #38BDF8 60%, #818CF8)",
|
|
501
|
+
"cardStyle": "glass"
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
"beats": [
|
|
505
|
+
{
|
|
506
|
+
"text": "Welcome to Aurora — four principles that decide how we ship.",
|
|
507
|
+
"image": {
|
|
508
|
+
"type": "slide",
|
|
509
|
+
"slide": {
|
|
510
|
+
"layout": "title",
|
|
511
|
+
"titleSize": "hero",
|
|
512
|
+
"eyebrow": { "label": "Aurora · Operating Principles" },
|
|
513
|
+
"title": "How we **ship**",
|
|
514
|
+
"subtitle": "Four rules. {primary:Everything else is taste.}",
|
|
515
|
+
"subtitleSize": "lead",
|
|
516
|
+
"chips": ["🚀 deploy or die", "🔁 dogfood", "⚡ weekly output", "🤝 peer review"]
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"text": "Our four operating principles.",
|
|
522
|
+
"image": {
|
|
523
|
+
"type": "slide",
|
|
524
|
+
"slide": {
|
|
525
|
+
"layout": "manifesto",
|
|
526
|
+
"eyebrow": { "label": "Culture", "color": "warning" },
|
|
527
|
+
"title": "Operating principles",
|
|
528
|
+
"columns": 2,
|
|
529
|
+
"items": [
|
|
530
|
+
{ "title": "Ship, then talk.", "description": "Discussion follows working code, never replaces it.", "accentColor": "primary" },
|
|
531
|
+
{ "title": "No permission needed.", "description": "Act first, report second.", "accentColor": "warning" },
|
|
532
|
+
{ "title": "Deploy or die.", "description": "Software in production is the only kind that counts.", "accentColor": "primary" },
|
|
533
|
+
{ "title": "A messy demo beats a polished plan.", "description": "Get it out — feedback is the only fuel.", "accentColor": "success" }
|
|
534
|
+
]
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
"text": "What sets us apart from teams that talk more than they ship.",
|
|
540
|
+
"image": {
|
|
541
|
+
"type": "slide",
|
|
542
|
+
"slide": {
|
|
543
|
+
"layout": "comparison",
|
|
544
|
+
"eyebrow": { "label": "Mindset" },
|
|
545
|
+
"title": "Builders vs. Talkers",
|
|
546
|
+
"left": {
|
|
547
|
+
"title": "Builders",
|
|
548
|
+
"accentColor": "success",
|
|
549
|
+
"cardless": true,
|
|
550
|
+
"content": [
|
|
551
|
+
{
|
|
552
|
+
"type": "bullets",
|
|
553
|
+
"size": "lead",
|
|
554
|
+
"items": [
|
|
555
|
+
{ "text": "Goal is big, **next task is small.**", "icon": "ok" },
|
|
556
|
+
{ "text": "MVP first — anything that runs.", "icon": "ok" },
|
|
557
|
+
{ "text": "Show 3–5 users, learn, iterate.", "icon": "ok" }
|
|
558
|
+
]
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
},
|
|
562
|
+
"right": {
|
|
563
|
+
"title": "Talkers",
|
|
564
|
+
"accentColor": "danger",
|
|
565
|
+
"cardless": true,
|
|
566
|
+
"content": [
|
|
567
|
+
{
|
|
568
|
+
"type": "bullets",
|
|
569
|
+
"size": "lead",
|
|
570
|
+
"items": [
|
|
571
|
+
{ "text": "Forever debating scope.", "icon": "no" },
|
|
572
|
+
{ "text": "{danger:Spec docs grow, code doesn't.}", "icon": "no" },
|
|
573
|
+
{ "text": "Six months pass, nobody saw a demo.", "icon": "warn" }
|
|
574
|
+
]
|
|
575
|
+
}
|
|
576
|
+
]
|
|
577
|
+
},
|
|
578
|
+
"callout": {
|
|
579
|
+
"label": "Reminder",
|
|
580
|
+
"text": "\"No time\" usually means *\"not interesting enough.\"* Make time for what you'd ship anyway.",
|
|
581
|
+
"color": "accent"
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"text": "One hundred discussions, or one shipped prototype.",
|
|
588
|
+
"image": {
|
|
589
|
+
"type": "slide",
|
|
590
|
+
"slide": {
|
|
591
|
+
"layout": "bigQuote",
|
|
592
|
+
"eyebrow": { "label": "Let's go" },
|
|
593
|
+
"quote": "100 discussions, or {primary:**one shipped prototype.**}",
|
|
594
|
+
"author": "*Acting is everything.* **deploy or die.**",
|
|
595
|
+
"role": "Welcome to Aurora 🚀"
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
]
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
605
|
+
## Sample B — `html_tailwind` + `animation: true` (animated)
|
|
606
|
+
|
|
607
|
+
```json
|
|
608
|
+
{
|
|
609
|
+
"$mulmocast": { "version": "1.1" },
|
|
610
|
+
"lang": "en",
|
|
611
|
+
"title": "Aurora Analytics — Animated html_tailwind Showcase",
|
|
612
|
+
"description": "An animated investor-facing tour of Aurora Analytics, with count-up metrics and sequential reveals.",
|
|
613
|
+
"speechParams": {
|
|
614
|
+
"speakers": {
|
|
615
|
+
"Presenter": { "provider": "gemini", "voiceId": "Kore", "isDefault": true, "displayName": { "en": "Presenter" } }
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
"beats": [
|
|
619
|
+
{
|
|
620
|
+
"text": "Welcome to Aurora Analytics. Today we will walk through where we are and where we are going.",
|
|
621
|
+
"image": {
|
|
622
|
+
"type": "html_tailwind",
|
|
623
|
+
"animation": true,
|
|
624
|
+
"html": [
|
|
625
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
626
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;overflow:hidden'>",
|
|
627
|
+
" <div id='kicker' style='opacity:0;letter-spacing:.3em;font-size:20px;color:var(--primary);margin-bottom:24px;text-transform:uppercase'>Investor Update · Q2 2026</div>",
|
|
628
|
+
" <h1 id='title' style='opacity:0;font-family:var(--titleFont);font-size:88px;font-weight:800;margin:0'>Aurora Analytics</h1>",
|
|
629
|
+
" <div id='subtitle' style='font-size:34px;color:var(--muted);margin-top:24px;min-height:44px'></div>",
|
|
630
|
+
" <div id='author' style='opacity:0;font-size:22px;color:var(--dim);margin-top:48px'>Mei Tanaka · Head of Product</div>",
|
|
631
|
+
"</div>"
|
|
632
|
+
],
|
|
633
|
+
"script": [
|
|
634
|
+
"const animation = new MulmoAnimation();",
|
|
635
|
+
"animation.animate('#kicker', { opacity:[0,1], translateY:[20,0] }, { start:0, end:0.5, easing:'easeOut' });",
|
|
636
|
+
"animation.animate('#title', { opacity:[0,1], translateY:[40,0] }, { start:0.3, end:1.1, easing:'easeOut' });",
|
|
637
|
+
"animation.typewriter('#subtitle', 'Turning raw events into decisions, in real time', { start:1.1, end:3.2 });",
|
|
638
|
+
"animation.animate('#author', { opacity:[0,1] }, { start:3.2, end:4.0, easing:'easeOut' });"
|
|
639
|
+
]
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
"text": "We believe data should speak the moment it arrives, not the morning after.",
|
|
644
|
+
"image": {
|
|
645
|
+
"type": "html_tailwind",
|
|
646
|
+
"animation": true,
|
|
647
|
+
"html": [
|
|
648
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
649
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:120px;overflow:hidden'>",
|
|
650
|
+
" <div style='font-size:120px;line-height:0.5;color:var(--accent);font-family:var(--titleFont)'>“</div>",
|
|
651
|
+
" <blockquote id='quote' style='font-family:var(--titleFont);font-size:52px;font-weight:600;line-height:1.3;margin:0;min-height:140px'></blockquote>",
|
|
652
|
+
" <div id='cite' style='opacity:0;font-size:24px;color:var(--muted);margin-top:40px'>— Aurora Founding Principle</div>",
|
|
653
|
+
"</div>"
|
|
654
|
+
],
|
|
655
|
+
"script": [
|
|
656
|
+
"const animation = new MulmoAnimation();",
|
|
657
|
+
"animation.typewriter('#quote', 'Data should speak the moment it arrives, not the morning after.', { start:0.2, end:3.0 });",
|
|
658
|
+
"animation.animate('#cite', { opacity:[0,1], translateX:[-20,0] }, { start:3.0, end:3.8, easing:'easeOut' });"
|
|
659
|
+
]
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"text": "The numbers tell the story of the last quarter.",
|
|
664
|
+
"image": {
|
|
665
|
+
"type": "html_tailwind",
|
|
666
|
+
"animation": true,
|
|
667
|
+
"html": [
|
|
668
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
669
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
670
|
+
" <h2 style='font-family:var(--titleFont);font-size:48px;font-weight:700;margin:0'>Quarter in Numbers</h2>",
|
|
671
|
+
" <div style='font-size:24px;color:var(--muted);margin-top:8px'>FY2026 Q1 snapshot</div>",
|
|
672
|
+
" <div style='display:grid;grid-template-columns:repeat(4,1fr);gap:24px;margin-top:56px'>",
|
|
673
|
+
" <div id='card0' style='opacity:0;background:var(--card);border-radius:16px;padding:36px 24px;text-align:center'><div id='stat0' style='font-size:60px;font-weight:800;color:var(--success)'>0</div><div style='color:var(--muted);font-size:20px;margin-top:8px'>Revenue YoY</div></div>",
|
|
674
|
+
" <div id='card1' style='opacity:0;background:var(--card);border-radius:16px;padding:36px 24px;text-align:center'><div id='stat1' style='font-size:60px;font-weight:800;color:var(--primary)'>0</div><div style='color:var(--muted);font-size:20px;margin-top:8px'>Daily Active Orgs</div></div>",
|
|
675
|
+
" <div id='card2' style='opacity:0;background:var(--card);border-radius:16px;padding:36px 24px;text-align:center'><div id='stat2' style='font-size:60px;font-weight:800;color:var(--info)'>0</div><div style='color:var(--muted);font-size:20px;margin-top:8px'>p99 Latency</div></div>",
|
|
676
|
+
" <div id='card3' style='opacity:0;background:var(--card);border-radius:16px;padding:36px 24px;text-align:center'><div id='stat3' style='font-size:60px;font-weight:800;color:var(--accent)'>0</div><div style='color:var(--muted);font-size:20px;margin-top:8px'>Uptime</div></div>",
|
|
677
|
+
" </div>",
|
|
678
|
+
"</div>"
|
|
679
|
+
],
|
|
680
|
+
"script": [
|
|
681
|
+
"const animation = new MulmoAnimation();",
|
|
682
|
+
"animation.stagger('#card{i}', 4, { opacity:[0,1], translateY:[30,0] }, { start:0, stagger:0.15, duration:0.5, easing:'easeOut' });",
|
|
683
|
+
"animation.counter('#stat0', [0,47], { start:0.3, end:1.8, prefix:'+', suffix:'%' });",
|
|
684
|
+
"animation.counter('#stat1', [0,1.9], { start:0.45, end:1.95, suffix:'M', decimals:1 });",
|
|
685
|
+
"animation.counter('#stat2', [0,320], { start:0.6, end:2.1, suffix:'ms' });",
|
|
686
|
+
"animation.counter('#stat3', [0,99.98], { start:0.75, end:2.25, suffix:'%', decimals:2 });"
|
|
687
|
+
]
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
"text": "Our pipeline works in three stages: ingest, transform, and serve.",
|
|
692
|
+
"image": {
|
|
693
|
+
"type": "html_tailwind",
|
|
694
|
+
"animation": true,
|
|
695
|
+
"html": [
|
|
696
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
697
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
698
|
+
" <h2 style='font-family:var(--titleFont);font-size:48px;font-weight:700;margin:0'>How Aurora Works</h2>",
|
|
699
|
+
" <div style='font-size:24px;color:var(--muted);margin-top:8px'>From raw events to live dashboards in three stages</div>",
|
|
700
|
+
" <div style='display:flex;gap:24px;align-items:stretch;margin-top:56px'>",
|
|
701
|
+
" <div id='step0' style='opacity:0;flex:1;background:var(--card);border-top:4px solid var(--primary);border-radius:14px;padding:32px'><div style='font-size:22px;font-weight:800;color:var(--primary)'>1 · Ingest</div><div style='color:var(--muted);font-size:22px;margin-top:14px'>50+ connectors stream events in with exactly-once delivery.</div></div>",
|
|
702
|
+
" <div id='step1' style='opacity:0;flex:1;background:var(--card);border-top:4px solid var(--accent);border-radius:14px;padding:32px'><div style='font-size:22px;font-weight:800;color:var(--accent)'>2 · Transform</div><div style='color:var(--muted);font-size:22px;margin-top:14px'>Streaming SQL enriches and aggregates with sub-second latency.</div></div>",
|
|
703
|
+
" <div id='step2' style='opacity:0;flex:1;background:var(--card);border-top:4px solid var(--success);border-radius:14px;padding:32px'><div style='font-size:22px;font-weight:800;color:var(--success)'>3 · Serve</div><div style='color:var(--muted);font-size:22px;margin-top:14px'>Results push to dashboards, alerts, and reverse-ETL.</div></div>",
|
|
704
|
+
" </div>",
|
|
705
|
+
"</div>"
|
|
706
|
+
],
|
|
707
|
+
"script": [
|
|
708
|
+
"const animation = new MulmoAnimation();",
|
|
709
|
+
"animation.stagger('#step{i}', 3, { opacity:[0,1], translateY:[40,0], scale:[0.96,1] }, { start:0, stagger:0.4, duration:0.6, easing:'easeOut' });"
|
|
710
|
+
]
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"text": "Compare the old batch world with the Aurora way.",
|
|
715
|
+
"image": {
|
|
716
|
+
"type": "html_tailwind",
|
|
717
|
+
"animation": true,
|
|
718
|
+
"html": [
|
|
719
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
720
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
721
|
+
" <h2 style='font-family:var(--titleFont);font-size:48px;font-weight:700;margin:0;text-align:center'>Batch vs. Streaming</h2>",
|
|
722
|
+
" <div style='display:flex;gap:32px;margin-top:48px'>",
|
|
723
|
+
" <div id='before' style='opacity:0;flex:1;background:var(--card);border-radius:16px;padding:40px;border-left:6px solid var(--danger)'><div style='font-size:26px;font-weight:800;color:var(--danger)'>Nightly Batch</div><div style='font-size:22px;color:var(--muted);margin-top:16px'>Data is hours stale. Failures surface the next morning.</div><div style='font-size:64px;font-weight:800;color:var(--danger);margin-top:24px'>~8h <span style='font-size:22px;color:var(--muted)'>lag</span></div></div>",
|
|
724
|
+
" <div id='after' style='opacity:0;flex:1;background:var(--card);border-radius:16px;padding:40px;border-left:6px solid var(--success)'><div style='font-size:26px;font-weight:800;color:var(--success)'>Aurora Streaming</div><div style='font-size:22px;color:var(--muted);margin-top:16px'>Always-fresh data. Alerts the moment something breaks.</div><div style='font-size:64px;font-weight:800;color:var(--success);margin-top:24px'><1s <span style='font-size:22px;color:var(--muted)'>lag</span></div></div>",
|
|
725
|
+
" </div>",
|
|
726
|
+
"</div>"
|
|
727
|
+
],
|
|
728
|
+
"script": [
|
|
729
|
+
"const animation = new MulmoAnimation();",
|
|
730
|
+
"animation.animate('#before', { opacity:[0,1], translateX:[-80,0] }, { start:0, end:0.7, easing:'easeOut' });",
|
|
731
|
+
"animation.animate('#after', { opacity:[0,1], translateX:[80,0] }, { start:0.6, end:1.3, easing:'easeOut' });"
|
|
732
|
+
]
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
"text": "Here is a taste of the developer experience: define a live view in plain SQL.",
|
|
737
|
+
"image": {
|
|
738
|
+
"type": "html_tailwind",
|
|
739
|
+
"animation": true,
|
|
740
|
+
"html": [
|
|
741
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
742
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
743
|
+
" <h2 id='codeTitle' style='opacity:0;font-family:var(--titleFont);font-size:44px;font-weight:700;margin:0'>Define a live view in SQL</h2>",
|
|
744
|
+
" <pre style='background:#0B1220;border:1px solid var(--cardAlt);border-radius:14px;padding:32px;margin-top:32px;font-size:26px;line-height:1.5;color:var(--info);font-family:Menlo,Consolas,monospace;min-height:280px'><code id='code'></code></pre>",
|
|
745
|
+
"</div>"
|
|
746
|
+
],
|
|
747
|
+
"script": [
|
|
748
|
+
"const animation = new MulmoAnimation();",
|
|
749
|
+
"animation.animate('#codeTitle', { opacity:[0,1], translateY:[20,0] }, { start:0, end:0.5, easing:'easeOut' });",
|
|
750
|
+
"animation.codeReveal('#code', ['CREATE LIVE VIEW active_orgs AS', 'SELECT', ' org_id,', ' count(*) AS events,', ' max(ts) AS last_seen', 'FROM stream.events', \"WHERE ts > now() - INTERVAL '5 minutes'\", 'GROUP BY org_id;'], { start:0.5, end:3.5 });"
|
|
751
|
+
]
|
|
752
|
+
}
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
"text": "Our roadmap takes us from launch to an open ecosystem.",
|
|
756
|
+
"image": {
|
|
757
|
+
"type": "html_tailwind",
|
|
758
|
+
"animation": true,
|
|
759
|
+
"html": [
|
|
760
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
761
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
762
|
+
" <h2 style='font-family:var(--titleFont);font-size:48px;font-weight:700;margin:0'>Where We Are Headed</h2>",
|
|
763
|
+
" <div style='display:flex;gap:20px;margin-top:56px'>",
|
|
764
|
+
" <div id='mile0' style='opacity:0;flex:1;text-align:center'><div style='width:24px;height:24px;border-radius:50%;background:var(--primary);margin:0 auto 16px'></div><div style='font-size:20px;color:var(--dim)'>Q1 2026</div><div style='font-size:26px;font-weight:700;margin-top:6px'>GA Launch</div></div>",
|
|
765
|
+
" <div id='mile1' style='opacity:0;flex:1;text-align:center'><div style='width:24px;height:24px;border-radius:50%;background:var(--accent);margin:0 auto 16px'></div><div style='font-size:20px;color:var(--dim)'>Q2 2026</div><div style='font-size:26px;font-weight:700;margin-top:6px'>Live Views 2.0</div></div>",
|
|
766
|
+
" <div id='mile2' style='opacity:0;flex:1;text-align:center'><div style='width:24px;height:24px;border-radius:50%;background:var(--info);margin:0 auto 16px'></div><div style='font-size:20px;color:var(--dim)'>Q3 2026</div><div style='font-size:26px;font-weight:700;margin-top:6px'>Governance Suite</div></div>",
|
|
767
|
+
" <div id='mile3' style='opacity:0;flex:1;text-align:center'><div style='width:24px;height:24px;border-radius:50%;background:var(--success);margin:0 auto 16px'></div><div style='font-size:20px;color:var(--dim)'>Q4 2026</div><div style='font-size:26px;font-weight:700;margin-top:6px'>Marketplace</div></div>",
|
|
768
|
+
" </div>",
|
|
769
|
+
"</div>"
|
|
770
|
+
],
|
|
771
|
+
"script": [
|
|
772
|
+
"const animation = new MulmoAnimation();",
|
|
773
|
+
"animation.stagger('#mile{i}', 4, { opacity:[0,1], translateY:[30,0] }, { start:0, stagger:0.35, duration:0.5, easing:'easeOut' });"
|
|
774
|
+
]
|
|
775
|
+
}
|
|
776
|
+
},
|
|
777
|
+
{
|
|
778
|
+
"text": "Adoption flows from sign-up to active production teams.",
|
|
779
|
+
"image": {
|
|
780
|
+
"type": "html_tailwind",
|
|
781
|
+
"animation": true,
|
|
782
|
+
"html": [
|
|
783
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
784
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;padding:80px;overflow:hidden'>",
|
|
785
|
+
" <h2 style='font-family:var(--titleFont);font-size:48px;font-weight:700;margin:0'>Adoption Funnel</h2>",
|
|
786
|
+
" <div style='margin-top:48px;display:flex;flex-direction:column;gap:14px'>",
|
|
787
|
+
" <div style='display:flex;align-items:center;gap:20px'><div style='width:200px;color:var(--muted);font-size:22px'>Sign-ups</div><div id='bar0' style='width:0%;height:46px;background:var(--primary);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:16px;font-weight:700;color:#0B1220'>32K</div></div>",
|
|
788
|
+
" <div style='display:flex;align-items:center;gap:20px'><div style='width:200px;color:var(--muted);font-size:22px'>Connected</div><div id='bar1' style='width:0%;height:46px;background:var(--accent);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:16px;font-weight:700;color:#0B1220'>9.1K</div></div>",
|
|
789
|
+
" <div style='display:flex;align-items:center;gap:20px'><div style='width:200px;color:var(--muted);font-size:22px'>In Production</div><div id='bar2' style='width:0%;height:46px;background:var(--info);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:16px;font-weight:700;color:#0B1220'>2.4K</div></div>",
|
|
790
|
+
" <div style='display:flex;align-items:center;gap:20px'><div style='width:200px;color:var(--muted);font-size:22px'>Paid Teams</div><div id='bar3' style='width:0%;height:46px;background:var(--warning);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:16px;font-weight:700;color:#0B1220'>610</div></div>",
|
|
791
|
+
" <div style='display:flex;align-items:center;gap:20px'><div style='width:200px;color:var(--muted);font-size:22px'>Champions</div><div id='bar4' style='width:0%;height:46px;background:var(--success);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:16px;font-weight:700;color:#0B1220'>95</div></div>",
|
|
792
|
+
" </div>",
|
|
793
|
+
"</div>"
|
|
794
|
+
],
|
|
795
|
+
"script": [
|
|
796
|
+
"const animation = new MulmoAnimation();",
|
|
797
|
+
"animation.animate('#bar0', { width:[0,92,'%'] }, { start:0.0, end:0.8, easing:'easeOut' });",
|
|
798
|
+
"animation.animate('#bar1', { width:[0,70,'%'] }, { start:0.2, end:1.0, easing:'easeOut' });",
|
|
799
|
+
"animation.animate('#bar2', { width:[0,48,'%'] }, { start:0.4, end:1.2, easing:'easeOut' });",
|
|
800
|
+
"animation.animate('#bar3', { width:[0,28,'%'] }, { start:0.6, end:1.4, easing:'easeOut' });",
|
|
801
|
+
"animation.animate('#bar4', { width:[0,14,'%'] }, { start:0.8, end:1.6, easing:'easeOut' });"
|
|
802
|
+
]
|
|
803
|
+
}
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
"text": "Aurora makes your data speak the moment it arrives. Let's build it together.",
|
|
807
|
+
"image": {
|
|
808
|
+
"type": "html_tailwind",
|
|
809
|
+
"animation": true,
|
|
810
|
+
"html": [
|
|
811
|
+
"<style>:root{--bg:#0F172A;--card:#1E293B;--cardAlt:#334155;--text:#F8FAFC;--muted:#CBD5E1;--dim:#64748B;--primary:#38BDF8;--accent:#A78BFA;--success:#34D399;--warning:#FBBF24;--danger:#F87171;--info:#22D3EE;--highlight:#F472B6;--titleFont:Georgia,serif;--bodyFont:Helvetica,Arial,sans-serif}</style>",
|
|
812
|
+
"<div style='position:absolute;inset:0;background:var(--bg);color:var(--text);font-family:var(--bodyFont);display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;overflow:hidden'>",
|
|
813
|
+
" <h1 id='closeTitle' style='opacity:0;font-family:var(--titleFont);font-size:72px;font-weight:800;margin:0'>Data that speaks, instantly.</h1>",
|
|
814
|
+
" <div id='cta' style='opacity:0;margin-top:48px;background:var(--primary);color:#0B1220;font-size:28px;font-weight:800;padding:20px 48px;border-radius:999px'>Start free at aurora.dev</div>",
|
|
815
|
+
" <div style='margin-top:32px;display:flex;align-items:center;gap:12px;color:var(--success);font-size:22px'><span id='pulse' style='width:14px;height:14px;border-radius:50%;background:var(--success);display:inline-block'></span>Live demo running now</div>",
|
|
816
|
+
"</div>"
|
|
817
|
+
],
|
|
818
|
+
"script": [
|
|
819
|
+
"const animation = new MulmoAnimation();",
|
|
820
|
+
"animation.animate('#closeTitle', { opacity:[0,1], scale:[0.9,1] }, { start:0, end:0.8, easing:'easeOut' });",
|
|
821
|
+
"animation.animate('#cta', { opacity:[0,1], translateY:[20,0] }, { start:0.8, end:1.4, easing:'easeOut' });",
|
|
822
|
+
"animation.blink('#pulse', { interval:0.6 });"
|
|
823
|
+
]
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
]
|
|
827
|
+
}
|
|
828
|
+
```
|