Skip to content

feat(remotion): add yellow mascot character with all animation variants#1193

Merged
senamakel merged 1 commit intotinyhumansai:mainfrom
NeilDesign1:add-yellow-mascot
May 4, 2026
Merged

feat(remotion): add yellow mascot character with all animation variants#1193
senamakel merged 1 commit intotinyhumansai:mainfrom
NeilDesign1:add-yellow-mascot

Conversation

@NeilDesign1
Copy link
Copy Markdown
Contributor

@NeilDesign1 NeilDesign1 commented May 4, 2026

Summary

  • Adds the yellow mascot SVG character to remotion/src/Mascot/
  • 9 Remotion compositions alongside the existing Ghosty variants:
    • yellow-MascotWave2 — waving arm loop
    • yellow-MascotIdle — steady idle bob
    • yellow-MascotRecording — pulsing red dot face
    • yellow-MascotLoading — spinning loading ring face
    • yellow-MascotPickup — bouncy squash-and-stretch animation
    • yellow-MascotTalking — lip-sync mouth animation
    • yellow-MascotThinking — arm-raise + head-tilt thinking pose
    • yellow-MascotSleep — eye-droop + floating Zzz
    • yellow-MascotGreeting — arm-raise hi-wave greeting

Test plan

  • pnpm render yellow-MascotIdle
  • pnpm render yellow-MascotPickup
  • pnpm render yellow-MascotTalking
  • All other yellow-Mascot* compositions render without clipping

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Introduced an animated mascot system with multiple character states and animations, including waving, idle, talking, thinking, sleeping, greeting, and pickup gestures.
    • Added support for different mascot face expressions for recording and loading states.
    • Implemented visual effects including blinking, mouth movement, and interactive arm animations.

Adds the yellow mascot SVG character alongside the existing Ghosty, with
the following Remotion compositions:

- yellow-MascotWave2    — waving arm loop
- yellow-MascotIdle     — steady idle bob
- yellow-MascotRecording — pulsing red dot face
- yellow-MascotLoading  — spinning loading ring face
- yellow-MascotPickup   — bouncy squash-and-stretch animation
- yellow-MascotTalking  — lip-sync mouth animation
- yellow-MascotThinking — arm-raise + head-tilt thinking pose
- yellow-MascotSleep    — eye-droop + floating Zzz
- yellow-MascotGreeting — arm-raise hi-wave greeting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@NeilDesign1 NeilDesign1 requested a review from a team May 4, 2026 17:27
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 4, 2026

📝 Walkthrough

Walkthrough

This PR introduces a new Yellow Mascot animation system for Remotion. A core MascotCharacter SVG component implements configurable animation states including arm poses (wave, steady sway, greeting raise), facial expressions (talking with tongue, thinking with gaze shift, blinking/sleeping with floating "Z" text), and time-based transforms. Nine variant wrapper components specialize the base component with fixed animation configurations. The system is integrated into Root.tsx as nine new Remotion compositions with per-variant defaults.

Changes

Yellow Mascot Animation System

Layer / File(s) Summary
Schema & Props Definition
remotion/src/Mascot/lib/MascotCharacter.tsx (lines 1–20)
mascotSchema defines configurable animation states: arm (wave/steady/none), face (normal/recording/loading), and booleans for talking, sleeping, thinking, greeting. Inferred MascotProps type.
Core Animation Logic
remotion/src/Mascot/lib/MascotCharacter.tsx (lines 28–190)
Time-based transforms computed from frame count: body bob, head-dot drift/squash, arm motions (idle wave, sway, greeting raise with hi-wave), blink/sleep eye behavior, talking mouth with tongue opacity, thinking pose (arm raise, head tilt, eye gaze shift), and sleep-state "Z" floating.
SVG Rendering & Face Modes
remotion/src/Mascot/lib/MascotCharacter.tsx (lines 191–537)
SVG structure with ID-scoped filters/gradients using idPrefix parameter. Conditional rendering of arm states, facial features with animation-specific adjustments, and face variant components (RecordingFace, LoadingFace) at scaled/translated positions.
Library Re-Export
remotion/src/Mascot/lib/index.ts
Re-exports MascotCharacter, mascotSchema, and MascotProps for public consumption.
Variant Wrappers
remotion/src/Mascot/Mascot.tsx, remotion/src/Mascot/MascotGreeting.tsx, remotion/src/Mascot/yellow-Mascot*.tsx
Nine variant components wrapping MascotCharacter: each extends mascotSchema (or aliases it) to add variant-specific fields (e.g., greeting, sleeping, thinking), and renders MascotCharacter with fixed animation props and a unique idPrefix. YellowMascotPickup additionally computes bounce/squash transforms.
Composition Integration
remotion/src/Root.tsx
Imports all nine variant components. Introduces GHOSTY_DEFAULTS (splitting from prior shared defaults) and adds YELLOW_DEFAULTS for Yellow Mascot variants. Registers nine new <Composition> entries in RemotionRoot with per-variant overrides for arm, face, talking, thinking, sleeping, and greeting, each using its corresponding variant schema.

