Draft proposal · v0.1 · for client review

Animated Mascot Character: 2D Widget & 3D Model

A production build of the apple mascot as a rigged, animated 2D web widget and a rigged 3D model — based on what the working prototype has already proven, and what it has already ruled out.

The apple mascot character as it appears in the working prototype.
Prepared for
CLIENT NAME
Prepared by
YOUR COMPANY
Date
22 September 2026
Status
First draft — for comment
Valid until
DATE
Live prototype
apple-agent.6iang.dev
Reading this draft

Everything marked LIKE THIS is a commercial figure still to be agreed — day rates, totals and dates. All technical scope, timings and measurements in this document are final as drafted and come from the prototype we have already built and deployed.

01Executive summary

We propose to build the apple mascot as two deliverables that share one character design: an embeddable 2D animated widget for the web, and a rigged 3D model with playable animation clips. Both are delivered as production assets plus full source, with no runtime dependency on any third-party AI service.

The prototype we built and deployed at apple-agent.6iang.dev is not a mock-up: it renders a live character with blending expressions, randomised blinking and continuous idle motion, and it loads a real compressed 3D model in the browser. Building it answered the two questions that decide how this project has to be run — and one of the answers is a genuine constraint on scope, which we set out in full in section 2 rather than discovering it mid-build.

In short: the animation runtime works and is cheap; the character artwork must be authored by hand. Automated image-to-layers and automated 3D rigging both failed on this specific character, for structural reasons that will not change with more attempts. Our proposal therefore puts real illustration and 3D-rigging effort in the plan, and reuses the prototype's runtime engineering rather than rebuilding it.

Proposed duration is 6–8 weeks across five phases, with sign-off gates between them. Cost is presented per phase in section 6 for you to review against budget.

02What the prototype established

The prototype's purpose was to de-risk the expensive parts before anyone committed a budget. It did that. Two findings are load-bearing for everything below.

Finding 1 — AI cannot produce rig-ready layers for this character

We ran an automated pipeline that asked an image model to separate the mascot into 12 posable layers: body, two eye states, cheeks, four mouth shapes, two arms and two legs. The pipeline reported success on all 12 with zero failures. In practice only 4 of the 12 are usable — the four mouth shapes.

Consequence for this proposal

Real articulation — an arm that waves, legs that walk, brows that move independently — requires a layered character source authored by an illustrator, with each moving piece drawn as its own element and overlapping geometry drawn underneath. This is budgeted in Phase 1. It cannot be substituted with generated imagery, and we recommend against paying anyone who says otherwise.

Finding 2 — automatic 3D rigging fails on a non-humanoid character

Image-to-3D itself worked well. One source image produced a textured 29,200-triangle model in 105 seconds, which we then compressed to a 360 KB GLB that loads in the browser. That part of the pipeline is sound and we intend to reuse it.

The automatic rigging step, however, returned a hard error: 422 — Pose estimation failed, please provide a valid model. The reason is structural, not transient: auto-rigging services fit a humanoid skeleton, and the mascot is a sphere with stub limbs and no discernible spine, shoulders or hips. Retrying costs money and will fail identically. The animation stage was therefore skipped, and the 3D model in the live prototype has zero skeletons and zero animation clips — what you see spinning is procedural motion applied to a static mesh, which the prototype's on-screen notice states openly.

Consequence for this proposal

A genuinely animated 3D mascot needs a custom rig built by a 3D artist — a bespoke bone layout for a round, stub-limbed character, not a humanoid template. This is the single largest cost driver in the 3D track and is budgeted explicitly in Phase 1.

What worked, and what we will keep

Reusable from the prototype
  • The 2D animation runtime. Eased blending between expression poses, randomised blinking every 2–5 seconds, sine-driven breathing and bobbing, and resolution-independent layout. It reads as alive with no keyframe data at all, which keeps both the payload and the art budget down.
  • Image-to-3D plus compression. 105-second generation, and a 360 KB browser-ready GLB using mesh-quantisation, Meshopt compression and WebP textures.
  • Asset optimisation. Our cleanup step took the raw artwork from 15.9 MB to 408 KB across 12 files with no visible quality loss — a 40× reduction. The live 2D character currently loads in roughly 185 KB.
  • An honest loading and error path. Per-stage spinners, retry-with-backoff on asset fetches, and graceful degradation when an asset is missing rather than a blank canvas.

One note on the prototype's engineering: a meaningful share of its effort went into working around the demo tunnel it is hosted on — retrying dropped script chunks, a hand-written image loader to avoid stalls, cache-busting, and three separate diagnostic scripts. That work is hosting debt, not product complexity, and it disappears on normal CDN hosting. We have not carried it into the estimates below.

03Proposed approach

