{"slug": "outside-in-20-open-ai-that-gives-your-phone-a-stopping-point", "title": "Outside in 20: open AI that gives your phone a stopping point", "summary": "A developer built Outside in 20 (Saia em 20), an open-source browser app that matches a user's preferences and mobility constraints to a short outdoor activity and generates an offline pocket card with a timer, running entirely on-device via Transformers.js and WebAssembly. After SmolLM2-135M repeatedly returned the same activity ID despite differing preferences, the developer switched to the multilingual-e5-small embedding model, which selected the correct activity with 144 ms of inference and 2,500 ms total in a cached Portuguese test. The project ships with ten passing automated tests and a 24-second GitHub Actions run, and requires roughly 135.4 MB of model and tokenizer assets downloaded before offline use.", "body_md": "*Entry for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass](https://dev.to/challenges/hacktoberfest-week1-2026-10-05).*\n\nYou have twenty minutes and somewhere familiar to go: a courtyard, a nearby park, or another outdoor place you already know. Opening your phone to decide what to do can become the activity itself.\n\nI built **Outside in 20**, or **Saia em 20** in Portuguese, to give that interaction a stopping point. Enter your preferences, mobility constraints, and a place you know. Get a short outdoor activity, an instruction card, and a timer. Prepare the card, put the phone away, and return when you want to reflect.\n\nThe app asks for no GPS access and does not discover destinations. An optional reflection stays on the device. English and Portuguese instructions come from a curated catalogue; open AI matches your preference to an eligible activity.\n\n*Browser demonstration. Forest photograph: Wolfgang Hasselmann, Unsplash.*\n\nTry a preference about noticing colours, listening to birds, or taking a gentle walk. You can inspect the matching details, save a self-contained HTML pocket card, and start the timer. Reloading restores the selected plan and its original end time.\n\nThe first AI setup needs an internet connection and a substantial download. Prepare it before heading outside. The saved pocket card has no scripts or external assets.\n\n**Ten automated tests pass.** They check meaningful application boundaries, including activity eligibility and safe handling of text. The public [GitHub Actions run](https://github.com/Brunof94-debug/saia-em20-week1/actions/runs/37578773469) completed successfully in **24 seconds**. It installs locked dependencies, runs tests, builds and checks the app, and uploads the browser bundle.\n\nActual model execution has separate [browser evidence](https://github.com/Brunof94-debug/saia-em20-week1/blob/main/docs/evidence/wasm-only-inference.json).\n\nMy first approach used SmolLM2-135M with constrained output. It produced valid activity IDs, but repeatedly chose **A**, even when the preference described a different activity. A successful format check was hiding a recommendation failure.\n\nI switched to **multilingual-e5-small**, an open embedding model that turns text into comparable numerical representations. The [original intfloat model](https://huggingface.co/intfloat/multilingual-e5-small) uses the MIT licence. The app runs its Xenova q8 conversion through [Transformers.js](https://huggingface.co/docs/transformers.js/en/index), using WebAssembly on the person's device.\n\nThe flow has four steps:\n\n`query:` and eligible descriptions with `passage:`.\nThe model cannot override the eligibility filters or invent a route. Displayed scores describe similarity; they are **not confidence percentages** or guarantees that an activity suits a particular place.\n\nOn October 7, browser checks distinguished Portuguese requests about colours and bird/leaf sounds, and English requests about textures and gentle walking. A conflicting walking request also stayed within the seated filter.\n\nAfter switching the deployment to a WASM-only runtime, I repeated the Portuguese colour check. It selected B with **144 ms of inference** and **2,500 ms total**, with model assets already cached. The evidence records the model revision and ranking. These are observations from one test environment, not cross-browser benchmarks or a broad quality evaluation.\n\nThe model and tokenizer require approximately **135.4 MB**, plus application/runtime assets. Cached inference depends on completed setup and browser storage that has not been cleared or evicted. The downloadable card provides a simpler way to carry the selected activity offline.\n\nOpenness changes where this decision happens. Preferences are processed locally rather than sent to a remote model API. The model, filters, and catalogue can be inspected and changed independently.\n\nThat separation made the engineering correction possible: I could replace the generator that kept selecting A with a model designed for matching descriptions, while keeping the activity flow. The repository pins the model revision so that choice is reproducible.\n\nThis suits Touch Grass: prepare briefly, then carry an activity instead of an ongoing conversation. I have not conducted an outdoor trial, user study, or interviews. Whether it actually helps people spend less time on their phones still needs testing outside the browser.\n\nI used **Codex** for implementation, interface iteration, documentation, validation, and writing support. The [development log](https://github.com/Brunof94-debug/saia-em20-week1/blob/main/docs/AI-DEVELOPMENT.md) explains the model change, timer persistence fix, cache decisions, and real browser checks.\n\n**Overall prize**, and **Best Use of GitHub Copilot through GitHub Actions**.\n\nThe [published category](https://dev.to/challenges/hacktoberfest-week1-2026-10-05#best-use-of-github-copilot) explicitly includes automating a project with GitHub Actions. My entry uses that route: the linked successful workflow verifies and packages the application. Development assistance came from Codex; the sponsor integration is GitHub Actions.", "url": "https://wpnews.pro/news/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point", "canonical_source": "https://dev.to/brunof94_debug/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point-2427", "published_at": "2026-10-07 06:11:50+00:00", "updated_at": "2026-10-07 06:17:50.793369+00:00", "lang": "en", "topics": ["ai-tools", "ai-products", "generative-ai", "large-language-models", "developer-tools"], "entities": ["Outside in 20", "Saia em 20", "SmolLM2-135M", "multilingual-e5-small", "Transformers.js", "Xenova", "GitHub Actions", "Hugging Face"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point", "markdown": "https://wpnews.pro/news/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point.md", "text": "https://wpnews.pro/news/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point.txt", "jsonld": "https://wpnews.pro/news/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point.jsonld"}}