Sequence Diagram

sequenceDiagram
    participant Root as Root.tsx
    participant Comp as Remotion<br/>Composition
    participant Variant as YellowMascot*<br/>Wrapper
    participant Base as MascotCharacter

    Root->>Comp: Register composition<br/>(schema + defaultProps)
    Comp->>Variant: Render variant component<br/>(props)
    activate Variant
    Variant->>Base: Render MascotCharacter<br/>(arm, face, talking, thinking,<br/>sleeping, greeting,<br/>idPrefix)
    activate Base
    Base->>Base: useCurrentFrame()<br/>useVideoConfig()
    Base->>Base: Compute time-based<br/>transforms & animations<br/>(bob, squash, arm pose,<br/>face state, eye gaze)
    Base->>Base: Render SVG<br/>with filters, gradients,<br/>and animated elements
    deactivate Base
    deactivate Variant
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~40 minutes

Poem

🐰 A mascot springs to life, with arms that wave and sway,
Its eyes may blink or drift, as thinking fills the day,
Nine variants now dance, each pose a special way,
From greeting deep to sleep with Z's that drift away! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding a yellow mascot character with multiple animation variants. It is specific, clear, and directly reflects the primary objective of the pull request.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@remotion/src/Mascot/lib/MascotCharacter.tsx`:
- Around line 82-85: The blink currently uses a hardcoded frame-count duration
(inBlink uses "< 6") so blinking is too short at high FPS; change the duration
to be time-based by computing a blinkDurationFrames derived from fps (e.g.,
Math.round(fps * desiredSeconds) such as 0.25s) and replace the magic "6" with
that variable; update related variables blinkPeriod, blinkOffset, inBlink, and
blinkScale to use blinkDurationFrames so blink timing scales correctly with fps.

In `@remotion/src/Mascot/yellow-MascotLoading.tsx`:
- Around line 8-15: The component YellowMascotLoading currently uses a redundant
fallback arm={props.arm ?? "none"} which is dead code because
yellowMascotLoadingSchema inherits mascotSchema that already sets
arm.default("wave"); remove the fallback and pass the prop directly
(arm={props.arm}) so the schema-provided default ("wave") is respected; also
mirror the same change in yellow-MascotRecording.tsx if present to keep behavior
consistent.

In `@remotion/src/Mascot/yellow-MascotPickup.tsx`:
- Line 1: The file currently does a runtime import "import React from 'react';"
but React is only used as a type (React.FC), so change the import to a type-only
import and update any React.FC usage to FC: replace the runtime import with
"import type { FC } from 'react'" and update the component's type signature
(references to React.FC in yellow-MascotPickup.tsx) to use FC so the import is
purely type-only.

In `@remotion/src/Mascot/yellow-MascotRecording.tsx`:
- Around line 8-15: The recording variant currently falls back to "none" with
arm={props.arm ?? "none"}, but because yellowMascotRecordingSchema inherits
mascotSchema (which sets arm default to "wave"), that fallback never triggers
and causes an unintended waving arm; update the YellowMascotRecording component
to hardcode arm="none" when rendering MascotCharacter (replace arm={props.arm ??
"none"} with a fixed arm="none") to match sibling variants, or if callers must
be able to override the arm, change yellowMascotRecordingSchema to
extend/override mascotSchema so its arm default is explicitly "none" and keep
the prop spread.

In `@remotion/src/Mascot/yellow-MascotSleep.tsx`:
- Line 1: Replace the default React import with a type-only import: remove
`import React from "react";` and add `import type { FC } from "react";` so the
file uses the codebase convention for type-only imports (e.g., for any
`FC`/`React.FC` component types in yellow-MascotSleep.tsx); update component
type annotations to use `FC` if needed.

