Arabic-first civic map for reading NASA FIRMS thermal signals in Tunisia and submitting private field observations.
# Fireline TN | عين على الغابة
Arabic-first civic map for reading NASA FIRMS thermal signals in Tunisia and
submitting one private, bounded field observation.
Fireline TN does not confirm fires, dispatch responders, or replace the
Protection civile and forestry services. A satellite signal is a lead to
check, not incident evidence.
## What the first version does
- Shows the newest server-fetched S-NPP, NOAA-20, and NOAA-21 VIIRS thermal
signals over OpenStreetMap.
- Defaults to a rolling 24-hour view and keeps the preceding 48 hours behind
an explicit history view.
- Prioritizes freshness, repeated nearby observations, then fire radiative
power without presenting the result as a danger score.
- Clusters nearby markers and refreshes the visible feed every 15 minutes.
- Resolves an approximate place only after a marker is selected.
- Lets a person answer smoke, flames, nothing visible, or cannot tell.
- Stores the selected signal coordinates, never the observer position.
- Keeps every citizen observation private and unverified.
- Uses Arabic by default with a persistent French switch.
It deliberately has no image uploads, free-form public pins, report counts,
public citizen content, moderation dashboard, dispatch integration, or
authority portal.
## Local setup
Requirements: Node.js 22 and pnpm.
```bash
pnpm install
cp .env.example .env.local
pnpm dev
```
Open `
localhost`.
Without `FIRMS_MAP_KEY`, the map shows a clearly labelled historical
demonstration. Without Supabase values, the complete map remains usable and
verification returns an inline unavailable state.
## Environment
```text
FIRMS_MAP_KEY=
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
```
`FIRMS_MAP_KEY` remains server-only. The Supabase anonymous key is intentionally
public and limited by row-level security.
## Data and safety boundaries
`/api/hotspots` fetches and caches NASA FIRMS data server-side. `/api/place`
calls Nominatim only after selection and caches the app …