{"slug": "evenfall-prepare-a-quieter-evening-then-unplug", "title": "Evenfall: prepare a quieter evening, then unplug", "summary": "A developer built Evenfall, a browser-based wind-down companion that runs a quantized Gemma 3 1B model via WebLLM 0.2.86 in a worker to generate bedtime stories entirely on-device, paired with local device-voice narration and Web Audio soundscapes. The developer verified on the deployed Render origin that new stories can be generated, the app reloaded, and cached models loaded with the tab's network disabled, using a service worker for the app shell and WebLLM's model cache for weights. An optional SerpApi-backed nature-inspiration search runs through a separate authenticated Node backend, while the core offline story experience requires no token.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19).*\n\nAt the end of the day, even choosing something calming can become another task: find a story, pick a voice, choose background audio, and hope the connection holds.\n\nEvenfall brings those choices into one quiet place. It generates bedtime stories with **Gemma** running in the browser, reads them using installed device voices, and synthesizes rain, ocean or brown-noise soundscapes. A shelf keeps favourites, and a three-evening pack lets you prepare ahead.\n\nThe selected Week 3 idea is the **offline** wind-down companion. Its central promise is practical: \n\n**after the first online setup, a new story can be generated without an internet connection**\n\n.\n\nclick here -> [Open Evenfall on Render](https://evenfall.onrender.com/)\n\nUse desktop Chrome on a device with WebGPU support.\n\nThe initial download needs internet. Offline use depends on retaining the browser's app and model caches. Narration needs installed local English voices; the options vary by device. WebGPU availability, memory and generation speed also vary.\n\nThese checks were performed on the deployed **Render** origin, including new **Gemma** stories with the tab network disabled, offline reload, cached model loading, saved-story persistence and a three-story pack.\n\n**Optional online feature:** a place-based nature-inspiration search uses **SerpApi** through a separate Render backend. A real Kyoto search returned five source links and summaries. Recent results remained readable after an offline reload. A new, uncached search requires internet.\n\nThe optional search requires a personal backend access token. The public offline story experience does not.\n\n[Current application source — integrations branch](https://github.com/indranigit/evenfall/tree/integrations)\n\nPlease use that branch: the default main branch contains an earlier static prototype.\n\nThe README documents the current demo and its setup requirements.\n\nEvenfall uses Vite and JavaScript for the interface. WebLLM 0.2.86 runs a quantized **Gemma 3 1B model** in a worker, keeping inference on the device and separate from the interface.\n\nOffline support has two parts: a service worker caches the built app, while **WebLLM** manages the model cache. Testing only the app shell would have missed the essential question: can the model still generate a new story after the network is disabled?\n\nBrowser speech synthesis supplies installed voices. Web Audio generates the soundscapes locally, so there is no audio stream to lose when the connection disappears. Stories live in browser storage, with JSON export/import for backups.\n\nRender hosts the frontend and optional Node backend. The backend keeps the **SerpApi** key in its environment, restricts browser origins and requires a separate access token. It limits the returned summaries and caches repeated searches. The browser retains recent source summaries for offline reading.\n\nThere are real limits. A small model can produce short or repetitive stories. Browser storage can be cleared, device voices differ. Those limits are part of the demo instructions.\n\n``` php\nflowchart TD\n  U[Evenfall browser app] --> W[Worker: WebLLM and Gemma]\n  W --> G[Device GPU]\n  U --> L[Local story shelf]\n  U --> A[Device voices and Web Audio]\n  C[Service worker app cache] --> U\n  M[Cached model weights] --> W\n  U -->|Optional online search| R[Authenticated Render backend]\n  R --> S[SerpApi]\n  R --> I[Source summaries cached in browser]\n```\n\nThe offline requirement shaped the architecture. An open-weight model made it possible to move generation onto the device: the core story prompt does not need to go to a hosted inference API. That makes a disconnected evening possible after setup.\n\n[Gemma](https://ai.google.dev/gemma), [WebLLM and MLC](https://github.com/mlc-ai/web-llm), and [Vite](https://vite.dev/) are the foundations credited here. Gemma's weights remain subject to its terms; open weights do not mean unrestricted licensing.\n\nThe payoff demonstrated in testing is fewer repeated choices: a story, a local voice and a soundscape in one place, with saved stories and a pack for later evenings.\n\nTwo community references informed the integration review: Jordan Sterchele's [Your First SerpApi Integration in JavaScript — From Hello World to Production](https://dev.to/jordan_sterchele/your-first-serpapi-integration-in-javascript-from-hello-world-to-production-2n9i) discusses server-side credentials and result handling, and API Kumo's [Handling API Rate Limits Gracefully](https://dev.to/apikumo/handling-api-rate-limits-gracefully-retry-logic-exponential-backoff-and-the-headers-youre-13hh) discusses avoiding uncontrolled retry behaviour.", "url": "https://wpnews.pro/news/evenfall-prepare-a-quieter-evening-then-unplug", "canonical_source": "https://dev.to/indranigit/evenfall-prepare-a-quieter-evening-then-unplug-2k33", "published_at": "2026-10-24 16:43:21+00:00", "updated_at": "2026-10-24 16:46:35.325527+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "generative-ai", "ai-tools", "ai-infrastructure"], "entities": ["Evenfall", "Gemma", "WebLLM", "MLC", "Vite", "Render", "SerpApi", "Google"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/evenfall-prepare-a-quieter-evening-then-unplug", "markdown": "https://wpnews.pro/news/evenfall-prepare-a-quieter-evening-then-unplug.md", "text": "https://wpnews.pro/news/evenfall-prepare-a-quieter-evening-then-unplug.txt", "jsonld": "https://wpnews.pro/news/evenfall-prepare-a-quieter-evening-then-unplug.jsonld"}}