Touch grass
Open touch-grass-murex.vercel.app. On the same Wi-Fi, node server.mjs --lan lets a phone open the card at the door. I used it on October 13 for a 25-minute garden card in Phoenix. The card said to plant tomatoes, peppers, lettuce, peas, garlic, and brassicas into cool soil, water deeply, and shade the seedlings. It mentioned palo verde still holding a yellow cast, Gambel’s quail near wash…
Visit touch-grass-murex.vercel.app on the same Wi-Fi network. On a phone, open the card at the door using node server.mjs --lan. On October 13, a 25-minute garden card was created in Phoenix. The card suggested planting tomatoes, peppers, lettuce, peas, garlic, and brassicas in cool soil, watering deeply, and providing shade for seedlings.
The card noted that palo verde trees still had a yellow hue, Gambel's quail were observed near wash vegetation, and the soil had finally cooled enough for morning work. The frost line was 63 days away from the average first fall frost, which occurs on December 15. This marks the beginning of the desert vegetable year, not its end.
Touch Grass is a field station for a brief period, writing one card for tasks such as gardening, walking, or sitting. After writing, the phone should return to its pocket. The card is not a continuous feed but is read at the door. In pocket mode, a clock and a single sentence are displayed. When returning, one note about what was noticed is kept and stored in data/journal.json on the computer.
The sentence on the card is generated by Qwen2.5 1.5B Instruct, an open-weight model (Apache 2.0) running in llama.cpp (MIT) on the laptop. Touch Grass does not rely on a model API during operation. The page loads from this machine, and frost math, sunset, and the journal remain on the device. The Qwen model weights and llama.cpp binaries are not included in the repository. setup.ps1 downloads them, amounting to approximately 1 GB for the model.
The card's sentence is written by Qwen2.5 1.5B Instruct, an open-weight model under Apache 2.0, operating on the laptop. The server.mjs initiates llama-server with --offline, a 4096-token context, and disables GPU layers, as the machine's GPU is a 2 GB GeForce MX330. Inference is performed using the CPU. A card is generated in 10 to 30 seconds once the weights are warmed up.
The model does not invent the season; it retrieves climatic averages, calculates daylight, and utilizes a month-by-month phenology file for six climates: continental, subtropical, desert, Mediterranean, marine, and tropical. The brief outlines what can and cannot be sown, as well as which birds, leaves, and soil cues the card is permitted to mention.
Mushroom-related information is purely observational, not edible. Walks should be restricted to public paths. Qwen merely phrases the brief, adhering to any constraints you specify. If the draft is insufficient, the station may refer to the city rather than the task, or revert to a planting list based on the frost calendar. The card is labeled accordingly: "Written on this machine · Qwen2.5 1.5B" or "Written from the local frost calendar."
The voice is determined by prompts/ranger.txt. An editor is available on the page. The subsequent card utilizes the file you saved. To switch models, replace another .gguf in models/, set TOUCH_GRASS_MODEL, and restart the system. Open innovation plays a crucial role in this project for three reasons. Firstly, a closed garden chatbot would necessitate an internet connection at the time of leaving the house.
Secondly, once the weights are on disk, Touch Grass operates independently of the network. Both the page, frost math, sunset data, and journal reside on the machine, with llama-server initiated via --offline. Consequently, an outing incurs no costs. Furthermore, the chatbot would require user input about balconies, wind, or personal observations during a walk.
This information would be stored on a server the user does not control. Instead, the journal is stored as a JSON file in the project folder. The model's brief is calculated in lib/facts.mjs prior to the model's response. I can modify these briefs, edit the ranger's voice, and replace the weights without relying on external settings.
My project was developed within a Cursor agent session on the laptop, and the repository serves as the record of my work, including the frost checks in scripts/check-facts.mjs, the voice file, and the server that prevents the model from speaking once loaded. The project does not qualify for a partner category. As the system runs locally on llama.cpp and Qwen2.5 with no hosted runtime, fine-tuning, or partner API, it does not compete in such categories.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.