Using Motion Canvas on GitHub Actions
   sprout 
        ⋄ posted almost 2 years ago  ⋄ last updated almost 2 years ago  ⋄
        3 min read 
 Start by creating a new node project at the root of your repo and install some dependencies:
npm init @motion-canvas@latest -- --name motion-canvas-github-actions --path ./motion-canvas-github-actions --language tscd animationsnpm inpm i -S @motion-canvas/playernpm run serveCreate your animation:
import { makeScene2D, Circle } from "@motion-canvas/2d";import { createRef, all } from "@motion-canvas/core";
export default makeScene2D(function* (view) {  const myCircle = createRef<Circle>();
  view.add(    <Circle ref={myCircle} x={-300} width={140} height={140} fill="#e13238" />  );
  yield* all(    myCircle().position.x(300, 1).to(-300, 1),    myCircle().fill("#e6a700", 1).to("#e13238", 1)  );});Update your vite config in the animations folder:
import { defineConfig } from "vite";import motionCanvas from "@motion-canvas/vite-plugin";
export default defineConfig({  plugins: [motionCanvas()],  build: {    rollupOptions: {      input: {        main: "index.html",      },      output: {        dir: "dist/",        entryFileNames: "[name].js",      },    },  },});Add a main script to load the player, and a script to add the base URL for the GitHub Pages subdirectory structure:
import '@motion-canvas/core';import '@motion-canvas/player';
// Run this function so that the player can be used with relative paths, such as// a github pages deployment. Since this is a separate build file, vite doesn't// know how to add the base url to the player's src attribute.(function prependBase() {  // If there's no BASE_URL, then there's nothing to do  const base = import.meta.env.BASE_URL;  if (!base) {    return;  }  document.querySelectorAll('motion-canvas-player').forEach(player => {    let url = player.getAttribute('src');    // URL is absolute    if (url?.startsWith('/')) {      // Copy everything after the '/'      url = base + url.slice(1);      // Create a new player      const newElement = document.createElement('motion-canvas-player');      // Set the same attributes      newElement.setAttribute('auto', player.getAttribute('auto') ?? 'true');      newElement.setAttribute('src', url);      // Replace the old player      player.replaceWith(newElement);    }  });})();Add a root-level index.html:
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        motion-canvas-player {            width: 100%;            height: 100%;            display: block;        }    </style></head><body>    <motion-canvas-player src="/project.js"></motion-canvas-player>    <script type="module" src="web/player.ts"></script></body></html>Build the site:
npm run buildNote that you cannot open the generated html file and have it work; you will have to serve it:
npx light-server -s dist -p 8000You should see the animation working at http://localhost:8000. Now to build it in GitHub actions, add a workflow file:
name: Deploy
on:  push:    branches:      - main
permissions:  contents: read  pages: write  id-token: write
# Allow one concurrent deploymentconcurrency:  group: "pages"  cancel-in-progress: true
jobs:  build:    name: Deploy    runs-on: ubuntu-latest
    steps:      - name: Checkout repo        uses: actions/checkout@v3
      - name: Setup Node        uses: actions/setup-node@v3
      - name: Install dependencies        run: npm ci
      - name: Install animation dependencies        run: npm ci        working-directory: animations
      - name: Build project        run: npm run build -- --base=/${{ github.event.repository.name }}/
      - name: Setup Pages        uses: actions/configure-pages@v3
      - name: Upload artifact        uses: actions/upload-pages-artifact@v1        with:          path: "./dist"
      - name: Deploy to GitHub Pages        id: deployment        uses: actions/deploy-pages@v1And be sure to configure GitHub pages to deploy from GitHub Actions.