<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SAFER Documentation</title><link>https://safer-capstone.pages.dev/</link><description>Recent content on SAFER Documentation</description><generator>Hugo</generator><language>en</language><atom:link href="https://safer-capstone.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Android Installation</title><link>https://safer-capstone.pages.dev/user-guide/getting-started/installation/android/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/getting-started/installation/android/</guid><description>&lt;h1 id="safer-beta-installation-guide"&gt;SAFER Beta Installation Guide&lt;/h1&gt;
&lt;p&gt;Thanks for helping test the SAFER beta. This guide will walk you through installing the Android phone app and the WearOS watch app.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="before-you-start"&gt;Before You Start&lt;/h1&gt;
&lt;h2 id="what-youll-need"&gt;What You’ll Need&lt;/h2&gt;
&lt;h3 id="for-the-android-phone-app"&gt;For the Android Phone App&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An Android phone&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;SAFER_Android.apk&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="for-the-wearos-watch-app"&gt;For the WearOS Watch App&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An Android phone paired with a WearOS watch&lt;/li&gt;
&lt;li&gt;A Windows, Mac, or Linux computer&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;SAFER_WearOS.apk&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Both devices connected to the &lt;strong&gt;same home Wi-Fi or mobile hotspot&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt;
WearOS installation will &lt;strong&gt;not work on the UC Davis Wi-Fi network&lt;/strong&gt; because device-to-device communication is restricted.&lt;/p&gt;</description></item><item><title>App.tsx</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/app.tsx/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/app.tsx/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;This file is required for expo to define what happens upon app start.&lt;/p&gt;
&lt;h1 id="exports"&gt;Exports&lt;/h1&gt;
&lt;p&gt;Only a single function is exported within this file, and that is App().
This is the main that first starts upon app entry.&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://safer-capstone.pages.dev/developer-docs/overview/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/architecture/</guid><description>&lt;h2 id="system-overview"&gt;System overview&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│ Web Client │
│ (map view, dispatch UI) │
└────────────────────┬────────────────────────┘
 │ REST / WebSocket
┌────────────────────▼────────────────────────┐
│ API Server │
│ (authentication, routing) │
└───────────┬─────────────────────────────────┘
 │
