Draft proposal · v0.1 · for client review
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.
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.
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.
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.
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.
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.
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.
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.
setExpression(), play(), on() — so your
team can drive the character from your own page without our involvement.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.
| Item | Status | Note |
|---|---|---|
| Layered 2D character source (illustrated) | In scope | Master asset, delivered to you |
| 2D skeletal rig + expression system | In scope | ≥8 expressions |
| 2D idle, blink and one-shot actions | In scope | ≥3 actions with real limb articulation |
| Embeddable widget + JavaScript API | In scope | Single-tag embed |
| 3D model cleanup + custom rig | In scope | Bespoke, non-humanoid |
| 3D animation clips | In scope | ≥3 named clips |
| 3D web viewer | In scope | Orbit, zoom, clip selection |
| Cross-browser + mobile testing | In scope | See AC11 |
| Documentation + full source handover | In scope | — |
| Voice, audio and lip-sync | Phase 2 | The prototype's “talk” is a timed mouth flap with no audio; real lip-sync needs a viseme set and audio analysis |
| Conversational AI / chat behaviour | Phase 2 | No AI brain exists in the prototype; this is a separate product |
| Reusable “any character” pipeline | Phase 2 | Section 2 explains why this is not a near-term automation target |
| Backend, accounts, analytics, CMS | Out of scope | Deliverables are static |
| Native iOS / Android apps | Out of scope | Web only; the widget works in a webview |
| Additional characters or localisation | Out of scope | Quoted separately on request |
| Hosting, domains and CDN fees | Out of scope | We deploy to your infrastructure |
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.
| # | Phase | Week | Output & gate |
|---|---|---|---|
| 0 | Discovery & art direction lock | 1 | Style frames, full expression sheet, agreed action list, technical spec. Gate: art direction signed off. |
| 1 | Character 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. |
| 2 | 2D runtime engine | 4–5 | Expressions, idle, articulated actions, embed API. Gate: staging demo reviewed. |
| 3 | 3D clips & viewer | 5–6 | Hand-keyed clips, compressed GLB, viewer with clip selection. Gate: staging demo reviewed. |
| 4 | Integration, performance & handover | 7 | Production bundles, acceptance testing against section 7, documentation, source handover. Gate: acceptance criteria met. |
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.
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.
| Phase | Design days |
3D art days |
Eng. days |
PM days |
Cost |
|---|---|---|---|---|---|
| 0 — Discovery & art direction | 4 | 1 | 2 | 2 | TBD |
| 1 — Character asset production | 8 | 8 | 2 | 2 | TBD |
| 2 — 2D runtime engine | 2 | 0 | 9 | 2 | TBD |
| 3 — 3D clips & viewer | 0 | 5 | 5 | 1 | TBD |
| 4 — Integration & handover | 1 | 1 | 5 | 2 | TBD |
| Total effort | 15 | 15 | 23 | 9 | TBD |
| Day rate | TBD | TBD | TBD | TBD | — |
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.
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.
| Item | Measured consumption | Unit price | Cost |
|---|---|---|---|
| Image generation — 12 layers @ 1024×1024 | 5,286 input + 12,672 output image tokens (17,958 total) | TBD | TBD |
| Image-to-3D — 1 model, textured, 29,200 triangles | 30 credits, 105 seconds | TBD | TBD |
| Auto-rigging attempt | 0 credits consumed — rejected with 422 |
— | 0 |
| Hosting / CDN for the delivered bundles | Static assets, ~1–4 MB per product | TBD | TBD |
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.
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.
<script> or <iframe> tag, with no CSS or JavaScript
conflicts with the host page.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.
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.
| Milestone | Share | Amount |
|---|---|---|
| Contract signature | % | TBD |
| Phase 1 art & rig sign-off | % | TBD |
| Phase 3 staging demo accepted | % | TBD |
| Phase 4 acceptance & handover | % | TBD |