Case Study · 02

AskMickey.

A cross-platform Disney World assistant, built for EPCOT. A classify-then-route dispatcher on top of Gemini — mixture-of-experts in spirit, deterministic in implementation.

Stack: Dart · Flutter · Gemini Period: 2025 Status: MVP · iOS · Android · Web

Context

Walt Disney World is a wonderful vacation — and, from a purely logistical view, a genuinely hard problem. Park hours, ride availability, queue times, transportation, dining reservations, weather, geolocation — decisions stack up by the minute. A generic LLM chatbot would either hallucinate specifics or fail at routing the question to the right data source.

AskMickey is a solo build. The concept, architecture, routing logic, and prompt design are mine, worked out before any code was written; a portion of the implementation was AI-assisted from that specification. The current release is an EPCOT-only MVP — the routing pattern is built to generalize to other parks.

The architectural question was: how do you route a guest's question to the right handler when you have a dozen domain-specific data sources and one general LLM?

The architecture

Inspired by Mixture-of-Experts.

The pattern I converged on is classify-then-route: a lightweight classifier reads the incoming query, picks one of several specialized handlers, and dispatches the query to that handler alone. Each handler has its own context (live queue data, restaurant menus, attraction status, current weather) and its own prompt scaffolding before calling Gemini.

Query Classifier (Gemini) Router [ one handler ] Gemini Response ├── AttractionInfo (status, details) ├── AttractionQueue (live wait times) ├── Dining / Menu (menus, options) ├── Weather (live conditions) ├── Maps (geo, walking routes) ├── ParkingLocation (static lookup) ├── FunFacts (park trivia) └── ConversationContinuation (follow-ups) safety paths: InappropriatePrompt · NotDisneyRelated · IndeterminateCategory

This is mixture-of-experts in spirit. The shape is the same: many specialized experts, one gate that picks among them, one expert activated per query.

The technical distinction is real. Mixture-of-experts uses a learned gate trained jointly with the experts, soft-routes across multiple experts simultaneously, and lives inside the model architecture. AskMickey's router is a deterministic classifier — handwritten rules and a small classification model — sitting outside the LLM, picking exactly one handler per query.

It performs the function MoE was invented to solve — routing inputs to specialized capacity — through a simpler, deterministic mechanism that fit the problem.

Why this shape worked

Four reasons the classify-then-route pattern fit the problem better than a single general handler:

  • Each handler carries its own live data — wait times for queues, conditions for weather — without polluting unrelated queries with irrelevant context.
  • Safety is enforced at classification time, before any generative call. Inappropriate, off-domain, or unclassifiable queries short-circuit to dedicated handlers instead of reaching the LLM — guardrails by architecture, not by hoping the prompt holds.
  • Failure isolation: if the weather data source goes down, attraction queries still work.
  • Per-handler prompt scaffolding means each handler is tuned independently. The dining handler doesn't need to know about ride heights.

Demo

See it route.

A full walkthrough — a range of real guest queries, each classified, routed to the right handler, and answered completely. The breadth is the point. Live data (wait times, weather radar), structured retrieval at scale (a full festival menu with every item, location, and price), and geolocation routing from the guest's actual position (quickest path to a ride, nearest restroom, even a route back to where they parked).

It's also a finished product, not a tech demo: consistent in-character voice, a themed interface, and an animated loading state that keeps the tone while a query is processing.

Ride info, live wait times, dining and menus, weather radar, turn-by-turn routing, and a trip back to the car — each query classified, routed, and answered with real data.

What it actually does

Range, in the guest's own words.

Real-time information, in character

Natural-language questions answered with live, accurate data — and a consistent Mickey voice throughout. The themed starfield interface is the app's own.

AskMickey home screen with themed Mickey starfield
Home. Animated, themed interface — the app's own UI.
Test Track height and ride duration answer
Ride details. Height requirement and duration for Test Track, answered conversationally.
Weather forecast with heat index
Weather. Forecast with heat index, plus an offer to pull live radar.

Structured retrieval at scale

Dense, multi-result queries handled completely — every option, location, and price — and a hand-off to the official source when that's the right answer.

Every place to get fish and chips with prices
Multi-result. Every spot serving fish & chips, with prices, across the park.
Rose and Crown menu offer
Routed intent. Recognizes a menu request and offers to pull it up.
Official Disney Rose and Crown menu
Source of truth. Hands off to the official Disney menu rather than risk a stale answer.

Geolocation routing from where you're standing

The app resolves the destination from a plain-language question, reads the guest's current location, and launches a turn-by-turn walking route — delegating the map to the tool that does mapping best.

Quickest route to Remy's Ratatouille Adventure
Destination resolved. "Quickest route to Remy's" — understood and confirmed.
Walking route to Remy's, 15 minutes
Live route. Turn-by-turn from current location — 15-minute walk.
Walking route to nearest restroom, 1 minute
Nearest restroom. Same pattern, any destination — a 1-minute walk away.

The touches that make it a product

Details that show the system was designed for real guests on a real park day — not assembled as a tech demo.

Offer to save parking location
Save your spot. Offers to remember where you parked — so "I'm ready to go home" routes you back to the car.
Nearest restroom intent recognized
Plain language. "Where's the nearest restroom" resolves to a specific location and route.
Live NWS weather radar for Orlando
Live radar. Real NWS radar for the park, on request.

Workflow

Design by hand. Implementation with AI.

AskMickey predates the structured AI-assisted workflow I use now. The architecture above — the routing pattern, the handler split, the safety paths, the data-source design — was worked out before any code was written. AI tooling entered once the specification was stable, assisting with a portion of the implementation: scaffolding Flutter widgets, handler boilerplate, tests against the spec.

That sequence is the distinction I'd draw: concept, architecture, and specification by hand; a portion of the implementation accelerated with AI after the design is set. It's a different workflow than the rapid-MVP-with-heavy-AI approach I took on the weather project later, and both have their place — but for a system with non-trivial routing logic, designing first and implementing second produces a system you can defend in detail.

Stack

What's under the hood.

Cross-platform Flutter for the client. Dart for the routing and dispatch logic. Gemini as the underlying LLM. Live data sources integrated per handler.

Client

  • Flutter
  • Dart
  • iOS · Android · Web · Desktop

Routing

  • Classify-then-route dispatcher
  • Deterministic gating
  • Per-handler prompt scaffolding

LLM

  • Google Gemini
  • Handler-specific contexts

Data sources

  • Live queue / wait times
  • Dining menus · weather
  • Maps · geolocation