{"id":24803112,"url":"https://github.com/gabrielmarcano/roaster-app","last_synced_at":"2026-03-04T23:04:58.224Z","repository":{"id":262865185,"uuid":"887993749","full_name":"gabrielmarcano/roaster-app","owner":"gabrielmarcano","description":"React Native mobile app for monitoring and controlling ESP32-based coffee roasting equipment. Real-time temperature/humidity charts, motor control, timer management, and roasting profile storage.","archived":false,"fork":false,"pushed_at":"2026-03-03T19:52:09.000Z","size":4856,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-03T22:20:24.928Z","etag":null,"topics":["esp32","react-native"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabrielmarcano.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-13T16:23:14.000Z","updated_at":"2026-03-03T19:52:13.000Z","dependencies_parsed_at":"2025-02-06T19:30:17.226Z","dependency_job_id":"11986e1a-e826-4536-a69e-f78996a78a26","html_url":"https://github.com/gabrielmarcano/roaster-app","commit_stats":null,"previous_names":["gabrielmarcano/roaster-app"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabrielmarcano/roaster-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmarcano%2Froaster-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmarcano%2Froaster-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmarcano%2Froaster-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmarcano%2Froaster-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrielmarcano","download_url":"https://codeload.github.com/gabrielmarcano/roaster-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmarcano%2Froaster-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30098122,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T22:49:54.894Z","status":"ssl_error","status_checked_at":"2026-03-04T22:49:48.883Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esp32","react-native"],"created_at":"2025-01-30T05:17:38.940Z","updated_at":"2026-03-04T23:04:58.212Z","avatar_url":"https://github.com/gabrielmarcano.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  Roaster App\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  A real-time mobile companion for the \u003ca href=\"../pyroaster\"\u003epyroaster\u003c/a\u003e ESP32 IoT roasting controller.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Expo-55-000020?logo=expo\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/React_Native-0.83-61DAFB?logo=react\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/platform-iOS%20%7C%20Android-lightgrey\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Overview\n\nRoaster App connects to a [pyroaster](../pyroaster) device over Wi-Fi and provides live monitoring and control of a coffee or nut roasting session. It receives real-time sensor data via Server-Sent Events (SSE) and lets you manage the timer, motors, and roasting presets from your phone.\n\n---\n\n## Features\n\n- **Live sensor dashboard** — real-time temperature and humidity charts updated every second via SSE\n- **Circular timer** — HH:MM:SS countdown with +60 s / −60 s controls\n- **Motor control** — toggle three independent motors (burner, fan, drum)\n- **Roasting presets** — create, apply, and delete named configs (starting temperature + duration)\n- **Offline preset creation** — presets created without a connection are queued locally and synced automatically on reconnect\n- **Push notifications** — timer-finish alert plus optional 30 / 20 / 10 minute pre-notifications\n- **Auto-reconnect** — exponential backoff (1 s → 30 s max) with a live connection indicator in the header\n- **Bilingual UI** — English and Spanish, switchable at runtime\n- **Dark Material Design 3** theme throughout\n\n---\n\n## Tech Stack\n\n| Layer | Library |\n|---|---|\n| Framework | [Expo](https://expo.dev) SDK 55 / React Native 0.83 |\n| Language | TypeScript 5.9 |\n| Navigation | Expo Router v4 (file-based) |\n| UI | [React Native Paper](https://reactnativepaper.com) (Material Design 3) |\n| Server state | [TanStack Query](https://tanstack.com/query) v5 |\n| HTTP | Axios |\n| Real-time | `react-native-sse` (SSE) |\n| Storage | `expo-secure-store` |\n| Notifications | `expo-notifications` |\n| Charts | `react-native-gifted-charts` |\n| i18n | `i18n-js` v4 |\n\n---\n\n## Project Structure\n\n```\nroaster-app/\n├── app/\n│   ├── (tabs)/\n│   │   ├── index.tsx          # Dashboard — live sensor charts\n│   │   ├── controllers.tsx    # Motors + roasting presets\n│   │   ├── timer.tsx          # Circular countdown timer\n│   │   └── settings.tsx       # Language, notifications, device controls\n│   ├── sign-in.tsx            # Device IP entry / session setup\n│   └── _layout.tsx            # Root provider tree\n├── api/\n│   ├── api.ts                 # Axios request functions\n│   ├── queries.ts             # TanStack Query hooks\n│   └── types.ts               # Shared TypeScript types\n├── components/\n│   ├── CircularProgress.tsx   # SVG ring timer display\n│   ├── TemperatureChart.tsx\n│   └── HumidityChart.tsx\n├── contexts/\n│   ├── sseContext.tsx         # SSE connection + auto-reconnect\n│   ├── sessionContext.tsx     # Device IP / auth\n│   ├── localConfigContext.tsx # Offline preset queue\n│   ├── notificationsContext.tsx\n│   └── localeContext.tsx\n├── hooks/\n│   ├── useNotificationScheduler.ts\n│   └── useSyncPendingConfigs.ts\n└── i18n/index.ts              # English + Spanish translations\n```\n\n---\n\n## Getting Started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org) ≥ 18\n- A physical device or emulator running iOS or Android\n- A [pyroaster](../pyroaster) device on the same Wi-Fi network (or its AP hotspot)\n\n### Install\n\n```bash\nnpm install\n```\n\n### Run (Expo Go / development)\n\n```bash\nnpm start          # opens Expo DevTools\nnpm run android    # launch on Android\nnpm run ios        # launch on iOS\n```\n\n\u003e **Note:** Push notifications require a custom dev build, not Expo Go.\n\n### Build (custom dev client via EAS)\n\n```bash\nnpx eas build --profile development --platform android\n```\n\n---\n\n## Connecting to the Device\n\nOn the sign-in screen, enter the IP address of your pyroaster device:\n\n- **AP mode (direct):** `192.168.4.1` — the ESP32 acts as its own hotspot\n- **STA mode (router):** the IP assigned by your router — check the device LCD or your router's DHCP table\n\nThe session is stored securely on-device so you only need to sign in once.\n\n---\n\n## Backend\n\nThis app is the companion to **[pyroaster](../pyroaster)**, a MicroPython server running on an ESP32. See its README for hardware setup, pin wiring, and firmware flashing instructions.\n\n---\n\n## License\n\nPrivate project — all rights reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmarcano%2Froaster-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrielmarcano%2Froaster-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmarcano%2Froaster-app/lists"}