- Three curated starting moments (an empty chair / rain on glass / the
sleepless city) shown in the empty state; clicking loads the image through
the same resize path and sets its fragment. Lets anyone try Chalchitra
without a photo to hand and shows off the reading.
- Enable the refined prompt on the Space β markedly more atmospheric film
picks on Qwen; the bounded retry covers its JSON wobble. Local stays baseline.
- README: add a slot for the Substack write-up.
build(space): adopt proven Gradio launch pattern for ZeroGPUβ
Stage-1 deploy revealed two Space requirements:
- ZeroGPU needs a module-level @spaces.GPU function β add an optional warmup
(no-op locally where `spaces` isn't installed) and `spaces` to requirements
- the runtime wants a Gradio object named `demo`; launch it non-blocking with
ssr_mode=False, then mount our routes on demo.app (drop Gradio's GET "/")
Also: Gradio claims /assets on the Space, so build our JS under /reel and serve
it explicitly. No CORS (same-origin in prod, Vite proxy in dev). Model still
not wired β this validates the launch contract on real Spaces infra.
build(space): stage 1 β deployable shell for HF Spaceβ
- app.py launches under both `python app.py` and the Space runtime (SPACE_ID),
while staying import-safe for tests
- commit frontend/dist so the Space serves the built React app (no Node on Space)
- README: π½οΈ emoji, amber gradient, license: mit, project description
- model not wired yet β this push validates build + Off-Brand serving on Spaces
feat(frontend): cinematic loading, page-load entrance, mobile polishβ
Within the existing amber/polaroid identity:
- loading cycles poetic phrases so the ~40s read feels like attention paid
- staggered rise of wordmark -> tagline -> rule -> dropzone on load
- stronger drag-over state (amber border + inner glow)
- mobile breakpoint for the polaroid stack and film cards
- prefers-reduced-motion guard
The client accumulates shown titles and sends them as `exclude`; the oracle
adds a "don't recommend these, find different films for this same moment"
clause. Adds a results button to re-roll other films for the current moment,
keeping the seen-list across "another moment" so a session never loops the
same recommendations. Titles are sanitized and capped. Stateless server.
feat(frontend): add Vite and React Chalchitra interfaceβ
Ports the prototype (amber/polaroid, In-the-Mood palette) and points the
fetch at /api/interpret instead of any hosted API. Dev proxy to the
backend; builds to dist/ served by the app.