Repository navigation
Releases: 0xS4N4TG/kinetograph
Releases · 0xS4N4TG/kinetograph
Release list
0.2.0
Kinetograph 0.2.0 is on npm:
npm i kinetograph@0.2.0The full list is also in CHANGELOG.md and on the site at /docs/changelog/.
Added
kinetograph renderandstillprint which renderer draws (renderer: Skia GPU (Metal),Skia CPU (no GPU found)orSkia CPU (KINETOGRAPH_SKIA_CPU=1)), anddoctorwith no entry lists it too. The addon'sRendererhas abackend()method for it.libx264andlibx265in the npm packages. The platform packages (@kinetographdev/native-<platform>) now carry a separate GPLffmpegprogram inbin/(x264, x265 and libvpx; the addon itself still links only an LGPL ffmpeg), and the addon runs it as a child process for the encoders it lacks. H.264 now defaults to libx264 where there is no hardware encoder, ahead of libopenh264.KINETOGRAPH_FFMPEGpoints at another ffmpeg. The addon's ffmpeg also gained libvpx (VP8, VP9) on macOS and Linux. See/docs/ffmpeg-license/.<Video datamosh>: smear one shot into the next, using the video's own motion vectors. See the Datamosh guide on the site at/docs/guides/datamosh/. (#5)- GSAP support, including the free plugins (SplitText, MotionPath, DrawSVG, TextPlugin, Flip). Build a paused timeline and seek it to each frame. See
/docs/compat/#gsap. (#7) - HTML text outlines:
-webkit-text-strokeandpaint-order: stroke fill, drawn with Chrome's miter joins, and working withtext-shadow, transforms, opacity andbackground-clip: text. (#8) - WebGL: points (
gl_PointSize, up to 511 px), instancing (divisor 1),blitFramebuffer,texSubImage2Dinto framebuffer textures andgl_VertexID. p5.brush's standalone build draws as it does in Chrome, and all 14 HyperFrames WebGL shader transitions draw. (#9) - Studio: a "Copy for agent" button that copies a change request for a coding agent, and a timeline that shows it is loading instead of staying empty. (#6)
- Studio: readable layer names (component, text, and the file and line each came from); a simpler timeline with one row per Sequence, repeated components folded and a "Show details" toggle; and an Agent tab that chats with your coding agent over ACP about a layer or area you select in the preview. The studio now needs the per-launch
?token=link it prints, and the agent is off on non-loopback hosts unless--allow-remote-agentis passed. - HyperFrames projects render as they are:
kinetograph render|still|doctor|studio <index.html|dir>, with nested compositions, GSAP timelines seeked as HyperFrames seeks them,data-hidden,data-color-grading, speed ramps and volume lanes, HyperFrames' 18 embedded fonts, andkinetograph fetch-depsto cache the CDN scripts, data and media a page uses (a render never touches the network). See/docs/compat/#hyperframes-projects. (#13) kinetograph fetch-depsdownloads the remote pictures of a HyperFrames page (<img>,srcset,<video poster>, SVG<image>, CSSurl()) into the cache, under the same rules as scripts and media: https only, the default CDNs plus--allow-host, no redirect to another host, a hash checked on every read, 50 MB each. A render reads them from the cache, and a picture that is not cached is reported with the exactfetch-depscommand. See/docs/compat/#hyperframes-projects.- GSAP tweens that play by themselves (
gsap.toin auseEffect, with no paused timeline): GSAP's root clock follows the frame, a frame is the same alone and in sequence, and a jump to a later frame renders the frames it skips. Flip works on a paused timeline. See/docs/compat/#gsap. asynceffects and<HtmlInCanvas>programs: anasynccreateEffectapply,onInitoronPaintholds the frame until its promise settles, and a rejection is reported for the frame.- WebGPU on a canvas: buffers, WGSL shaders, render pipelines and draws, replayed on the engine's own GPU device, so HyperFrames' shader backgrounds (aurora, blob, ripples, swirl) draw. Textures, samplers and compute are reported, not drawn. (#15)
- WebGPU compute: compute pipelines (explicit layouts and
layout: 'auto'), compute passes anddispatchWorkgroups, storage buffers and storage textures (rgba32float,rgba16float,rgba8unorm,r32floatand the rest of WebGPU's table), 32-bit float textures sampled asunfilterable-float, andclearBuffer, replayed in submit order with the render passes.device.limitsandadapter.limitsare the engine device's own; every dispatch, binding and format is checked on the page side and again before the frame is drawn, and the work a frame holds is capped. The steps that made state a page carries from frame to frame are replayed from their history, and a frame that reads state an earlier frame made is reported. The 13shaders.iife.jsblocks that use textures and compute (chrome-orb,frost,goo,heatmap,hologram,holographic,light-edge,liquid-metal,nebula,obsidian,plastic,thin-film,water) draw with nothing reported. - Plugins for libraries that run their own clock or randomness:
@kinetographdev/gsap,@kinetographdev/p5-brush,@kinetographdev/animeand@kinetographdev/motion. Each is a thin wrapper that seeks the library to the frame; the libraries are peer dependencies, unchanged. See/docs/libraries/. - Library support: Recharts, d3-selection, anime.js, Motion's
animate(), Paper.js and Bklit UI now render, and Rapier draws its first frame. The DOM gainedNodeList/HTMLCollection,compareDocumentPosition,document.defaultView,customElementsand the*AttributeNSmethods. (#12)
Fixed
- Canvas 2D gradients blend their stops without premultiplying alpha, as Chrome does: a gradient from transparent green to opaque red keeps its green in the middle. CSS gradients still blend premultiplied. HyperFrames'
transitions-destructionnow draws as in Chrome. kinetograph doctorcounted frames twice in its summary ("nothing unsupported in 0 of 10 frames; with unsupported content: 10"). It now says "10 of 10 frames (100.0%) have unsupported content; 0 are clean", or "all N frames are clean".- SVG files draw as pictures:
<Img src={staticFile('shape.svg')}>,<img src>,background-image: url(x.svg)andimagelayers. The picture is sized from the file'swidth,heightandviewBox(300 x 150 with none) and painted at the size it is drawn at, so it is sharp at any scale. Text inside such a picture is left out and warned about, as a browser sets it in none of the page's fonts. A file that cannot be read is reported bydoctor. (#30) - Scene colours take any CSS colour, not only hex: the 148 names (
white),rgb(),hsl(),hwb(),lab(),oklch(),color(), with commas or spaces.background: 'white'was rejected withcolour "white" must start with '#'. (#30) - An element that starts at
width: 0(or any zero length) and is animated wider by a script, such as anime.jswidth: [0, 100], now draws.element.stylegave0back where a browser gives0px, so anime.js wrote a unitless55.5that CSS drops. Zero lengths now read back as0px. <TransitionSeries>and<Series>accept children wrapped in aReact.Fragment, nested ones too, so a.map()can emit a Transition and Sequence pair as Remotion allows. (#31)- Machines with a Vulkan 1.4 driver no longer fall back to the CPU. (#1, #2)
- A frame renders the same when the document was edited between frames: an inline box now sits on its baseline in an edited document as it does in a fresh one. (#3)
- SVG
<text>inherits font family, size, weight and style from the HTML around the<svg>. (#4) - Text with a glow, shadow, opacity or rotation keeps its descenders and the edge of its glow instead of being cut at the line box. (#8)
getComputedStyleandgetBoundingClientRecton an element inside anAbsoluteFillthat has a background no longer fail with "no element at path". (#7)- Page CSS styles SVG content: class, descendant and attribute selectors reach
fill,stroke, fonts,text-anchor,paint-orderand the other presentation properties. (#14) - SVG
fill,strokeandstop-colorofvar(),oklch(),oklab(),color-mix()orrgb(r g b / a)were drawn black; they now draw in their colour, and a colour that cannot be read is reported. (#14) - Page CSS gives SVG shapes
transform(withrotate,scale,translateandtransform-origin),filter: url(#id),clip-path: url(#id)andmask: url(#id), with shapes a script adds and rules inside@mediastyled through the same cascade. HyperFrames no longer re-applies such rules in TypeScript. - An MP4 whose moov atom is at the end decodes its audio. (#14)
document.getElementByIdandquerySelectorfind nodes appended to<body>outside the React root, and SVG<text>measures its real size ingetBBoxandgetComputedTextLength. (#12)- `transform-...