This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass. Outward gives you three small things to do outside, matched to a short description of what you feel like doing. Choose a neighborhood, park, or doorstep; ten, twenty, or thirty minutes; and whether to wander or stay in one spot. Read the suggestions, start pocket mode, and put the phone away.
The project is for the gap between wanting a break and deciding what to do. A mission might ask you to watch one thing change or notice a small pattern. A familiar place is enough. There is no route to follow, account to create, or location permission to grant.
An open sentence-embedding model matches your words to a fixed, inspectable catalog of 22 missions. It selects existing instructions. Setting and movement preferences are hard constraints, and Skip listening activities removes the catalog's listening category. You can ask for another set without repeating the three currently shown.
Pocket mode keeps those three titles visible and offers the full instructions when needed. Afterward, an optional field note gives you somewhere to keep one observation. The design aims to make the screen a short part of an outdoor break. No outdoor trial or measured benefit is claimed in this write-up.
Try a sample input such as “I want to listen to birds and natural sounds,” choose Park or green space, 20 min, and A gentle wander, then select Find my field trip. The first AI run downloads model and runtime assets. A completed AI plan is labeled MATCHED ON YOUR DEVICE. Read the missions, choose Take this outside, and return with I'm back to save a field note. Use a safe, familiar place and skip any task that does not fit your surroundings or ability.
There is also an explicitly selected sample mode, labeled SAMPLE · NO AI USED. A model failure never silently switches to that mode.
Public repository: kudala-bharani/Outward Outward began on October 5, 2026. The application uses React, TypeScript, and Vite. Original application code is MIT-licensed; third-party components retain their own licenses and notices.
Start with src/data/missions.ts for the catalog, src/ai/model.ts for local inference, src/ai/rank.ts for selection, and src/storage.ts for persistence. The repository includes setup instructions, tests, architecture notes, and machine-readable model evidence.
The model is Xenova/all-MiniLM-L6-v2, an ONNX distribution of the Sentence Transformers model, running through Transformers.js. Both the model distribution and runtime use Apache-2.0. Transformers.js is pinned to 4.3.0, and the q8 model is pinned to revision 751bff37182d3f1213fa05d7196b954e230abad9.
A dedicated browser worker embeds the input and mission descriptions into 384-dimensional vectors. Cosine similarity measures relevance; a small penalty for redundant missions adds variety. The selector applies explicit setting, movement, and listening constraints before choosing three missions. Duration sets the outing timer; it does not estimate the time needed for each activity.
Two recorded examples show how the matching responds:
These are actual model outputs. The English-focused model can still misread context; relevance does not establish safety or benefit.
October 6 verification passed TypeScript, 179 automated tests, the production build, native CPU inference, and browser-target WASM inference inside Node. npm run test:model-filters reproduced 36 constraint plans.
A separate manual Chromium walkthrough passed real AI matching, cancellation/retry, non-repeating second sets, stale-plan protection, and doorstep/stationary/listening constraints. Pocket mode survived reload with its countdown catching up. A fictional journal note passed export, duplicate-safe restore, deletion, and Undo. Desktop and narrow layouts were checked, along with keyboard opening/closing of an explanation dialog. The full Playwright suite, offline reload, and a physical mobile device remain untested. Evidence and scope are recorded in the repository's docs/verification.md.
A development correction concerned storage: the initial active-trip record retained the original input. The current version saves missions and timing while removing the mood text, matching query, model name, and similarity scores. Field notes are never sent to the model. Validated JSON export and restore provide a manual backup; deletion is confirmed and can be undone while the page stays open.
AI agents materially implemented the application, tests, and documentation under my direction. This article was primarily generated by AI agents from the source and recorded evidence. Development assistance is separate from the open model that performs matching inside the app.
A downloadable model makes the inference boundary a concrete implementation choice. Outward can compare the input with the catalog locally without sending that text to a hosted inference API or operating an inference server. The model, tokenizer, pinned revision, and selection logic can be inspected and tested together.
Contributors can improve mission wording, change constraints, compare embedding models, or add language coverage with appropriate evaluation. The catalog and ranking behavior are small enough to examine directly.
There are costs to this approach. The first run needs a network connection and downloads roughly 23 MB of weights plus the runtime and supporting files. Asset providers receive ordinary request metadata. Browser storage and exported notes are unencrypted, and cached assets do not guarantee offline availability.
Open components make this small, account-free design practical and reproducible. They also make its limits visible: the source shows exactly what is selected, what is stored, and what still needs testing.