In `@remotion/src/Mascot/yellow-MascotThinking.tsx`:
- Line 1: The file currently does a value import "import React from 'react'"
though React is used only as a type (React.FC) — change this to a type-only
import: replace the default import with "import type { FC } from 'react'" and
update component annotations to use FC (or React.FC -> FC) if necessary; ensure
there are no runtime React references left so the import remains type-only.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 494e281e-6e9f-4449-8546-3c9350a94f4f

📥 Commits

Reviewing files that changed from the base of the PR and between 995669f and 63f8589.

📒 Files selected for processing (12)
  • remotion/src/Mascot/Mascot.tsx
  • remotion/src/Mascot/MascotGreeting.tsx
  • remotion/src/Mascot/lib/MascotCharacter.tsx
  • remotion/src/Mascot/lib/index.ts
  • remotion/src/Mascot/yellow-MascotIdle.tsx
  • remotion/src/Mascot/yellow-MascotLoading.tsx
  • remotion/src/Mascot/yellow-MascotPickup.tsx
  • remotion/src/Mascot/yellow-MascotRecording.tsx
  • remotion/src/Mascot/yellow-MascotSleep.tsx
  • remotion/src/Mascot/yellow-MascotTalking.tsx
  • remotion/src/Mascot/yellow-MascotThinking.tsx
  • remotion/src/Root.tsx

Comment on lines +82 to +85
const blinkPeriod = Math.round(fps * 2.6);
const blinkOffset = Math.round(blinkPeriod / 2);
const inBlink = (frame + blinkOffset) % blinkPeriod < 6;
const blinkScale = inBlink ? 0.12 : 1;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Blink duration is frame-count based, not time-based

blinkPeriod correctly scales with FPS (fps * 2.6), but the blink duration is hardcoded at < 6 frames. At 60 fps this is only 100 ms — barely perceptible — vs 250 ms at 24 fps.

🐛 Proposed fix
  const blinkPeriod = Math.round(fps * 2.6);
  const blinkOffset = Math.round(blinkPeriod / 2);
- const inBlink = (frame + blinkOffset) % blinkPeriod < 6;
+ const blinkDuration = Math.round(fps * 0.2); // ~200 ms across all FPS
+ const inBlink = (frame + blinkOffset) % blinkPeriod < blinkDuration;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const blinkPeriod = Math.round(fps * 2.6);
const blinkOffset = Math.round(blinkPeriod / 2);
const inBlink = (frame + blinkOffset) % blinkPeriod < 6;
const blinkScale = inBlink ? 0.12 : 1;
const blinkPeriod = Math.round(fps * 2.6);
const blinkOffset = Math.round(blinkPeriod / 2);
const blinkDuration = Math.round(fps * 0.2); // ~200 ms across all FPS
const inBlink = (frame + blinkOffset) % blinkPeriod < blinkDuration;
const blinkScale = inBlink ? 0.12 : 1;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/lib/MascotCharacter.tsx` around lines 82 - 85, The blink
currently uses a hardcoded frame-count duration (inBlink uses "< 6") so blinking
is too short at high FPS; change the duration to be time-based by computing a
blinkDurationFrames derived from fps (e.g., Math.round(fps * desiredSeconds)
such as 0.25s) and replace the magic "6" with that variable; update related
variables blinkPeriod, blinkOffset, inBlink, and blinkScale to use
blinkDurationFrames so blink timing scales correctly with fps.

Comment on lines +8 to +15
export const YellowMascotLoading: React.FC<YellowMascotLoadingProps> = (props) => (
<MascotCharacter
{...props}
face="loading"
arm={props.arm ?? "none"}
idPrefix="mascot-loading"
/>
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Same dead-code arm fallback as yellow-MascotRecording.tsx — loading face will display a waving arm by default

Identical root cause: yellowMascotLoadingSchema = mascotSchema preserves arm.default("wave"), so props.arm ?? "none" always evaluates to "wave".

🐛 Proposed fix
  export const YellowMascotLoading: React.FC<YellowMascotLoadingProps> = (props) => (
    <MascotCharacter
      {...props}
      face="loading"
-     arm={props.arm ?? "none"}
+     arm="none"
      idPrefix="mascot-loading"
    />
  );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const YellowMascotLoading: React.FC<YellowMascotLoadingProps> = (props) => (
<MascotCharacter
{...props}
face="loading"
arm={props.arm ?? "none"}
idPrefix="mascot-loading"
/>
);
export const YellowMascotLoading: React.FC<YellowMascotLoadingProps> = (props) => (
<MascotCharacter
{...props}
face="loading"
arm="none"
idPrefix="mascot-loading"
/>
);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/yellow-MascotLoading.tsx` around lines 8 - 15, The
component YellowMascotLoading currently uses a redundant fallback arm={props.arm
?? "none"} which is dead code because yellowMascotLoadingSchema inherits
mascotSchema that already sets arm.default("wave"); remove the fallback and pass
the prop directly (arm={props.arm}) so the schema-provided default ("wave") is
respected; also mirror the same change in yellow-MascotRecording.tsx if present
to keep behavior consistent.

