← CasosCases

Caso de estudio UX/UI & FrontendUX/UI & Frontend case study · CIREN · CONAF · INFOR · 2024

SIMEF Móvil: plataforma de monitoreo de bosque nativoSIMEF Mobile: a native forest monitoring platform

De un prototipo de alta fidelidad validado en terreno a una arquitectura de software escalable en React + TypeScript + Vite, integrando geolocalización satelital y autenticación institucional.

From a high-fidelity prototype validated in the field to a scalable software architecture in React + TypeScript + Vite, integrating satellite geolocation and government sign-in.

React 19 + ViteTypeScriptMapLibre / Mapbox GLOffline Sync (PWA)Tailwind CSSZustandOAuth2 / OIDC
1

Las pantallasThe screens

Acceso oficial con ClaveÚnica o credencial institucional, y la vista de terreno: el mapa con los polígonos de cada rodal, la posición GPS del brigadista y una ficha con superficie, vigor NDVI (Sentinel-2) y elevación, más el protocolo de monitoreo paso a paso.

Official sign-in with ClaveÚnica or institutional credentials, and the field view: a map with each stand's polygon, the ranger's GPS position and a card with area, NDVI vigor (Sentinel-2) and elevation, plus the step-by-step monitoring protocol.

SIMEF Móvil: pantalla de acceso y vista de rodal en el mapa
2

Proceso en dos fasesA two-phase process

Primero validar con quienes usan la app en terreno; después programar sobre un diseño ya probado.

Validate with the people who use the app in the field first; then build on a design that's already proven.

01

Fase Test — Prototipo funcionalTest phase — Functional prototype

Validación de valor, ergonomía y contrasteValidating value, ergonomics and contrast

  • Validación con brigadistas y guardaparques: se comprobó el contraste bajo el sol en terreno sin gastar semanas configurando paquetes o servidores.
  • Diseño atómico definido: tipografías, tokens de espaciado y paletas institucionales (CIREN, CONAF, ClaveÚnica) quedaron cerrados.
  • Cero desperdicio en refactorización: cambiar un botón o el tamaño del mapa en esta etapa toma minutos, no días de refactorizar hooks y estado.
  • Validated with rangers and park wardens: sunlight contrast was checked in the field without spending weeks setting up packages or servers.
  • Atomic design locked in: typography, spacing tokens and institutional palettes (CIREN, CONAF, ClaveÚnica) were finalized.
  • No refactoring waste: changing a button or map size at this stage takes minutes, not days of reworking hooks and state.
02

Fase React — Desarrollo realReact phase — Production build

Modularidad, persistencia offline y rendimientoModularity, offline persistence and performance

  • Componentes desacoplados: cada sección del prototipo se convirtió en un componente reutilizable (formulario de acceso, mapa, ficha de rodal, métricas).
  • Estado offline (PWA): React Query + IndexedDB para guardar los polígonos satelitales cuando no hay señal en la cordillera.
  • Seguridad institucional: manejo de tokens OAuth2 / OIDC para ClaveÚnica y credenciales de funcionarios públicos.
  • Decoupled components: each prototype section became a reusable component (sign-in form, map, stand card, metrics).
  • Offline state (PWA): React Query + IndexedDB to keep satellite polygons when there's no signal in the mountains.
  • Government-grade security: OAuth2 / OIDC token handling for ClaveÚnica and civil-servant credentials.
3

Arquitectura del códigoCode architecture

stack: vite + react-ts + tailwindcss + zustand

simef-forest-app/src/ ├── components/ │ ├── auth/ ClaveUnicaForm, InstLogin │ ├── map/ ForestMap, RodalPolygons, GPSMarker │ ├── telemetry/ NdviMetrics, ElevationBadge │ └── ui/ Button, Modal, Toast, Drawer ├── hooks/ │ ├── useGeolocation.ts precisión GPS │ ├── useOfflineSync.ts sincronización │ └── useForestData.ts capas CIREN ├── store/ │ └── useSurveyStore.ts Zustand ├── types/ │ └── simef.d.ts GeoJSON, Rodales, Especies ├── App.tsx └── main.tsx
// src/components/telemetry/RodalCard.tsx
interface RodalProps {
  id: string;
  especie: string;
  hectareas: number;
  ndvi: number;
  onSelectParcel: (id: string) => void;
}

export const RodalCard: React.FC<RodalProps> = ({
  id, especie, hectareas, ndvi, onSelectParcel
}) => (
  <div className="bg-white rounded-2xl p-4 shadow-xl">
    <div className="flex items-center justify-between">
      <span className="text-xs font-bold text-emerald-800">{id}</span>
      <span className="text-[10px] bg-emerald-50 px-2 rounded">
        NDVI: {ndvi}
      </span>
    </div>
    <h4 className="font-bold text-slate-900 mt-1">{especie}</h4>
    <p className="text-xs text-slate-500">{hectareas} ha nativas</p>
    <button
      onClick={() => onSelectParcel(id)}
      className="w-full mt-3 py-2 bg-emerald-700 text-white rounded-xl">
      Ingresar Ficha Terreno
    </button>
  </div>
);
4

ConclusiónTakeaway

Diseñar primero el entorno de prueba permitió validar la app con guardaparques en zonas remotas de Chile antes de programar, y migrar la interfaz a React manteniendo la coherencia visual del prototipo en la integración geoespacial.
Designing the test environment first let us validate the app with park rangers in remote areas of Chile before writing code, then migrate the UI to React while keeping the prototype's visual consistency through the geospatial integration.