Sale Dashboard
Use your Meesho Google account to open the dashboard. Google sign-in controls dashboard access; Admin fetches still use the separate Admin session cookie.
Checking sign-in…
Use your Meesho Google account to open the dashboard. Google sign-in controls dashboard access; Admin fetches still use the separate Admin session cookie.
Checking sign-in…
Config validation and scale-up operations
Paste config JSON or open from Scale-ups/Admin, then review sale-readiness checks.
Pulls the latest ConfigResponse.kt from supply_android and applies it live — no reload needed. Requires start.command (or serve.js) to be running.
Auto-syncs every 10 minutes in the background. Manual re-sync needed only for a different ref or immediate update.
In Finder, double-click start.command. It preflights node & gh, starts the server, and opens this page automatically. Closing the Terminal window stops everything.
Requires gh auth status ✓ and read access to Meesho/supply_android. Optional args: ./start.command [port] [ref].
One-shot CLI — rewrite index.html without running a server:
node sync-schema.js # default ref develop node sync-schema.js <ref> # any branch / commit SHA
Drop a file — session-only schema swap (when offline or sync isn't available):
Reset — revert this session to the schema baked at page-load time:
Click Validate with a config fragment on the left. Each rule produces one or more report entries; filter by severity using the buttons above the report.
Root must be a non-empty JSON object. Each top-level key is resolved against the parsed
ConfigResponse.kt schema (e.g. sale_marker_config → SaleMarkerConfig).
Unknown top-level keys fail with a typo suggestion.
Recursively walks every nested object / list / map and compares each key against the allowed fields of its data class. Anything not in the Kotlin model fails, with a "Did you mean …?" suggestion from Levenshtein distance.
When a field's Kotlin type is an enum class declared in ConfigResponse.kt,
the value must match one of the enum's allowed wire values exactly. Wire value is the
@Json(name = "…") when present, otherwise the Kotlin identifier. Typo-distance
suggestion included on failure.
Every field's value is checked against the Kotlin primitive type declared on the data class.
Boolean requires true / false; Int / Long
/ Short / Byte require a finite integer; Float /
Double require a finite number; String requires a string.
Recurses into List<T> and Map<String, T>. Types we don't
recognize (e.g. enums or classes from other Kotlin modules) are skipped to avoid false positives.
Every discovered asset URL must be absolute and use https://. Cleartext
http:// fails — Android rejects mixed-content traffic.
Lottie URLs should end in .json or .lottie. Image URLs should end in
.png / .jpg / .jpeg / .webp /
.gif / .svg. Mismatches warn rather than fail (CDNs can serve through query-string routes).
Defaults: image < 60 KB, lottie < 120 KB (configurable in the settings strip). Each asset is fetched through the local CORS proxy and its byte count checked. At or over the limit → fail. ≥ 85% of the limit → warn. Otherwise pass. Fetch errors (CDN down, proxy not running) surface as info.
When the JSON has a language map — an object keyed by ISO-639 codes
(en / HI / TE / MR / TA /
BN / KN / ML / OR / GU /
PA / AS) — every URL inside inherits that key as its expected language.
EN, Latin must dominate; significant Indic content fails..lottie files are ZIPs — unwrapped in-browser via DecompressionStream._en / _hindi hints).Within one language map, if multiple language slots point to the same URL, warns. Usually a copy-paste bug — one image can't simultaneously be Hindi and Tamil and Bengali.
Field names ending in _color / _bg_color / _text_color
(or just color) must match #RRGGBB or #RRGGBBAA.
When an object has enabled: true or is_enabled: true, every sibling
field whose name looks like an asset reference (*_url / icon /
logo / banner / lottie / animation) must be
non-empty. Empty asset on an enabled feature fails.
Sanity caps on numeric fields:
min_version / version_code / app_version negative → fail*percent / *percentage outside 0–100 → warn*_seconds / *_ms / *_millis / *_count negative → warn
price_drop_sale_day.feed_animation_count should stay between 1-30;
pdp_animation_count should stay between 1-6. Values below 1 fail,
values above the usual sale range warn for manual confirmation.
When dynamic_app_icon.enabled is true, alias must match the aliases
declared in IconAlias.kt.
Fetched .json and .lottie animations are parsed for fr.
≤ 30 fps passes, 31-60 fps warns, and > 60 fps fails.
splash_config.splash_asset.url and fallback_asset.url are checked for
width/height when fetchable. Splash media must be exactly 360×720.
Epoch start_time/end_time fields are compared against the Admin experiment
window when available. Config start/end must be within ±1 day of experiment
start/end, and within ±7 days of the saved IST Sale or Prebuzz window in the top bar.
Below the report, every discovered asset shows up as a thumbnail card with its path,
kind, size, and language (if known). Images render natively (no CORS needed for
<img>). Lotties render via lottie-web — both raw .json and
.lottie ZIPs are supported. Auto-collapsed when more than 20 assets.
Three signals, checked in priority order:
type field — the {type, url} pattern. type:"lottie" wins regardless of URL.*_image_url / *_icon_url / *_lottie_url / *_animation_url, or bare icon / lottie / etc.url). .json & .lottie ⇒ lottie. .png / .jpg / etc. ⇒ image.
New asset fields added to ConfigResponse.kt are picked up automatically — no catalog update needed.
Fetch admin configs for the Scale-ups archive and save only the JSON configs in this browser's local DB. A pasted cookie is used for this run only and cleared from the form before the fetch starts.
.json file · ⌘+↵ to validate
requested-by email
added as a header — required by ab-experiment APIs