Confetti

Deterministic confetti burst for Remotion — seeded particles with gravity, spin, and flutter

Installation

$ pnpm dlx shadcn@latest add @remocn/confetti

Usage

Confetti is an overlay — render it on top of any scene and set startFrame to the frame the burst should fire:

// src/Root.tsx
import { Composition } from "remotion";
import { Confetti } from "@/components/remocn/confetti";

const ConfettiScene = () => (
  <Confetti
    startFrame={0}
    originX={0.5}
    originY={0.5}
    particleCount={160}
    seed={1}
  />
);

export const RemotionRoot = () => (
  <Composition
    id="Confetti"
    component={ConfettiScene}
    durationInFrames={90}
    fps={30}
    width={1280}
    height={720}
  />
);

Every piece is generated from a seeded PRNG, so a given seed renders an identical burst on every machine — required for deterministic Remotion output and headless MP4 export. Particles launch radially from the origin, fall under gravity, and flutter as they spin.

Props

PropTypeDefaultDescription
particleCount
number140Number of confetti pieces
colors
string[]6 brand colorsPalette each piece is drawn from
originX
number0.5Burst origin X as a 0..1 fraction of the canvas
originY
number0.5Burst origin Y as a 0..1 fraction of the canvas
startFrame
number0Frame the burst fires on
lifetime
number90How long the burst lives, in frames
power
number17Initial launch speed (px/frame at the 720px reference height)
gravity
number0.45Downward acceleration (px/frame² at the 720px reference height)
size
number13Base piece size in reference px
seed
number1PRNG seed — the same seed renders an identical burst every time

Notes

  • Deterministic: Particles come from a mulberry32 seeded PRNG, never Math.random(), so renders are frame-stable and reproducible.
  • Overlay: The component is a transparent, pointer-events: none AbsoluteFill — layer it over any composition.
  • Used by: x-followers-overview fires this on the follower-count reveal.