- MPS-6: referrer analytics (domain, query, trend line charts) - MPS-7: sandbox mode creative filter system - MPS-8: user S3 bucket + artifact storage - MPS-9: shop S3 mirror bucket - architecture.md: system diagram, request flow, data pipeline, S3 layout - JAVASCRIPT.md: add sandbox.js, signals.js, MediaPipe SDK entries - sandbox-mode.md: mark S3 upload as implemented - mps-2.md: document referrer_domain + referrer_query columns Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.6 KiB
MPS-7: Sandbox Mode — Client-Side Creative Filter System
Problem
Creators want visitors to interact with their media beyond passive viewing. Existing tools require downloading, editing in external software, and re-uploading. The friction kills experimentation. Creators need an in-browser creative toolkit that lets visitors play with filters, export artifacts, and optionally upload results — all without leaving the shop.
Solution
A client-side filter engine that runs entirely in the browser. The server stores
a single boolean (shop.sandbox_mode). When enabled, every page in the shop
renders a floating toolbar with 32 filter presets, 7 adjustment sliders, SVG
filter effects, canvas export (image + video), and optional face detection via
MediaPipe.
Full architecture and filter reference: docs/sandbox-mode.md
Server-side (minimal)
sandbox_modeBoolean column on Shop model- Toggle in ribbon-settings form section (same form as announcement ribbon, default theme, grid lanes, show_dates, watch_mode, color_filter)
base.j2conditionally renders toolbar HTML, inline SVG filter definitions, and loadssandbox.jsonly whenshop.sandbox_modeis true- Watch mode SPA integration:
watch.jscallswindow.sandboxReapply()after DOM swap to re-apply filters to newly loaded media
Client-side (sandbox.js, ~700 lines)
- 32 CSS filter presets (4 basic, 4 warm, 4 cool, 4 dramatic, 5 color, 7 Instagram-style, 4 SVG)
- 7 adjustment sliders (brightness, contrast, saturation, hue, blur, sepia, grayscale)
- Image export via canvas
toBlob()(requires CORS from CDN) - Video export via
MediaRecorder+captureStream(30fps) - Face detection via MediaPipe Face Mesh (4MB WASM, on-demand load)
- localStorage persistence of preset, slider values, panel state
- Upload-to-bucket via presigned POST (see MPS-8)
Files Changed
| File | Change |
|---|---|
models/shop.py |
sandbox_mode Boolean column |
views/shop.py |
Toggle handler in ribbon-settings form section |
templates/shop_settings.j2 |
Enable/disable radio buttons |
templates/base.j2 |
Conditional toolbar HTML + inline SVG defs |
static/js/sandbox.js |
Client-side filter engine (IIFE) |
static/js/watch.js |
sandboxReapply() hook in updatePageContent() |
static/css/common.css |
Toolbar layout (CSS Grid), mobile responsive |
scripts/alembic/versions/a2c13d3117f2_*.py |
Migration: sandbox_mode |
tests/test_functional.py |
Sandbox toggle, toolbar rendering, script tag tests |
Depends On
Nothing. Independent feature.
Blocks
MPS-8 (user S3 bucket for artifact upload)