feat(remotion): add yellow mascot character with all animation variants#1193
Conversation
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>
📝 WalkthroughWalkthroughThis PR introduces a new Yellow Mascot animation system for Remotion. A core ChangesYellow Mascot Animation System
Sequence DiagramsequenceDiagram
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~40 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ 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.
Built for teams:
One agent for your entire SDLC. Right inside Slack. 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. Review rate limit: 0/1 reviews remaining, refill in 60 minutes.Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (12)
remotion/src/Mascot/Mascot.tsxremotion/src/Mascot/MascotGreeting.tsxremotion/src/Mascot/lib/MascotCharacter.tsxremotion/src/Mascot/lib/index.tsremotion/src/Mascot/yellow-MascotIdle.tsxremotion/src/Mascot/yellow-MascotLoading.tsxremotion/src/Mascot/yellow-MascotPickup.tsxremotion/src/Mascot/yellow-MascotRecording.tsxremotion/src/Mascot/yellow-MascotSleep.tsxremotion/src/Mascot/yellow-MascotTalking.tsxremotion/src/Mascot/yellow-MascotThinking.tsxremotion/src/Root.tsx
| 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; |
There was a problem hiding this comment.
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.
| 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.
| export const YellowMascotLoading: React.FC<YellowMascotLoadingProps> = (props) => ( | ||
| <MascotCharacter | ||
| {...props} | ||
| face="loading" | ||
| arm={props.arm ?? "none"} | ||
| idPrefix="mascot-loading" | ||
| /> | ||
| ); |
There was a problem hiding this comment.
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.
| 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"; | |||
There was a problem hiding this comment.
🛠️ 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.
| 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.
| export const YellowMascotRecording: React.FC<YellowMascotRecordingProps> = (props) => ( | ||
| <MascotCharacter | ||
| {...props} | ||
| face="recording" | ||
| arm={props.arm ?? "none"} | ||
| idPrefix="mascot-rec" | ||
| /> | ||
| ); |
There was a problem hiding this comment.
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.
| 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"; | |||
There was a problem hiding this comment.
🛠️ 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"; | |||
There was a problem hiding this comment.
🛠️ 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.
| 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.
* 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>
Summary
remotion/src/Mascot/yellow-MascotWave2— waving arm loopyellow-MascotIdle— steady idle bobyellow-MascotRecording— pulsing red dot faceyellow-MascotLoading— spinning loading ring faceyellow-MascotPickup— bouncy squash-and-stretch animationyellow-MascotTalking— lip-sync mouth animationyellow-MascotThinking— arm-raise + head-tilt thinking poseyellow-MascotSleep— eye-droop + floating Zzzyellow-MascotGreeting— arm-raise hi-wave greetingTest plan
pnpm render yellow-MascotIdlepnpm render yellow-MascotPickuppnpm render yellow-MascotTalkingyellow-Mascot*compositions render without clipping🤖 Generated with Claude Code
Summary by CodeRabbit