Example app · Starter and Pro

Expo weather demo app: forecast and widget

A finished Expo app in the tree you receive. Starter and Pro open on it, so the first run shows location, a widget, a forecast and native navigation working together, with no account and no API key.

Screens

What it is

Starter and Pro open on this app, so the first bun ios shows the modules working together instead of an empty screen.

It is demo content. bun run setup removes the weather screens and leaves a plain welcome screen; --with-examples keeps them.

The screens are in src/screens/weather/, the Open-Meteo client in src/lib/weather/, the forecast hook in src/hooks/use-forecast.ts, and saved cities and units in src/stores/weather.ts.

Flows included

Built on

The demo's UI uses the @/ui primitives only, so it renders the same on every UI option. The saved cities go through the storage module, not a state library.

What works without keys

Keys and credentials

Nothing. This example needs no credential to run.

Limitations

Tier

Starter and Pro. The free tier has no weather demo: its fixed stack pins location and widgets to none (FREE_SELECTION in packages/cli/lib/tier.ts), and it ships no examples folder.

From the source

From apps/template/src/lib/weather/api.ts:

async function getJson<T>(url: string, signal?: AbortSignal): Promise<T> {
  const response = await fetch(url, { signal });
  if (!response.ok)
    throw new WeatherError(`Open-Meteo answered ${response.status}`, response.status);
  return (await response.json()) as T;
}

Read more