@@ -0,0 +1,45 @@
import React from "react";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use import type { FC } to match the codebase's import type convention.

React is only referenced as React.FC<…> (a type). With the new JSX transform already in use (as evidenced by Root.tsx), this is a type-only import.

♻️ Proposed fix
-import React from "react";
+import type { FC } from "react";
 import { AbsoluteFill, interpolate, useCurrentFrame, useVideoConfig } from "remotion";
 import { MascotCharacter, mascotSchema, type MascotProps } from "./lib";
 
 // ...
-export const YellowMascotPickup: React.FC<YellowMascotPickupProps> = (props) => {
+export const YellowMascotPickup: FC<YellowMascotPickupProps> = (props) => {

As per coding guidelines: "Use import type for type-only imports in TypeScript."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import React from "react";
import type { FC } from "react";
import { AbsoluteFill, interpolate, useCurrentFrame, useVideoConfig } from "remotion";
import { MascotCharacter, mascotSchema, type MascotProps } from "./lib";
// ... component implementation ...
export const YellowMascotPickup: FC<YellowMascotPickupProps> = (props) => {
// ... component body ...
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/yellow-MascotPickup.tsx` at line 1, The file currently
does a runtime import "import React from 'react';" but React is only used as a
type (React.FC), so change the import to a type-only import and update any
React.FC usage to FC: replace the runtime import with "import type { FC } from
'react'" and update the component's type signature (references to React.FC in
yellow-MascotPickup.tsx) to use FC so the import is purely type-only.

Comment on lines +8 to +15
export const YellowMascotRecording: React.FC<YellowMascotRecordingProps> = (props) => (
<MascotCharacter
{...props}
face="recording"
arm={props.arm ?? "none"}
idPrefix="mascot-rec"
/>
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

arm={props.arm ?? "none"} — the "none" fallback is dead code; the mascot will wave during recording

yellowMascotRecordingSchema aliases mascotSchema verbatim, which sets arm: z.enum(["wave","none","steady"]).default("wave"). Remotion derives defaultProps from the schema, so props.arm is always "wave" — never null or undefined. The nullish-coalescing fallback to "none" therefore never fires.

The net result is that the recording variant renders with a waving arm overlaid on the recording face, which is almost certainly unintended (compare: yellow-MascotIdle and yellow-MascotTalking both hardcode their arm value after the spread).

🐛 Proposed fix — hardcode arm="none" (consistent with sibling variants)
  export const YellowMascotRecording: React.FC<YellowMascotRecordingProps> = (props) => (
    <MascotCharacter
      {...props}
      face="recording"
-     arm={props.arm ?? "none"}
+     arm="none"
      idPrefix="mascot-rec"
    />
  );

If callers should be able to override the arm for this variant, use a schema extension instead so the default is explicit:

- export const yellowMascotRecordingSchema = mascotSchema;
+ export const yellowMascotRecordingSchema = mascotSchema.extend({
+   arm: z.enum(["wave", "none", "steady"]).default("none"),
+ });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const YellowMascotRecording: React.FC<YellowMascotRecordingProps> = (props) => (
<MascotCharacter
{...props}
face="recording"
arm={props.arm ?? "none"}
idPrefix="mascot-rec"
/>
);
export const YellowMascotRecording: React.FC<YellowMascotRecordingProps> = (props) => (
<MascotCharacter
{...props}
face="recording"
arm="none"
idPrefix="mascot-rec"
/>
);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/yellow-MascotRecording.tsx` around lines 8 - 15, The
recording variant currently falls back to "none" with arm={props.arm ?? "none"},
but because yellowMascotRecordingSchema inherits mascotSchema (which sets arm
default to "wave"), that fallback never triggers and causes an unintended waving
arm; update the YellowMascotRecording component to hardcode arm="none" when
rendering MascotCharacter (replace arm={props.arm ?? "none"} with a fixed
arm="none") to match sibling variants, or if callers must be able to override
the arm, change yellowMascotRecordingSchema to extend/override mascotSchema so
its arm default is explicitly "none" and keep the prop spread.

@@ -0,0 +1,20 @@
import React from "react";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use import type { FC } to match the codebase's import type convention.

React is referenced solely as React.FC<…> (a type), making this a type-only import. The project's new JSX transform means React is not needed in scope for JSX, and Root.tsx already follows the correct pattern (import type { FC } from "react").

♻️ Proposed fix
-import React from "react";
+import type { FC } from "react";
 import { z } from "zod";
 import { MascotCharacter, mascotSchema } from "./lib";
 
 // ...
-export const YellowMascotSleep: React.FC<YellowMascotSleepProps> = (props) => (
+export const YellowMascotSleep: FC<YellowMascotSleepProps> = (props) => (

As per coding guidelines: "Use import type for type-only imports in TypeScript."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/yellow-MascotSleep.tsx` at line 1, Replace the default
React import with a type-only import: remove `import React from "react";` and
add `import type { FC } from "react";` so the file uses the codebase convention
for type-only imports (e.g., for any `FC`/`React.FC` component types in
yellow-MascotSleep.tsx); update component type annotations to use `FC` if
needed.

@@ -0,0 +1,22 @@
import React from "react";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use import type { FC } to match the codebase's import type convention.

Same as the other yellow-Mascot* files: React is used only as React.FC<…> (a type annotation), making this a type-only import. The correct pattern is established in Root.tsx line 1.

♻️ Proposed fix
-import React from "react";
+import type { FC } from "react";
 import { z } from "zod";
 import { MascotCharacter, mascotSchema } from "./lib";
 
 // ...
-export const YellowMascotThinking: React.FC<YellowMascotThinkingProps> = (props) => (
+export const YellowMascotThinking: FC<YellowMascotThinkingProps> = (props) => (

As per coding guidelines: "Use import type for type-only imports in TypeScript."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import React from "react";
import type { FC } from "react";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@remotion/src/Mascot/yellow-MascotThinking.tsx` at line 1, The file currently
does a value import "import React from 'react'" though React is used only as a
type (React.FC) — change this to a type-only import: replace the default import
with "import type { FC } from 'react'" and update component annotations to use
FC (or React.FC -> FC) if necessary; ensure there are no runtime React
references left so the import remains type-only.

@senamakel senamakel merged commit d29fa23 into tinyhumansai:main May 4, 2026
14 of 18 checks passed
jwalin-shah added a commit to jwalin-shah/openhuman that referenced this pull request May 5, 2026
* feat(remotion): Ghosty character library with transparent MOV variants (tinyhumansai#1059)

Co-authored-by: WOZCODE <contact@withwoz.com>

* feat(composio/gmail): sync into memory tree (Slack-parity) (tinyhumansai#1056)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(scheduler-gate): throttle background AI on battery / busy CPU (tinyhumansai#1062)

* fix(core,cef): run core in-process and stop orphaning CEF helpers on Cmd+Q (tinyhumansai#1061)

* ci: add dedicated staging release workflow (tinyhumansai#1066)

* fix(sentry): Rust source context + per-release deploy marker (tinyhumansai#405) (tinyhumansai#1067)

* fix(welcome): re-enable OAuth buttons with focus/timeout recovery (tinyhumansai#1049) (tinyhumansai#1069)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(dependencies): update pnpm-lock.yaml and Cargo.lock for package… (tinyhumansai#1082)

* fix(onboarding): personalize welcome agent greeting with user identity (tinyhumansai#1078)

* fix(chat): make agent message bubbles fit content width (tinyhumansai#1083)

* Feat/dmg checks (tinyhumansai#1084)

* fix(linux): Add X11 platform flags to .deb package launcher (tinyhumansai#1087)

Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com>

* fix(sentry): auto-send React events; collapse core→tauri for desktop (tinyhumansai#1086)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* fix(cef): run blank reload guard on the CEF UI thread (tinyhumansai#1092)

* fix(app): reload webview instead of restart_app in dev mode (tinyhumansai#1068) (tinyhumansai#1071)

* fix(linux): deliver X11 ozone flags via custom .desktop template (tinyhumansai#1091)

* fix(webview-accounts): retry data-dir purge so CEF handle race doesn't leak cookies (tinyhumansai#1076) (tinyhumansai#1081)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* fix(webview/slack): media perms + deep-link isolation (tinyhumansai#1074) (tinyhumansai#1080)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* ci(release): split staging vs production workflows; promote staging tags (tinyhumansai#1094)

* Update release-staging.yml (tinyhumansai#1097)

* chore(staging): v0.53.5

* chore(staging): v0.53.6

* ci(staging): cut staging from main; add act local-debug helper (tinyhumansai#1099)

* chore(staging): v0.53.7

* fix(ci): correct sentry-cli download URL and trap scope (tinyhumansai#1100)

* chore(staging): v0.53.8

* feat(chat): forward thread_id to backend for KV cache locality (tinyhumansai#1095)

* fix(ci): bump pinned sentry-cli to 3.4.1 (2.34.2 was never published) (tinyhumansai#1102)

* chore(staging): v0.53.9

* fix(ci): drop bash trap in upload_sentry_symbols.sh; inline cleanup (tinyhumansai#1103)

* chore(staging): v0.53.10

* refactor(session): flatten session_raw/, switch md to YYYY_MM_DD (tinyhumansai#1098)

* Add full Composio managed-auth toolkit catalog (tinyhumansai#1093)

* ci: add diff-aware 80% coverage gate (Vitest + cargo-llvm-cov) (tinyhumansai#1104)

* feat(scripts): pnpm work + pnpm debug for agent-driven workflows (tinyhumansai#1105)

* ci: pull pnpm into CI image, drop redundant setup steps (tinyhumansai#1107)

* docs: add Cursor Cloud specific instructions to AGENTS.md (tinyhumansai#1106)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* chore(staging): v0.53.11

* docs: surface 80% coverage gate and scripts/debug runners (tinyhumansai#1108)

* feat(app): show Composio integrations as sorted icon grid on Skills (tinyhumansai#1109)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* feat(composio): client-side trigger enable/disable toggles (tinyhumansai#1110)

* feat(skills): channels grid + integrations card polish; tolerant Composio trigger decode (tinyhumansai#1112)

* chore(staging): v0.53.12

* feat(home): early-bird banner + assistant→agent terminology (tinyhumansai#1113)

* feat(updater): in-app auto-update with auto-download + restart prompt (tinyhumansai#677) (tinyhumansai#1114)

* chore(claude): add ship-and-babysit slash command (tinyhumansai#1115)

* feat(home): EarlyBirdyBanner + agent terminology + LinkedIn enrichment model pin (tinyhumansai#1118)

* fix(chat): single onboarding thread in sidebar after wizard (tinyhumansai#1116)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com>

* fix: filter out global namespace from citation chips (tinyhumansai#1124)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>

* feat(nav): enable Memory tab in BottomTabBar (tinyhumansai#1125)

* feat(memory): singleton ingestion + status RPC + UI pill (tinyhumansai#1126)

* feat(human): mascot tab with viseme-driven lipsync (staging only) (tinyhumansai#1127)

* Fix CEF zombie processes on full app close and restart (tinyhumansai#1128)

Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>

* Update issue templates for GitHub issue types (tinyhumansai#1146)

* feat(human): expand mascot expressions and tighten reply-speech state machine (tinyhumansai#1147)

* feat(memory): ingestion pipeline + tree-architecture docs + ops/schemas split (tinyhumansai#1142)

* feat(threads): surface live subagent work in parent thread (tinyhumansai#1122) (tinyhumansai#1159)

* fix(human): keep mascot mouth animating when TTS ships no viseme data (tinyhumansai#1160)

* feat(composio): consume backend markdownFormatted for LLM output (tinyhumansai#1165)

* fix(subagent): lazy-register toolkit actions filtered out of fuzzy top-K (tinyhumansai#1162)

* feat(memory): user-facing long-term memory window preset (tinyhumansai#1137) (tinyhumansai#1161)

* fix(tauri-shell): proactively kill stale openhuman RPC on startup (tinyhumansai#1166)

* chore(staging): v0.53.13

* fix(composio): per-action tool consumes backend markdownFormatted (tinyhumansai#1167)

* fix(threads): persist selectedThreadId across reloads (tinyhumansai#1168)

* feat(memory_tree): switch embed model to bge-m3 (1024-dim, 8K context) (tinyhumansai#1174)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(agent): drop redundant [Memory context] recall injection (tinyhumansai#1173)

* chore(memory_tree): drop body-read timeouts on Ollama HTTP calls (tinyhumansai#1171)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(transcript): emit thread_id + fix orchestrator missing cost (tinyhumansai#1169)

* fix(composio/gmail): phase out html2md, prefer text/plain MIME part (tinyhumansai#1170)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(tools): markdown output for internal tool results (tinyhumansai#1172)

* feat(security): enforce prompt-injection guard before model and tool execution (tinyhumansai#1175)

* fix(cef): popup paint dies after first frame — skip blank-page guard for popups (tinyhumansai#1079) (tinyhumansai#1182)

Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com>

* chore(sentry): rename OPENHUMAN_SENTRY_DSN → OPENHUMAN_CORE_SENTRY_DSN (tinyhumansai#1186)

* feat(remotion): add yellow mascot character with all animation variants (tinyhumansai#1193)

Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(composio): hide raw connection ID, derive friendly label (tinyhumansai#1153) (tinyhumansai#1185)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* fix(windows): align install.ps1 MSI with per-machine scope (tinyhumansai#913) (tinyhumansai#1187)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(tauri): deterministic CEF teardown on full app close (tinyhumansai#1120) (tinyhumansai#1189)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(composio): cap Gmail HTML body before strip (crash mitigation) (tinyhumansai#1191)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(auth): stop stale chat threads after signup (tinyhumansai#1192)

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(sentry): staging-only "Trigger Sentry Test" button (tinyhumansai#1072) (tinyhumansai#1183)

* chore(staging): v0.53.14

* chore(staging): v0.53.15

* feat(composio): format trigger slugs into human-readable labels (tinyhumansai#1129) (tinyhumansai#1179)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* fix(ui): hide unsupported permission UI on non-macOS for Screen Intelligence (tinyhumansai#1194)

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(tauri-shell): retire embedded Gmail webview-account flow (tinyhumansai#1181)

* feat(onboarding): replace welcome-agent bot with react-joyride walkthrough (tinyhumansai#1180)

* chore(release): v0.53.16

* fix(threads): preserve selectedThreadId on cold-boot identity hydration (tinyhumansai#1196)

* feat(core): version/shutdown/update RPCs + mid-thread integration refresh (tinyhumansai#1195)

* fix(mascot): swap to yellow mascot via @remotion/player (tinyhumansai#1200)

* feat(memory_tree): cloud-default LLM, queue priority, entity filter, Memory tab UI (tinyhumansai#1198)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Persist turn state + restore conversation history on cold-boot (tinyhumansai#1202)

* feat(mascot): floating desktop mascot via native NSPanel + WKWebView (macOS) (tinyhumansai#1203)

* fix(memory/tree): emit summary children as Obsidian wikilinks (tinyhumansai#1210)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(tools): coding-harness baseline primitives (tinyhumansai#1205) (tinyhumansai#1208)

* docs: add Codex PR checklist for remote agents

---------

Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com>
Co-authored-by: WOZCODE <contact@withwoz.com>
Co-authored-by: sanil-23 <sanil@vezures.xyz>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Cyrus Gray <144336577+graycyrus@users.noreply.github.com>
Co-authored-by: CodeGhost21 <164498022+CodeGhost21@users.noreply.github.com>
Co-authored-by: oxoxDev <164490987+oxoxDev@users.noreply.github.com>
Co-authored-by: Mega Mind <146339422+M3gA-Mind@users.noreply.github.com>
Co-authored-by: Gaurang Patel <ptelgm.yt@gmail.com>
Co-authored-by: unn-Known1 <unn-known1@users.noreply.github.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Steven Enamakel <senamakel@users.noreply.github.com>
Co-authored-by: Steven Enamakel's Droid <enamakel.agent@tinyhumans.ai>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: senamakel-droid <281415773+senamakel-droid@users.noreply.github.com>
Co-authored-by: YellowSnnowmann <167776381+YellowSnnowmann@users.noreply.github.com>
Co-authored-by: Neil <neil@maha.xyz>
Co-authored-by: Neel Mistry <neelmistry@Neels-MacBook-Pro.local>
Co-authored-by: obchain <167975049+obchain@users.noreply.github.com>
Co-authored-by: Jwalin Shah <jshah1331@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants