Go Pug Go
A pug animation series in production with Ernest Chan, with custom production infrastructure built alongside it. This document captures the design decisions, the platform direction, and the interface mockups behind the system — one shared locked artifact for the series and its tooling before any code lands.
What this is
A single-line read of Go Pug Go and what we're building beside it.
Go Pug Go is an animated pug short-form series built in Moho for YouTube and short-form platforms, with Ernest as showrunner / lead animator and a small bench of freelance riggers and animators. Episodes run roughly 1–5 minutes each. The catalogue is already four series deep — Pug Impressions, Do Pugs, Random, and Ancillary — with 71 Pug Impression concepts written down.
Alongside the series, we're building Ernest's production infrastructure from scratch: a custom web application running on the existing VPS that handles incubation (idea-stage), greenlight, production tracking, video-frame-accurate review, file-handoff, budget, and audience analytics. It's the system the studio runs on, not just a tracker.
The decisions, locked
Where we've landed. Tiles are color-coded: green = locked, gold = open / negotiable, lavender = needs Ernest's call.
Custom platform, not a CMS
Next.js + TypeScript + Postgres + Drizzle on the existing VPS. Two custom surfaces (Moho upload + take review) make a CMS net-negative.
List/table view is canonical
Every other view (kanban, calendar, timeline, dashboard) is a projection of the same underlying table. Table first, projections second.
Scenes are per-project optional
Default: one scene = the whole project. Ernest flips "this project has scenes" on per-need. Logo stings stay simple; multi-scene shorts get the breakdown.
Greenlight is a state transition
Greenlight forks the incubation record into a production project. Incubation row stays as historical record. Linked, not duplicated.
Production status is two fields
Manual production stage (pre-production / animating / cleanup / review / approved / delivered) AND derived activity status (waiting on Ernest, idle, in-revision, blocked). Two surfaces, two questions.
Archive auto-cascades
Archiving a production project flips the linked incubation record from greenlit → archived automatically. One canonical archive action runs the full script (tarball → confirm → delete heavy assets → keep metadata).
No native dialogs, no system tooltips
Every popover, modal, tooltip, scrollbar is themed. Standard system chrome never appears in the product. Hard rule.
Upload mode is a per-take toggle
Three modes: review take (video only) / project snapshot (zip without renders) / final delivery (full zip with renders). Different size + archive treatment.
Folder convention validated at upload
Strict directory shape per project (moho/ assets/ renders/ takes/ notes/). The uploader validates the shape on drop. Without a validator, the convention rots in 3 months.
"Scenes" naming
Default term is scenes; could equally be shots, beats, moments. The hierarchy works the same — the word should match how you think.
Brand handles + domain hygiene
YouTube / Instagram / TikTok handles for "Go Pug Go" — claim them now while free, even if launch is later. Same for the domain.
Why scenes optional — the reasoning▾
The shorts catalogue ranges from one-beat impressions ("Pug crawling into a sleeping bag and then bursts out with wings and throws glitter in the air") to multi-beat narratives ("Do pugs make good ninjas?"). Forcing scene structure on the simple ones is friction; making it impossible to add structure to the complex ones is worse friction. The hierarchy is opt-in per-project: a flag on the project record, and the take view collapses or expands accordingly. Notes attach to scenes when scenes exist; they attach to the project root when they don't.
Incubation — the first system to ship
The spreadsheet has 71 Pug Impression concepts already. This is the section that earns its keep on day one.
The incubation surface is a single sortable table. Columns mirror the existing spreadsheet (Anim Name, Story, Animation Notes, Dialogue Notes, Music Notes, Budget Tier, Status) and extend it with reference links, cast list (other pugs / props / animals appearing), tags (slapstick, wholesome, gross-out, dance, seasonal), and a status richer than greenlit-or-not (ideated → written → sketched → ready-to-greenlight → greenlit → archived).
The status column is the moment Ernest's mental model lives in the system. The greenlight button on a row is the moment the system earns its first real value: one click forks the row into a full production project with scenes, takes, notes, budget, and assignments — while the incubation record stays in place as the historical brief.
Incubation
71 shorts · 4 series · 12 ready for greenlight| Anim | Story | Tier | Status | |
|---|---|---|---|---|
| SkunkA | Pug farts. | Tier 1 | Ready | |
| UnicornA | Pug puts on a party hat and plays with party poppers. | Tier 1 | Ready | |
| CheetahA | Pug with trainers attempts to run but quickly gets winded and collapses. | Tier 2 | Greenlit | → in production |
| ButterflyA | Pug crawling into a sleeping bag and then bursts out with wings and throws glitter in the air. | Tier 2 | Sketched | |
| AnacondaA | Pug giving another pug an extreme hug. | Tier 1 | Ideated | |
| MoleA | Pug using a backhoe to dig a hole. | Tier 3 | Ideated |
The dashboard — Ernest's morning surface
What Ernest opens with his coffee. Top-line numbers, projects-in-flight, what needs his attention today.
The dashboard is the at-a-glance view: cumulative state, what's happening this week, what's blocked on him, what's blocked on a freelancer. Critically, activity status is auto-derived from take state + last-touched timestamps — Ernest doesn't have to update it. Production stage is manually moved; activity is just visible.
This week
June 22 · 6 active · 2 in review · 3 pending ErnestTake review — the load-bearing custom surface
Frame-accurate timeline notes + spatial notes. Frame.io's UX without Frame.io's cost.
This is the surface the system stands or falls on. Ernest scrubs a take, pauses on a frame, clicks where the pug's ear is wrong, types "the ear deflates a frame too early", and the note pins to that (timecode, x, y). The artist opens the take and sees the pins along the timeline; clicks one and the player jumps there with the marker centered on the frame. Threaded replies. Resolvable. Searchable.
Notes have three flavors: timeline-only (pinned to a timecode), spatial (pinned to a position on the frame at a timecode), and take-level (general feedback, no anchor). One data model, three surfaces.
Kanban — the standup view
A projection of the same data. Useful for the quick "who's where" glance.
The kanban view is a projection of the production table. Columns are production stages; cards are shorts. Drag a card to move stage. Identical data, different question being asked.
The Moho file pipeline
Folder convention, upload modes, validation, archive flow. The thing that keeps 250GB usable forever.
Folder convention per project
One canonical shape, enforced at upload. Every short is a folder with the same skeleton:
go-pug-go/projects/CheetahA/ moho/ ← the .moho file lives here assets/ characters/ ← linked, not embedded audio/ reference/ takes/ ← exported videos for review notes/ ← screenshots, PDFs, scribbles renders/ ← optional, only on final delivery
Three upload modes
The upload UI offers a clear three-way choice so size + treatment match intent:
Video only
Just the exported .mp4 / .mov for Ernest to review. ~50–200MB. Fast. Most common mode during iteration.
Zip · no renders
Full project zipped — moho/, assets/, takes/, notes/ — but renders/ excluded. ~200–500MB. Used for backup + handoff between artists.
Full zip with renders
Everything including final renders. ~500MB–1.5GB. Marked specially in the table. Used once per project, on approval.
Validation at upload
The uploader is a drag-and-drop surface that validates the folder shape before accepting the upload. Does it have a moho/ subfolder? Does it contain at least one .moho file? Does the project name match the system's project ID? If anything's off, the upload is rejected with a specific, actionable error. The validator is the magic. Without it, the convention rots in 3 months — Ernest's tone gets gentler with each freelancer, and standards drift. A machine enforces what a human eventually won't.
Storage math + archive
250GB on the VPS holds roughly 6–9 months of active work before pressure. The archive flow is built in from day one:
- Active project → all takes, all uploads, full versioning kept online
- Completed but not archived → final delivery kept online, intermediate snapshots tarred but kept
- Archived → only the final video + metadata stay online (~50MB). Everything else exported as a single
project-CheetahA-full-archive.tar.gzErnest downloads locally before the system deletes the heavy bytes from the VPS.
The metadata always stays — notes, timeline, takes, status, dates, owners, budget. Just not the binaries. Five years later Ernest can scroll back through every short he ever made; the bytes live on his external drives.
The deliberate-friction archive flow, step by step▾
The archive action is a multi-step confirmation, not a button. Step 1: select project, hit "Archive." Step 2: system bundles the heavy assets into a tar.gz on the VPS. Step 3: system serves the file for download and waits. Step 4: Ernest confirms "I have the file locally". Step 5: system removes the heavy bytes from the VPS and marks the project as archived. Both the production project and the linked incubation record flip to archived automatically. The deliberate friction is the safety.
Build sequence
What ships first, what ships next, what's nice-to-have. Order can flex; this is the proposal.
- Incubation table. Just the table, with filters, search, status field, and Ernest's columns from the spreadsheet. Migrate the existing 71 + 39 + 39 + 37 rows. Make Ernest use it daily.
- The greenlight transition. Button that promotes an incubation row to a production project. Empty production project structure with scenes-optional, takes, notes, budget fields.
- The Moho folder validator + uploader. Drag-and-drop with three upload modes (review take / project snapshot / final delivery). Validates the folder shape, zips server-side, stores as a take version.
- Take review UI. Video player + timeline notes + spatial notes. The only really custom piece; the one the system stands on.
- Dashboards. Ernest's (review queue + needs-attention) and the producer view (team-load + budget + active projects). Falls out of the data the first 4 steps generate.
- Archive workflow. Multi-step confirmation, tar export, confirm-then-delete, metadata preserved.
- Publish log. Per-short release tracking + per-platform performance pull (YouTube, Instagram, TikTok). Becomes the most valuable dataset Ernest owns over time.
- Freelancer onboarding view. Per-user scoped homepage + assignment view + pinned guidelines.
1–5 is the MVP and ships Ernest a tool that already beats the spreadsheet + email status quo. 6–8 are the durability features. The build phase rolls into the ongoing producer engagement after launch — no separate build invoices, no special-project pricing.
Open questions for Ernest
Things to decide before code lands.
Scenes or shots or beats?
What word fits your mental model? The hierarchy is the same; only the label changes.
Budget tier — what are the tiers?
The spreadsheet has "Budget Tier" as a column but no defined values. Tier 1/2/3 with $ ranges? Or a dollar field directly?
Who reviews who?
Default: Ernest reviews all takes. Edge case: producer/asst producer reviews first pass? Ernest only sees take 2+?
Music + audio — separate workflow?
Music Notes is a column today. Is music a separate freelancer pipeline or does Ernest handle it himself?
YouTube + IG + TikTok all at once?
Or YouTube primary with social as auto-syndication? Affects the publish-log surface.
The biggest time-eater right now?
What's the thing that ate your last month? The system should be aimed at your actual pain, not the producer-tool pain in the abstract.