Track A — 2D animated mascot widget

  1. Layered character source. An illustrator redraws the mascot as a layered document (Photoshop or vector) in which every moving piece is its own element: upper and lower arm per side, legs, eyelids, brows, pupils, cheeks, the leaf, and a complete set of mouth shapes. Overlapping areas are drawn underneath so joints do not tear when they rotate. This document is the master asset and belongs to you.
  2. Skeletal rig. The layers are bound to a bone hierarchy in the runtime, so limbs rotate around real pivots. This is what turns the prototype's whole-body lean into an actual wave.
  3. Expression system. A named pose table — eyes, brows, mouth, cheeks, head tilt, scale and vertical lift per expression — with eased blending between any two states, so transitions are smooth and new expressions are data, not code. We carry the prototype's approach forward and extend it.
  4. Procedural life. Breathing, idle bob, randomised blinking and micro head-drift run continuously underneath whatever expression is active, composed so a blink still reads correctly during a held expression.
  5. One-shot actions. Wave, jump and nod (final list agreed in Phase 0), each as an enveloped animation that returns cleanly to idle and cannot be left half-played.
  6. Embed API. A single-tag embed plus a small JavaScript interface — setExpression(), play(), on() — so your team can drive the character from your own page without our involvement.

Track B — rigged 3D model

  1. Model cleanup. Retopologise the generated mesh to a clean, deforming topology at a controlled polygon budget, and tidy the texture.
  2. Custom rig. A bespoke bone layout designed for this character's actual shape — root, body/squash chain, per-limb chains, head and leaf. Explicitly not a humanoid auto-rig, for the reason given in section 2.
  3. Hand-keyed clips. Idle, wave and one additional action (agreed in Phase 0), authored by an animator and exported as named glTF animations.
  4. Web viewer. Three.js viewer with orbit and zoom, three-point lighting, filmic tone mapping, clip selection with cross-fade, and compressed-asset decoding — extending the viewer already written for the prototype, where the clip-playback code exists and is simply waiting for a rigged asset to drive it.

Delivery and hosting

Both deliverables ship as static, versioned bundles suitable for any CDN or your existing hosting. No server-side component, no database, no runtime API keys, and no per-view cost. The prototype's demo-tunnel workarounds are dropped.

04Scope

What this proposal covers, and what it deliberately does not.
ItemStatusNote
Layered 2D character source (illustrated)In scopeMaster asset, delivered to you
2D skeletal rig + expression systemIn scope≥8 expressions
2D idle, blink and one-shot actionsIn scope≥3 actions with real limb articulation
Embeddable widget + JavaScript APIIn scopeSingle-tag embed
3D model cleanup + custom rigIn scopeBespoke, non-humanoid
3D animation clipsIn scope≥3 named clips
3D web viewerIn scopeOrbit, zoom, clip selection
Cross-browser + mobile testingIn scopeSee AC11
Documentation + full source handoverIn scope
Voice, audio and lip-syncPhase 2The prototype's “talk” is a timed mouth flap with no audio; real lip-sync needs a viseme set and audio analysis
Conversational AI / chat behaviourPhase 2No AI brain exists in the prototype; this is a separate product
Reusable “any character” pipelinePhase 2Section 2 explains why this is not a near-term automation target
Backend, accounts, analytics, CMSOut of scopeDeliverables are static
Native iOS / Android appsOut of scopeWeb only; the widget works in a webview
Additional characters or localisationOut of scopeQuoted separately on request
Hosting, domains and CDN feesOut of scopeWe deploy to your infrastructure

05Timeline

Seven working weeks of planned effort inside a 6–8 week envelope. The range is deliberate: it absorbs one normal round of art revision without moving the end date.

Phases, with a sign-off gate at the end of each.
#PhaseWeekOutput & gate
0Discovery & art direction lock1 Style frames, full expression sheet, agreed action list, technical spec.
Gate: art direction signed off.
1Character asset production
2D layered source + 3D retopo & custom rig
2–3 Rig-ready layered document; clean rigged 3D mesh.
Gate: artwork and rig approved. Blocking — see note below.
22D runtime engine4–5 Expressions, idle, articulated actions, embed API.
Gate: staging demo reviewed.
33D clips & viewer5–6 Hand-keyed clips, compressed GLB, viewer with clip selection.
Gate: staging demo reviewed.
4Integration, performance & handover7 Production bundles, acceptance testing against section 7, documentation, source handover.
Gate: acceptance criteria met.
Critical dependency

Phases 2 and 3 cannot begin before the Phase 1 art sign-off. The runtime is built against the specific layer names and pivot positions in the approved artwork, so late art changes are the one thing that reliably moves the end date. Weeks 5 and 6 overlap by design: the 3D track runs alongside the tail of the 2D track.

06Cost

Effort is shown per phase and per role in working days. Rates and totals are left open in this draft for us to agree with you before v1.0 — the day counts are our estimate and are what we would like your feedback on.

Professional services. Currency: USD / VND.
Phase Design
days
3D art
days
Eng.
days
PM
days
Cost
0 — Discovery & art direction4122TBD
1 — Character asset production8822TBD
2 — 2D runtime engine2092TBD
3 — 3D clips & viewer0551TBD
4 — Integration & handover1152TBD
Total effort1515239TBD
Day rateTBDTBDTBDTBD