┌───────────▼──────────┐ ┌──────────────────┐
│ Database │ │ Message Broker │
│ (persistent data) │ │ (live updates) │
└──────────────────────┘ └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="components"&gt;Components&lt;/h2&gt;
&lt;h3 id="web-client"&gt;Web Client&lt;/h3&gt;
&lt;p&gt;A single-page application served as static files. Communicates with the API
server over REST for CRUD operations and over WebSocket for live updates.&lt;/p&gt;</description></item><item><title>Architecture of the Daily Work Area Popup</title><link>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-architecture/</guid><description>&lt;h1 id="architecture-daily-work-area-popup"&gt;Architecture: Daily Work Area Popup&lt;/h1&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;The smallest useful design moves the daily popup gate from app launch semantics
to screen popup semantics. The relevant work area screen owns the eligibility
check when it becomes active. A tiny local persistence helper stores the last
local date on which the popup was actually shown.&lt;/p&gt;</description></item><item><title>CPM History</title><link>https://safer-capstone.pages.dev/developer-docs/overview/schemas/cpm-history/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/schemas/cpm-history/</guid><description>&lt;h1 id="cpm-history-schema"&gt;CPM History Schema&lt;/h1&gt;
&lt;h2 id="database"&gt;Database&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;File: &lt;code&gt;weather_cache.db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Engine: &lt;code&gt;expo-sqlite&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="table-cpm_history"&gt;Table: &lt;code&gt;cpm_history&lt;/code&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Column&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Null&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cpm&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;REAL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;One computed CPM value per successful minute tick.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;INTEGER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Epoch milliseconds when the value was recorded.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="data-invariants"&gt;Data Invariants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Each row stores only &lt;code&gt;cpm&lt;/code&gt; and &lt;code&gt;timestamp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Values must be finite numbers (&lt;code&gt;insertCpmRow&lt;/code&gt; validates inputs).&lt;/li&gt;
&lt;li&gt;Retention is capped at 40 rows; oldest rows are removed first on insert overflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="access-patterns"&gt;Access Patterns&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Insert and bounded retention: &lt;code&gt;insertCpmRow(cpm, timestamp?)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Recent read window: &lt;code&gt;getRecentCpmRows(sinceTimestamp, limit)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Read ordering: newest first (&lt;code&gt;ORDER BY timestamp DESC, rowid DESC&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CPM Pipeline</title><link>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/activity-cpm-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/activity-cpm-pipeline/</guid><description>&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;This document defines the runtime CPM pipeline from accelerometer samples to
prediction consumption.&lt;/p&gt;
&lt;h2 id="canonical-flow"&gt;Canonical Flow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;App.tsx&lt;/code&gt; starts &lt;code&gt;startActivityService()&lt;/code&gt; on mount and calls
&lt;code&gt;stopActivityService()&lt;/code&gt; on cleanup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;activityService&lt;/code&gt; starts &lt;code&gt;expo-sensors&lt;/code&gt; accelerometer streaming at ~30 Hz.&lt;/li&gt;
&lt;li&gt;Sensor samples are buffered in memory (&lt;code&gt;src/sensors/accelerometer.ts&lt;/code&gt;),
converted from &lt;code&gt;g&lt;/code&gt; to &lt;code&gt;m/s^2&lt;/code&gt;, timestamped from the native sensor event, and
pruned to the last ~75 seconds.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;activityService&lt;/code&gt; treats a CPM window as ready only when it spans nearly 60
seconds, allowing one configured sensor interval of tolerance.&lt;/li&gt;
&lt;li&gt;Every 60 seconds, &lt;code&gt;activityService&lt;/code&gt; reads the most recent ready window and
calls &lt;code&gt;computeCpmFrom60s(...)&lt;/code&gt; in &lt;code&gt;src/model/inferenceActivity.ts&lt;/code&gt;, which
consumes the collected 30 Hz window directly.&lt;/li&gt;
&lt;li&gt;When CPM computation succeeds, one row is written to &lt;code&gt;cpm_history&lt;/code&gt; in SQLite
through &lt;code&gt;src/db/cpmDb.ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Callers such as &lt;code&gt;predictionHeatRisk&lt;/code&gt; and &lt;code&gt;PredictionCoreTempCard&lt;/code&gt; consume
&lt;code&gt;getActivityCpm40Average()&lt;/code&gt; from &lt;code&gt;activityService&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="readiness-contract-getactivitycpm40average"&gt;Readiness Contract (&lt;code&gt;getActivityCpm40Average&lt;/code&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Window: last 40 minutes.&lt;/li&gt;
&lt;li&gt;Minimum history: at least 35 rows.&lt;/li&gt;
&lt;li&gt;Freshness: latest row must be &amp;lt;= 2 minutes old.&lt;/li&gt;
&lt;li&gt;Return: average CPM when ready, otherwise &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="supporting-references"&gt;Supporting References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Schema: &lt;a href="https://safer-capstone.pages.dev/developer-docs/overview/schemas/cpm-history"&gt;schemas/cpm-history.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Diagram: &lt;a href="../diagrams/activity-cpm-pipeline.mmd"&gt;../diagrams/activity-cpm-pipeline.mmd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="invariants"&gt;Invariants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Model behavior lives in &lt;code&gt;src/model/inferenceActivity.ts&lt;/code&gt;; orchestration should
stay in &lt;code&gt;activityService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The model consumes the collected 30 Hz window directly; there is no separate
60 Hz downsampling stage.&lt;/li&gt;
&lt;li&gt;Each successful minute tick produces at most one persisted CPM row.&lt;/li&gt;
&lt;li&gt;Storage shape, retention, and query ordering live in the schema doc.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>context/DailyWorkAreaContext.ts</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/context/dailyworkareacontext/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/context/dailyworkareacontext/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;DailyWorkAreaProvider&lt;/code&gt; manages the full lifecycle of the application&amp;rsquo;s “daily work area” workflow.&lt;/p&gt;
&lt;p&gt;The provider coordinates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prompting the user to define a work area,&lt;/li&gt;
&lt;li&gt;restoring prior work-area selections,&lt;/li&gt;
&lt;li&gt;launching the work-area editor modal,&lt;/li&gt;
&lt;li&gt;pre-caching weather data for relevant geographic regions,&lt;/li&gt;
&lt;li&gt;seeding map state from device location,&lt;/li&gt;
&lt;li&gt;and exposing shared work-area state through React context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This module acts as the orchestration layer between:&lt;/p&gt;</description></item><item><title>components/DailyWorkAreaModal.tsx</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/components/dailyworkareamodal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/components/dailyworkareamodal/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;This module implements a full-screen React Native modal for defining and editing a user&amp;rsquo;s “daily work area” using an interactive map interface.&lt;/p&gt;
&lt;p&gt;The component combines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;map-based geographic selection&lt;/li&gt;
&lt;li&gt;address autocomplete and geocoding&lt;/li&gt;
&lt;li&gt;adjustable radius selection&lt;/li&gt;
&lt;li&gt;work-area persistence actions&lt;/li&gt;
&lt;li&gt;accessibility support&lt;/li&gt;
&lt;li&gt;safe-area aware mobile layout behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The modal allows a user to:&lt;/p&gt;</description></item><item><title>Introduction</title><link>https://safer-capstone.pages.dev/user-guide/getting-started/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/getting-started/introduction/</guid><description>&lt;h2 id="what-is-safer"&gt;What is SAFER?&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;h2 id="who-is-this-guide-for"&gt;Who is this guide for?&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;h2 id="how-this-guide-is-organised"&gt;How this guide is organised&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Section&lt;/th&gt;
 &lt;th&gt;What you&amp;rsquo;ll find&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Getting Started&lt;/td&gt;
 &lt;td&gt;Installation and first login&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The Map View&lt;/td&gt;
 &lt;td&gt;Navigating the live map and reading unit icons&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Incident Management&lt;/td&gt;
 &lt;td&gt;Creating, assigning, and closing incidents&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Settings&lt;/td&gt;
 &lt;td&gt;Account preferences and notification options&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="getting-help"&gt;Getting help&lt;/h2&gt;
&lt;p&gt;CHANGE ME
If something in this guide is unclear, please open a
&lt;a href="https://github.com/M1ha1lM/SAFER-Capstone/issues"&gt;GitHub issue&lt;/a&gt; so we can
improve it.&lt;/p&gt;</description></item><item><title>api/ndfdWeather.ts</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/api/ndfdweather/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/api/ndfdweather/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;This module fetches, validates, and normalizes hourly weather forecast data from the NOAA NDFD (National Digital Forecast Database) XML API into a strongly typed internal format.&lt;/p&gt;
&lt;p&gt;Its responsibilities include:&lt;/p&gt;</description></item><item><title>Daily Work Area</title><link>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/daily-work-area-precache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/daily-work-area-precache/</guid><description>&lt;h1 id="daily-work-area-pre-cache-behavior"&gt;Daily Work-Area Pre-Cache Behavior&lt;/h1&gt;
&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;This document defines the once-per-day work-area screen flow that pre-warms
weather cache entries from a farmer-selected circular work area.&lt;/p&gt;
&lt;h2 id="canonical-flow"&gt;Canonical Flow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;When the Home/work-area screen becomes focused, the app checks whether the
local calendar day has already shown the work-area pre-cache modal.&lt;/li&gt;
&lt;li&gt;If the day has not shown the modal, a blocking full-screen modal asks the
farmer to define today’s work area by tapping a map center point, selecting
an address suggestion, or finding a typed address, then choosing a radius.&lt;/li&gt;
&lt;li&gt;The modal seeds from today’s saved area first; otherwise it pre-fills from
the most recent prior work area within the fallback window; otherwise it
opens centered on Sacramento and may recenter once to current device location
if foreground permission succeeds before the farmer edits.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Save today’s area&lt;/code&gt; persists one &lt;code&gt;DailyWorkAreaCircle&lt;/code&gt; for the current local
day and marks the day handled.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Use previous work day&lt;/code&gt; is available only when a saved work area exists
within the previous 7 local calendar days; it does not create a new circle
for today, but it does mark today handled after pre-cache runs.&lt;/li&gt;
&lt;li&gt;A top-right &lt;code&gt;Close&lt;/code&gt; action is available only when no recent fallback exists;
it dismisses the already-shown daily prompt without warming weather cells.&lt;/li&gt;
&lt;li&gt;The chosen circle is expanded by one weather-cache cell (&lt;code&gt;2.5 km&lt;/code&gt;) for
safety, converted into deduped cache-cell center points, and passed to
&lt;code&gt;precacheWeatherForLocations(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;precacheWeatherForLocations(...)&lt;/code&gt; warms one forecast cell per unique
location by fetching and storing a fresh 24-hour forecast horizon for that
cell.&lt;/li&gt;
&lt;li&gt;Manual reopen/edit from Home uses the same modal and re-runs pre-cache when
the farmer saves a new circle later that day.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="persistence-rules"&gt;Persistence Rules&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;One circle is stored per local day key (&lt;code&gt;YYYY-MM-DD&lt;/code&gt; in device-local time).&lt;/li&gt;
&lt;li&gt;Prompt-shown state is stored separately from daily circles so app launch alone
cannot suppress the work-area prompt before the farmer reaches the
Home/work-area screen.&lt;/li&gt;
&lt;li&gt;Fallback lookup only considers the most recent prior saved work day within 7
days.&lt;/li&gt;
&lt;li&gt;Daily pre-cache treats the current hour as part of the horizon when the
upstream NDFD response includes it; otherwise it accepts the next 24
contiguous forecast hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="invariants"&gt;Invariants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Daily work-area pre-caching does not change prediction weather sourcing;
foreground and background predictions still use live device location.&lt;/li&gt;
&lt;li&gt;Pre-cache writes must go through &lt;code&gt;precacheWeatherForLocations(...)&lt;/code&gt;, which
uses a dedicated fetch/store warming path rather than the single-hour
&lt;code&gt;getWeatherPointCached(...)&lt;/code&gt; lookup contract.&lt;/li&gt;
&lt;li&gt;The modal is blocking only for the first focused Home/work-area screen visit
of the local day where the modal has not already appeared; later edits are
user-initiated from Home and are dismissible.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>components/Dashboard.ts</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/components/dashboard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/components/dashboard/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;This module implements an interactive physiological temperature history dashboard for React Native.&lt;/p&gt;
&lt;p&gt;It visualizes historical core body temperature data using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a zoomable time-series chart&lt;/li&gt;
&lt;li&gt;dynamic Y-axis scaling&lt;/li&gt;
&lt;li&gt;pinch-to-zoom gestures&lt;/li&gt;
&lt;li&gt;scrollable historical navigation&lt;/li&gt;
&lt;li&gt;adaptive tick labeling&lt;/li&gt;
&lt;li&gt;physiological temperature-zone overlays&lt;/li&gt;
&lt;li&gt;localized time formatting&lt;/li&gt;
&lt;li&gt;unit-system conversion support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The dashboard is designed for mobile performance and readability across a wide range of time spans, from one hour to one week.&lt;/p&gt;</description></item><item><title>IOS Installation</title><link>https://safer-capstone.pages.dev/user-guide/getting-started/installation/ios/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/getting-started/installation/ios/</guid><description>&lt;h2 id="accessing-safer"&gt;Accessing SAFER&lt;/h2&gt;
&lt;p&gt;SAFER runs in your web browser. No software installation is needed for
day-to-day use.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open your browser and navigate to the URL provided by your administrator.&lt;/li&gt;
&lt;li&gt;You will be greeted by the SAFER login screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="supported-browsers"&gt;Supported browsers&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Browser&lt;/th&gt;
 &lt;th&gt;Minimum version&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Chrome / Edge&lt;/td&gt;
 &lt;td&gt;110+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Firefox&lt;/td&gt;
 &lt;td&gt;110+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Safari&lt;/td&gt;
 &lt;td&gt;16+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="alert alert-info" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Note&lt;/div&gt;
&lt;p&gt;SAFER requires JavaScript to be enabled. If you see a blank page, check that
your browser has not blocked scripts for this site.&lt;/p&gt;</description></item><item><title>Local Setup</title><link>https://safer-capstone.pages.dev/developer-docs/local-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/local-setup/</guid><description>&lt;h2 id="prerequisites-for-safer-for-iosandroid"&gt;Prerequisites for SAFER for IOS/Android&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On your system ensure that you have node installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are making an &lt;strong&gt;Android&lt;/strong&gt; an android build, ensure that you have the SDK
installed and that the &lt;code&gt;ANDROID_HOME&lt;/code&gt; environment variable is set&lt;/p&gt;</description></item><item><title>Reason behind the Daily Work Popup</title><link>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-prd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-prd/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;The daily work area popup is currently tied too closely to the first app open
for a calendar day. If the app opens and the relevant work area screen is not
reached, the popup can be skipped for that day even though the user has not
actually seen it.&lt;/p&gt;</description></item><item><title>Testing of the Daily Work Popup</title><link>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-test-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/daily-work-area-popup/daily-work-area-popup-test-plan/</guid><description>&lt;h1 id="test-plan-daily-work-area-popup"&gt;Test Plan: Daily Work Area Popup&lt;/h1&gt;
&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;This plan verifies the daily work area popup behavior described in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docs/daily-work-area-popup/daily-work-area-popup-prd.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs/daily-work-area-popup/daily-work-area-popup-architecture.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main claim to prove is that the popup is gated by whether it has actually
popped up for the current local day, not by whether the app has opened today.&lt;/p&gt;</description></item><item><title>Weather Caching</title><link>https://safer-capstone.pages.dev/developer-docs/overview/schemas/weather-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/schemas/weather-cache/</guid><description>&lt;h1 id="weather-cache-schema"&gt;Weather Cache Schema&lt;/h1&gt;
&lt;h2 id="database"&gt;Database&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;File: &lt;code&gt;weather_cache.db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Engine: &lt;code&gt;expo-sqlite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Journal mode: &lt;code&gt;WAL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="table-forecast_points"&gt;Table: &lt;code&gt;forecast_points&lt;/code&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Column&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Null&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cell_id&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TEXT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spatial cache bucket key from lat/lon.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;forecast_time&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TEXT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Canonical UTC hour key (&lt;code&gt;toHourKey(...)&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;valid_to&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;INTEGER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Expiration timestamp in epoch milliseconds.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;payload&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TEXT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;JSON-serialized &lt;code&gt;WeatherPoint&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;last_accessed&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;INTEGER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Epoch milliseconds for LRU eviction.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Primary key:&lt;/p&gt;</description></item><item><title>Environment</title><link>https://safer-capstone.pages.dev/developer-docs/environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/environment/</guid><description>&lt;h2 id="environment-variable-files"&gt;Environment Variable Files&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You can make any number of environment variables in the root of the main SAFER
for IOS and SAFER for Android repo. The default, and recommended is: &lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="specifying-the-variables"&gt;Specifying the Variables&lt;/h2&gt;
&lt;p&gt;To specify the variable, within your environment file simply put the
variable name followed by an equals and the value:&lt;/p&gt;</description></item><item><title>components/PredictionCoreTempCard.ts</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/components/predictioncoretempcard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/components/predictioncoretempcard/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;This component renders a real-time “Predicted Core Body Temperature” card that combines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;environmental heat stress (&lt;code&gt;WBGT&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;user physiological profile data&lt;/li&gt;
&lt;li&gt;recent physical activity intensity&lt;/li&gt;
&lt;li&gt;ML/ONNX-based inference&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to estimate a user&amp;rsquo;s current core body temperature and heat-risk state.&lt;/p&gt;</description></item><item><title>Usage Guide</title><link>https://safer-capstone.pages.dev/user-guide/usage/basic-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/usage/basic-usage/</guid><description>&lt;h2 id="what-is-safer"&gt;What is SAFER?&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;h2 id="who-is-this-guide-for"&gt;Who is this guide for?&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;h2 id="how-this-guide-is-organised"&gt;How this guide is organised&lt;/h2&gt;
&lt;p&gt;CHANGE ME&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Section&lt;/th&gt;
 &lt;th&gt;What you&amp;rsquo;ll find&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Getting Started&lt;/td&gt;
 &lt;td&gt;Installation and first login&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The Map View&lt;/td&gt;
 &lt;td&gt;Navigating the live map and reading unit icons&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Incident Management&lt;/td&gt;
 &lt;td&gt;Creating, assigning, and closing incidents&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Settings&lt;/td&gt;
 &lt;td&gt;Account preferences and notification options&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="getting-help"&gt;Getting help&lt;/h2&gt;
&lt;p&gt;CHANGE ME
If something in this guide is unclear, please open a
&lt;a href="https://github.com/M1ha1lM/SAFER-Capstone/issues"&gt;GitHub issue&lt;/a&gt; so we can
improve it.&lt;/p&gt;</description></item><item><title>Wear OS Installation</title><link>https://safer-capstone.pages.dev/user-guide/getting-started/installation/wearos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/getting-started/installation/wearos/</guid><description>&lt;h2 id="accessing-safer"&gt;Accessing SAFER&lt;/h2&gt;
&lt;p&gt;Give up&lt;/p&gt;</description></item><item><title>Weather Caching Behavior</title><link>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/weather-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/overview/behaviors/weather-cache/</guid><description>&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;This document defines the runtime lookup policy for &lt;code&gt;getWeatherPointCached(...)&lt;/code&gt;
in &lt;code&gt;src/services/weatherService.ts&lt;/code&gt;. Daily work-area pre-warming uses the same
weather service module but follows its own dedicated 24-hour horizon warming
path through &lt;code&gt;precacheWeatherForLocations(...)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>WatchOS Installation</title><link>https://safer-capstone.pages.dev/user-guide/getting-started/installation/watchos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/user-guide/getting-started/installation/watchos/</guid><description>&lt;h2 id="accessing-safer"&gt;Accessing SAFER&lt;/h2&gt;
&lt;p&gt;You can&amp;rsquo;t, it doesn&amp;rsquo;t yet exist&lt;/p&gt;</description></item><item><title>components/TestCoreTempCard.ts</title><link>https://safer-capstone.pages.dev/developer-docs/api-reference/components/testcoretempcard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://safer-capstone.pages.dev/developer-docs/api-reference/components/testcoretempcard/</guid><description>&lt;h1 id="purpose"&gt;Purpose&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;TestCoreTempCard&lt;/code&gt; is a lightweight developer/testing component used to manually validate the core temperature inference pipeline.&lt;/p&gt;
&lt;p&gt;The component provides a deterministic test harness around &lt;code&gt;runCoreTempInference&lt;/code&gt; by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Supplying a fixed set of known inputs&lt;/p&gt;</description></item></channel></rss>