A UI mockup of a Val Town-native mobile AI chat β what a first-party "Townie in your pocket" app could feel like. Not wired to a real model: responses are canned, Val Town-flavored, and streamed token-by-token to feel alive.
Live: open the val's HTTP endpoint on your phone (or a narrow browser window). Add to Home Screen for the full standalone PWA feel.
Studies the latest ChatGPT and Claude mobile apps and remixes their best interactions into Val Town's own design language (per the valtown-ui skill: IBM Plex Sans, slate + sky, true-black text, 8px radius, iA Writer Quattro eyebrows).
- π¬ Fake streaming chat β typing dots β token stream β blinking caret, with effort-dependent "thinking" time. Markdown rendering with copyable code blocks. Stop, retry, copy, thumbs.
- ποΈ Push-style sidebar drawer β edge-swipe to open, pinned + recents (persisted to localStorage), New chat FAB, avatar.
- π§ Model bottom sheet β drag-to-dismiss, Townie 2 / Townie / Townie Mini, plus an Effort sub-view (High / Medium / Instant) that actually changes streaming speed.
- β Attach popover β Camera / Photos / Files / Connectors with blur backdrop.
- ποΈ Voice mode chip β animated waveform (mock).
- π» Incognito mode β chats created while on are never persisted.
- π² PWA-level native feel β manifest + service worker (network-first shell cache), safe-area insets,
100dvh, no tap highlights, overscroll containment, haptics vianavigator.vibrate, reduced-motion support.
Rendering mermaid diagram...
- Styling: Twind (Tailwind runtime) + a small
style.cssfor fonts, keyframes, and safe areas. - Types shared in
shared/types.ts. - No backend state β everything is client-side; the val only serves files.
frontend/lib/fakeAI.ts exposes pickResponse() + streamResponse(). Replace those two with a fetch to a streaming endpoint and the whole UI comes alive unchanged.
Mockup by Charlie (dcm31) Β· view source