62 role-days total across a 7-week calendar, i.e. a small team working partly in parallel rather than four people full-time for seven weeks.

Third-party asset generation — measured, not estimated

These are the actual figures recorded by the prototype run on 22 September 2026. They are one-off costs incurred only if we regenerate source assets; the delivered products have no runtime API cost at all. Unit prices are left open because vendor pricing should be quoted from the provider's current rate card at the time of signing, not from our notes.

Recorded consumption, one full asset-generation run.
ItemMeasured consumptionUnit priceCost
Image generation — 12 layers @ 1024×1024 5,286 input + 12,672 output image tokens (17,958 total) TBDTBD
Image-to-3D — 1 model, textured, 29,200 triangles 30 credits, 105 seconds TBDTBD
Auto-rigging attempt 0 credits consumed — rejected with 422 0
Hosting / CDN for the delivered bundles Static assets, ~1–4 MB per product TBDTBD

For context on scale: the whole two-track generation run — 12 image layers plus one 3D model — completed in about two minutes of wall-clock time. Generation throughput is not a cost or schedule risk on this project; hand-authored art is.

07Acceptance criteria

Each criterion below is objectively testable, and we propose to demonstrate all of them together in the Phase 4 acceptance session. Sign-off means these pass; nothing here is a matter of opinion.

2D animated mascot widget

  1. Expressions. At least 8 named expressions, each individually selectable, each visually distinct in both eyes and mouth. Transitions between any two are smoothly blended with no visible pop.
  2. Idle life. Continuous breathing and bobbing, plus randomised blinking at irregular intervals, running correctly underneath any held expression.
  3. Articulated actions. At least 3 one-shot actions in which named limbs actually rotate about their own pivots — verified by inspecting the rig, not by whole-body motion. The wave must raise and move an arm.
  4. Frame rate. A sustained 60 fps on a mid-range laptop and a mid-range Android phone over a 60-second idle-plus-actions run, measured with browser performance tooling.
  5. Payload. Initial widget load, including artwork and code, is ≤500 KB transferred (gzip or brotli). Benchmark: the prototype's optimised art set is 408 KB total and its live 2D character loads ~185 KB.
  6. First frame. The character is visible and animating within 1.5 s on a simulated 4G connection from a cold cache.
  7. Embedding. The widget renders correctly on a third-party page via a single <script> or <iframe> tag, with no CSS or JavaScript conflicts with the host page.
  8. Control API. The documented JavaScript API sets any expression, plays any action, and emits completion events — demonstrated live from the browser console.

3D rigged model

  1. Rig. The delivered GLB contains a skeleton and skin weights, with at least 3 named animation clips, and limbs deform without visible tearing or collapse at joints through the full range of each clip. This criterion exists because the prototype's model has zero skeletons and zero clips — it is the measurable difference between prototype and product.
  2. Weight and performance. Delivered GLB is ≤3 MB, loads and displays within 3 s on a simulated 4G connection, and plays clips at ≥30 fps on a mid-range Android phone. Benchmark: the prototype's compressed static model is 360 KB.

Both deliverables

  1. Browser support. Correct rendering and interaction on the current and previous major versions of Chrome, Firefox, Safari and Edge on desktop, plus iOS Safari and Android Chrome.
  2. Clean console. No JavaScript errors and no failed network requests across every supported browser during a full feature walkthrough.
  3. Accessibility baseline. All interactive controls are keyboard reachable and operable with visible focus states; canvases carry meaningful text alternatives; colour contrast on UI chrome meets WCAG 2.1 AA.
  4. Graceful degradation. If an asset or WebGL context is unavailable, the user sees a clear message rather than a blank area.
  5. Handover. Full source code, the layered art master, the rigged 3D source, build instructions, the API reference, and a short written guide to adding a new expression — all transferred to your ownership.

08Assumptions & what we need from you

The timeline in section 5 depends on these. If any is not met, we will flag the schedule impact in writing at the time rather than at the end.

09Change control & payment

Change control

Anything outside section 4's in-scope list is handled as a written change request with its own effort estimate and schedule impact, agreed before work starts. We will not absorb scope silently and we will not surprise you with an invoice.

Payment milestones

MilestoneShareAmount
Contract signature%TBD
Phase 1 art & rig sign-off%TBD
Phase 3 staging demo accepted%TBD
Phase 4 acceptance & handover%TBD

Other terms

10Next steps

  1. Review this draft and try the live prototype at apple-agent.6iang.dev — particularly the expression buttons, which show the runtime we intend to build on.
  2. Send us your comments on scope (section 4), the phase day-counts (section 6) and the acceptance criteria (section 7). These are the three places where your input changes the plan.
  3. A short call to work through the two constraints in section 2 and confirm the action list for 2D and 3D.
  4. We issue v1.0 with agreed pricing, dates and terms, ready for signature.