---
{
  "title": "FHIR FUSE: FHIR al estilo Unix",
  "description": "¿Y si trabajar con FHIR no empezara con APIs y clientes, sino con archivos y carpetas? Este artículo explora FHIR-FUSE, una interfaz de sistema de archivos para servidores FHIR, qué facilita y dónde quedan claros sus límites.",
  "date": "2025-12-23",
  "author": "Marat Surmashev, Aleksandr Penskoi",
  "reading-time": "10 minutes",
  "tags": [
    "System Design",
    "FHIR Tools"
  ],
  "tldr": "FHIR-FUSE es una interfaz de sistema de archivos para servidores FHIR construida sobre FUSE, que permite trabajar con datos sanitarios usando herramientas Unix estándar como grep, sed y jq. Sin APIs ni clientes personalizados: simplemente haga cd a su servidor FHIR y empiece a explorar."
}
---

> For the complete documentation index, see [llms.txt](https://www.health-samurai.io/llms.txt).
> Use it to discover all available pages before guessing URLs.

---
Durante décadas, los sistemas Unix se han construido sobre una filosofía sencilla pero poderosa: **todo es un archivo**. Esta abstracción permite que pequeñas utilidades especializadas se combinen sin esfuerzo. ¿Necesita procesar datos? Encadene un comando con otro. Use `grep`, `sed`, `jq`, `diff` y otras herramientas estándar que ya conoce.

¿Y si trabajar con datos FHIR siguiera el mismo estilo Unix? Sin APIs complejas, sin dolores de cabeza con la autenticación, sin herramientas propietarias — solo su editor de texto favorito, los comandos Unix estándar y una carpeta llena de recursos FHIR. FHIR-FUSE lleva esta filosofía Unix a la interoperabilidad sanitaria.

## Resumen rápido
- FHIR-FUSE mapea datos sanitarios a conceptos del sistema de archivos, permitiendo usar herramientas Unix en lugar de clientes de API
- El descubrimiento dinámico, la carga diferida y las abstracciones intuitivas simplifican la exploración de FHIR
- Ideal para desarrollo, aprendizaje, análisis de datos y migraciones — no para sistemas de producción con alta carga
- Aporta décadas de sabiduría de composición Unix a la interoperabilidad sanitaria

## El reto del hackathon navideño

Cada año, nuestro hackathon navideño reúne a entusiastas de la salud para explorar ideas audaces que amplían los límites de la informática sanitaria. Este año nos planteamos una pregunta provocadora: **¿Y si pudiéramos eliminar la fricción entre los desarrolladores y los datos FHIR?**

En la práctica, los desarrolladores sanitarios dedican incontables horas a escribir clientes de API, gestionar la autenticación, manejar la paginación, parsear respuestas JSON y depurar peticiones HTTP. ¿Pero y si nada de eso fuera necesario? ¿Y si pudiera simplemente hacer `cd` a su servidor FHIR y empezar a trabajar?

El resultado fue **FHIR-FUSE**: una interfaz de sistema de archivos para servidores FHIR construida sobre FUSE (Filesystem in Userspace). Puede explorar el proyecto completamente de código abierto en [GitHub](https://github.com/healthsamurai/fhir-fuse).

## Reimaginando FHIR como un sistema de archivos

Trabajar con FHIR normalmente implica APIs, clientes y lógica de peticiones — pero los propios datos ya tienen una estructura clara. La idea central de FHIR-FUSE es simple: **los recursos FHIR ya se mapean de forma natural a conceptos del sistema de archivos.**
- **Tipos de recurso** (Patient, Observation, Encounter) → **Directorios**
- **Recursos individuales** → **Archivos JSON**
- **IDs de recurso** → **Nombres de archivo**
- **Operaciones CRUD** → **Operaciones de archivo** (crear, leer, actualizar, eliminar)
- **Consultas de búsqueda** → **Directorios especiales**
- **Historial de recursos** → **Carpetas de versiones ocultas**
- **Operaciones** → **Archivos especiales**

Este modelo mental es intuitivo para cualquiera que haya trabajado alguna vez con archivos. En lugar de aprender otra API más, se aprovecha el conocimiento que ya se tiene.

### La estructura del sistema de archivos

Cuando monta un servidor FHIR con FHIR-FUSE, verá una estructura de sistema de archivos virtual como esta:


```javascript
./mnt/
├── README.md                          # Documentation
├── Patient/                           # Resource type directory
│   ├── patient-001.json               # Individual resources
│   ├── patient-002.json
│   ├── .patient-001/                  # Hidden history folder
│   │   ├── 1.json                     # Version 1
│   │   ├── 2.json                     # Version 2
│   │   └── 3.json                     # Version 3
│   └── _search/                       # Search directory
│       └── name=Smith/                # Search query
│           └── Patient/
│               └── patient-003.json
├── Observation/
│   ├── observation-001.json
│   └── _search/
└── ViewDefinition/
    ├── patient_demographics.json
    └── $run/                          # Operation directory
        └── patient_demographics.csv   # Operation results
```


Cada directorio y archivo de esta estructura de sistema de archivos virtual se **genera dinámicamente** en función de las capacidades del servidor FHIR, o es creado por archivos o directorios del usuario.

## Principios de diseño

Tratar un servidor FHIR como un sistema de archivos suena sencillo en teoría, pero plantea preguntas prácticas. ¿Cómo se gestionan distintos servidores, grandes conjuntos de datos y esquemas en evolución? FHIR-FUSE responde a estas preguntas a través de varios principios de diseño fundamentales.

### 1. Descubrimiento dinámico

FHIR-FUSE no tiene tipos de recurso codificados de forma fija. En cambio, consulta el `CapabilityStatement` del servidor al arrancar para descubrir qué recursos están disponibles. Esto significa que funciona con **cualquier servidor [FHIR R4](/articles/fhir-r4-vs-fhir-r5-choosing-the-right-version-for-your-implementation)** desde el primer momento — ya sea Aidbox, HAPI FHIR o una implementación personalizada.


```javascript
pub async fn fetch_capability_statement(
    client: &Client,
    fhir_base_url: &str,
) -> anyhow::Result<ServerCapabilities> {
    let url = format!("{}/metadata", fhir_base_url);
    let response = client.get(&url).send().await?;
    let capability_statement: CapabilityStatement = response.json().await?;
    ServerCapabilities::from_capability_statement(capability_statement)
}
```


El sistema de archivos crea automáticamente directorios para cada tipo de recurso soportado, haciendo que las capacidades del servidor sean inmediatamente visibles y explorables.

### 2. Carga diferida

Los conjuntos de datos sanitarios pueden ser enormes. Cargar todos los recursos de antemano sería prohibitivamente lento y consumiría demasiada memoria. FHIR-FUSE utiliza **carga diferida** en todo momento:
- Los **listados de directorios** se obtienen solo cuando se ejecuta `ls` en un directorio
- El **contenido de los recursos** se carga solo cuando se lee un archivo
- Los **resultados de búsqueda** se almacenan en caché durante unos segundos para evitar consultas redundantes
- Las **versiones del historial** se obtienen bajo demanda cuando se accede a las carpetas ocultas

Esto mantiene el sistema de archivos ágil incluso cuando se trabaja con servidores que contienen millones de recursos.

### 3. Abstracciones intuitivas

La interfaz del sistema de archivos mapea los conceptos FHIR a operaciones de archivo familiares.

**Crear un recurso:**


```javascript
# Create a new patient with basic demographics
echo '{"resourceType":"Patient","name":[{"family":"Smith"}]}' > ./mnt/Patient/new-patient.json
```


**Leer un recurso:**


```javascript
# View a patient record
cat ./mnt/Patient/patient-001.json | jq .
```


**Actualizar un recurso:**


```javascript
# Edit with your favorite editor
vim ./mnt/Patient/patient-001.json

# Or use jq for programmatic updates
jq '.active = true' ./mnt/Patient/patient-001.json > temp.json
mv temp.json ./mnt/Patient/patient-001.json
```


**Eliminar un recurso:**


```javascript
# Remove a patient record
rm ./mnt/Patient/patient-001.json
```


Sin clientes HTTP, sin tokens de autenticación en los scripts — solo herramientas Unix estándar.

### 4. Búsqueda como creación de directorios

Una de las decisiones de diseño más elegantes de FHIR-FUSE es la forma en que gestiona la búsqueda en FHIR. En lugar de un lenguaje de consulta separado o un comando específico, **se crea un directorio con los parámetros de búsqueda en su nombre:**


```javascript
# Search for female patients named Smith
mkdir -p "./mnt/Patient/_search/name=Smith&gender=female"

# View search results
ls "./mnt/Patient/_search/name=Smith&gender=female/Patient/"
cat "./mnt/Patient/_search/name=Smith&gender=female/Patient/patient-003.json"
```


El nombre del directorio **es la consulta**. Cuando se crea el directorio, FHIR-FUSE ejecuta la búsqueda y lo puebla con los resultados. Como consecuencia:
- Las búsquedas son **descubribles** (se pueden ver búsquedas anteriores con `ls`)
- Se habilita el **almacenamiento en caché de resultados** (el directorio persiste hasta que se elimina)
- Se admiten **consultas complejas** con múltiples parámetros
- Los parámetros **_include** se gestionan de forma natural (los resultados aparecen en subdirectorios por tipo de recurso)

### 5. Operaciones como directorios especiales

Una de las partes más importantes de FHIR son las operaciones. Algunas de ellas pueden representarse como directorios en el sistema de archivos. Para comprobar esta hipótesis, intentamos implementar la operación `$run` como un directorio que ejecuta [ViewDefinition](https://build.fhir.org/ig/FHIR/sql-on-fhir-v2/) y devuelve los resultados.


```javascript
# List available ViewDefinitions
ls ./mnt/ViewDefinition/

# Execute a ViewDefinition
touch "./mnt/ViewDefinition/\$run/patient_demographics.json"

# Read the results
cat "./mnt/ViewDefinition/\$run/patient_demographics.json" | jq .

# Get CSV output
touch "./mnt/ViewDefinition/\$run/patient_demographics.csv"
cat "./mnt/ViewDefinition/\$run/patient_demographics.csv"
```


El comando `touch` desencadena la ejecución y leer el archivo devuelve los resultados. Las distintas extensiones de archivo solicitan diferentes formatos de salida.

## Perspectivas de implementación

Hasta ahora nos hemos centrado en cómo se comporta FHIR-FUSE desde el exterior: cómo los recursos FHIR aparecen como archivos, cómo las búsquedas funcionan como directorios y cómo se pueden usar las herramientas Unix estándar para explorar datos.

Bajo el capó, hacer funcionar esta abstracción requiere una coordinación cuidadosa entre la semántica del sistema de archivos y las APIs HTTP de FHIR. Esta sección describe las decisiones de implementación clave que permiten a FHIR-FUSE mantenerse ágil, predecible y compatible con distintos servidores FHIR.

### Arquitectura del sistema de archivos virtual

FHIR-FUSE está construido sobre **FUSE** (Filesystem in Userspace), que permite implementar un sistema de archivos completamente en espacio de usuario sin modificaciones del kernel. La arquitectura consta de varios componentes clave:

**1. Índice de inodos**

Cada archivo y directorio del sistema de archivos tiene un número de inodo único. Mantenemos un índice en memoria que mapea inodos a entradas del sistema de archivos virtual:


```javascript
pub enum VFSEntry {
    Directory(Directory),             // /Patient
    TextFile(TextFile),               // /README.md
    FHIRResource(FHIRResource),       // /Patient/pt-1.json
    ResourceVersion(ResourceVersion), // /Patient/.pt-1/1.json
    SearchPath(SearchPath),           // /Patient/_search
    SearchQuery(SearchQuery),         // /Patient/_search/gender=female
    SearchResultGroup(SearchResultGroup),
    OperationPath(OperationPath),     // /ViewDefinition/$run
    OperationExecution(OperationExecution),
}
```


Este enum captura todos los tipos posibles de entradas del sistema de archivos, cada uno con su propio comportamiento y atributos.

**2. Listados de directorios dinámicos**

Cuando se lista un directorio, FHIR-FUSE genera dinámicamente el listado en función del tipo de directorio:
- **Directorio raíz**: Muestra los directorios de tipos de recurso del capability statement
- **Directorio de tipo de recurso**: Obtiene recursos del servidor FHIR (con paginación)
- **Directorio de búsqueda**: Muestra consultas de búsqueda anteriores
- **Directorio de consulta de búsqueda**: Muestra subdirectorios de tipos de recurso con resultados
- **Directorio de historial**: Muestra todas las versiones de un recurso específico

**3. Estrategia de caché**

Para equilibrar la capacidad de respuesta con la frescura de los datos, FHIR-FUSE implementa caché basada en tiempo:


```javascript
const TTL: Duration = Duration::from_secs(30);
const CACHE_DURATION: Duration = Duration::from_secs(5);
```


En la práctica, esto significa:
- Los listados de directorios se almacenan en caché durante 5 segundos
- Los atributos de archivo (tamaño, fecha de modificación) tienen un TTL de 30 segundos
- Los resultados de búsqueda se almacenan en caché hasta que se actualizan explícitamente
- El contenido de los recursos siempre se obtiene de forma fresca al leerlos para garantizar la exactitud

**4. Obtención paralela de recursos**

Al cargar un directorio de tipo de recurso, FHIR-FUSE obtiene múltiples páginas en paralelo:


```javascript
pub async fn fetch_resources_parallel(
    client: &Client,
    fhir_base_url: &str,
    resource_type: &str,
) -> anyhow::Result<Vec<Value>> {
    // Discover pagination structure from first page
    let bundle = fetch_first_page(client, fhir_base_url, resource_type).await?;

    // Generate all page URLs
    let page_urls = generate_page_urls(&bundle, MAX_PAGES);

    // Fetch all pages concurrently
    let results = stream::iter(page_urls)
        .map(|url| fetch_page_by_url(&client, &url))
        .buffer_unordered(MAX_CONCURRENT_FETCHES)
        .collect()
        .await;

    // Combine results
    combine_resources(results)
}
```


Este enfoque mejora drásticamente el rendimiento cuando se trabaja con grandes conjuntos de datos, obteniendo hasta 10 páginas simultáneamente.

## Casos de uso reales

La interfaz del sistema de archivos desbloquea flujos de trabajo que son difíciles o incómodos de expresar con clientes de API tradicionales. En lugar de escribir scripts personalizados en torno a peticiones HTTP, los desarrolladores pueden reutilizar operaciones estándar del sistema de archivos y herramientas Unix para mover, inspeccionar, versionar y transformar datos FHIR.

Los ejemplos siguientes ilustran cómo este enfoque cambia las tareas cotidianas, desde migraciones puntuales hasta el desarrollo y la depuración.

### Migración de datos


```javascript
# Migrate all patient records from one server to another
cp -r /mnt/source-server/Patient/* /mnt/destination-server/Patient/
```


### Copia de seguridad y control de versiones


```javascript
# Create timestamped backup of all observations
tar -czf observations-backup-$(date +%Y%m%d).tar.gz /mnt/fhir/Observation/

# Track patient data changes with git
cd /mnt
git init
git add fhir/Patient/*.json
git commit -m "Initial patient data snapshot"
```


### Análisis de datos con herramientas estándar


```javascript
# Count all FHIR resources
find /mnt/fhir -name "*.json" | wc -l

# Extract patient family names and count occurrences
cat /mnt/fhir/Patient/*.json | jq -r '.name[0].family' | sort | uniq -c

# Search for patients with diabetes diagnoses with grep
grep -r "diabetes" /mnt/fhir/Condition/

# Analyze patient demographics (ID, birthDate, gender) with awk
cat /mnt/fhir/Patient/*.json | jq -r '[.id, .birthDate, .gender] | @csv' | \
  awk -F, '{print $3}' | sort | uniq -c
```


### Scripting y automatización


```javascript
# Activate all patient records with a batch operation
for file in /mnt/fhir/Patient/*.json; do
  jq '.active = true' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
done

# Monitor patient directory for recent changes
watch -n 5 'ls -l /mnt/fhir/Patient/ | tail -10'

# Export patient demographics as CSV
cat /mnt/fhir/Patient/*.json | \
  jq -r '[.name[0].family, .name[0].given[0], .birthDate] | @csv' | \
  csvtool col 1,2,3 - | \
  head -20
```


### Desarrollo y pruebas


```javascript
# Inspect test patient data during development
cat /mnt/fhir/Patient/test-patient-1.json | jq .

# Create reusable test fixtures from FHIR server
cp /mnt/fhir/Patient/example.json ./test/fixtures/

# Validate all patient JSON files for syntax errors
for file in /mnt/fhir/Patient/*.json; do
  jq empty "$file" 2>/dev/null || echo "Invalid JSON: $file"
done
```


### Trabajo con el historial de recursos

Una de las características más potentes de FHIR-FUSE es el acceso al historial de versiones de los recursos a través de directorios ocultos. Cada vez que se actualiza un recurso, los servidores FHIR mantienen versiones históricas. FHIR-FUSE las expone como archivos en carpetas ocultas `.resource-id`:


```javascript
# View the current patient record
cat /mnt/fhir/Patient/patient-123.json

# List all historical versions of this patient
ls -la /mnt/fhir/Patient/.patient-123/
# Output:
# 1.json
# 2.json
# 3.json

# View how the patient record looked at version 1
cat /mnt/fhir/Patient/.patient-123/1.json
```


**Comparación de versiones con diff estándar**

Una vez que las versiones de los recursos están disponibles como archivos, se pueden usar inmediatamente las herramientas diff habituales para ver qué cambió entre actualizaciones — sin escribir scripts personalizados ni ensamblar manualmente respuestas de la API.


```javascript
# See what changed between version 1 and version 2
diff /mnt/fhir/Patient/.patient-123/1.json \
     /mnt/fhir/Patient/.patient-123/2.json

# Compare an old version against the current record
diff /mnt/fhir/Patient/.patient-123/2.json \
     /mnt/fhir/Patient/patient-123.json
```


**Uso de difftastic para diffs estructurales elegantes**

[Difftastic](https://difftastic.wilfred.me.uk/) es una herramienta de diff estructural que entiende la sintaxis JSON y produce una salida mucho más legible que el diff tradicional basado en líneas. En lugar de comparar líneas, resalta los cambios semánticos, haciendo las diferencias más fáciles de interpretar.


```javascript
# Install difftastic
brew install difftastic  # macOS
# or: cargo install difftastic

# Compare versions with syntax-aware diffing
difft /mnt/fhir/Patient/.patient-123/1.json \
      /mnt/fhir/Patient/.patient-123/2.json
```


**Ejemplo de salida de difftastic:**


```javascript
Patient/patient-123.json
  {
    "resourceType": "Patient",
    "id": "patient-123",
-   "active": false,
+   "active": true,
    "name": [{
      "family": "Smith",
-     "given": ["John"]
+     "given": ["John", "Michael"]
    }],
+   "telecom": [{
+     "system": "phone",
+     "value": "+1-555-0123"
+   }],
    "birthDate": "1980-01-15"
  }
```


**Análisis de la pista de auditoría**

Dado que cada versión es un archivo normal, es fácil crear scripts que recorran todo el historial para responder preguntas de tipo auditoría: cuándo cambió un campo, quién lo actualizó o cómo evolucionó un recurso a lo largo del tiempo.


```javascript
# View when each version was last updated
for version in /mnt/fhir/Patient/.patient-123/*.json; do
  echo "=== $version ==="
  jq '.meta.lastUpdated' "$version"
done

# Track when the active status changed for a patient
for version in /mnt/fhir/Patient/.patient-123/*.json; do
  active=$(jq -r '.active' "$version")
  updated=$(jq -r '.meta.lastUpdated' "$version")
  echo "$updated: active=$active"
done

# Create a visual timeline of structural changes with difftastic
v1=/mnt/fhir/Patient/.patient-123/1.json
v2=/mnt/fhir/Patient/.patient-123/2.json
v3=/mnt/fhir/Patient/.patient-123/3.json

echo "Changes from v1 to v2:"
difft "$v1" "$v2"
echo -e "\nChanges from v2 to v3:"
difft "$v2" "$v3"
```


Esto hace que la depuración de problemas con los datos, la comprensión de la evolución de los recursos y la auditoría de conformidad sean considerablemente más sencillas. En lugar de realizar múltiples llamadas a la API para obtener el historial y comparar JSON manualmente, se pueden usar herramientas del sistema de archivos familiares y utilidades de diff modernas.

## Desafíos y compromisos

La construcción de FHIR-FUSE nos enseñó valiosas lecciones sobre el desajuste de impedancia entre las APIs REST y los sistemas de archivos. Aunque la abstracción del sistema de archivos es potente, conlleva limitaciones inherentes. Comprender estos compromisos le ayuda a decidir si FHIR-FUSE es adecuado para su caso de uso.

### 1. Operaciones asíncronas

Uno de los primeros desafíos aparece en la frontera entre los sistemas de archivos y las APIs de red. Las operaciones del sistema de archivos son tradicionalmente síncronas, pero las llamadas a la API FHIR son asíncronas. Usamos el runtime de Tokio para salvar esta diferencia:


```javascript
struct FhirFuse {
    runtime: Arc<Runtime>,
    http_client: Client,
    // ...
}

// Block on async operations in FUSE callbacks
fn read(&mut self, ino: u64, ...) {
    let result = self.runtime.block_on(async {
        fetch_resource(&self.http_client, &self.fhir_base_url, resource_id).await
    });
    // ...
}
```


Esto es apropiado para flujos de trabajo de desarrollo donde la latencia de red es aceptable. Los sistemas de producción que manejan alto rendimiento se benefician de clientes de API directos con agrupación de conexiones y operaciones por lotes.

### 2. Paginación y grandes conjuntos de datos

Otra limitación práctica surge de la forma en que los sistemas de archivos gestionan los directorios de gran tamaño. Los servidores FHIR suelen tener miles o millones de recursos. Limitamos los listados de directorios a 1.000 recursos por defecto para mantener la agilidad del sistema de archivos. Cuando se trabaja con conjuntos de datos más grandes, las consultas de búsqueda ofrecen una forma más escalable de acotar los resultados.

### 3. Semántica de escritura

Las operaciones de creación y actualización condicional de FHIR no se mapean perfectamente a las escrituras en el sistema de archivos. Por ello, FHIR-FUSE adopta una semántica pragmática:
- Escribir en un archivo nuevo crea un recurso con el nombre del archivo como ID
- Escribir en un archivo existente actualiza ese recurso
- El servidor puede rechazar recursos inválidos, provocando que las operaciones de escritura fallen

### 4. Diferencias entre plataformas

Por último, el comportamiento del propio sistema de archivos varía según la plataforma. FUSE funciona de forma diferente en Linux, macOS y otras plataformas. Los usuarios de macOS necesitan macFUSE, y la arquitectura de máquina virtual de Docker Desktop impide la propagación del montaje al host. FHIR-FUSE documenta estas soluciones alternativas y proporciona opciones de despliegue tanto nativas como en contenedor.

## Cuándo NO usar FHIR-FUSE

Aunque FHIR-FUSE es potente para ciertos flujos de trabajo, es importante comprender sus limitaciones:

### No apto para sistemas de producción con alta carga

FHIR-FUSE **no está diseñado para entornos de producción con alta carga**. Cada operación del sistema de archivos se traduce en peticiones HTTP al servidor FHIR, lo que introduce latencia y sobrecarga. Para sistemas de producción que gestionan miles de peticiones concurrentes, use clientes o SDKs de la API FHIR directos que puedan implementar agrupación de conexiones, procesamiento por lotes de peticiones y lógica de reintento sofisticada.

### Límites de escalabilidad del sistema de archivos

Esta limitación no es exclusiva de FHIR-FUSE — es inherente a **cualquier enfoque basado en sistema de archivos**. Los sistemas de archivos tienen dificultades con:
- **Listados de directorios grandes**: Listar un directorio con más de 100.000 archivos es lento en cualquier sistema de archivos
- **Escrituras concurrentes**: Múltiples procesos escribiendo simultáneamente pueden causar conflictos
- **Restricciones de memoria**: Mantener índices de inodos para millones de recursos consume una cantidad significativa de memoria

Si su servidor FHIR contiene millones de recursos, la interfaz del sistema de archivos se vuelve impráctica para explorar tipos de recursos completos. Las consultas de búsqueda ayudan, pero no son una solución completa.

### Donde FHIR-FUSE brilla de verdad: aprendizaje y desarrollo

Donde FHIR-FUSE brilla de verdad es en el **desarrollo, el aprendizaje y la exploración**, donde la facilidad de uso y la transparencia importan más que el rendimiento:
- **Aprender FHIR**: Los principiantes pueden explorar la estructura de datos FHIR sin aprender clientes de API
- **Flujos de trabajo de desarrollo**: Inspeccionar datos de prueba rápidamente, crear fixtures, depurar integraciones
- **Prototipado**: Experimentar rápidamente con recursos FHIR usando herramientas familiares
- **Análisis de datos**: Consultas y análisis ad hoc con utilidades Unix estándar
- **Scripts de migración**: Migraciones de datos puntuales entre entornos de desarrollo y staging

Para estos casos de uso, la simplicidad e intuitividad de la interfaz del sistema de archivos supera con creces las limitaciones de rendimiento.

### Requisitos de plataforma

FHIR-FUSE requiere soporte de **FUSE (Filesystem in Userspace)**, que varía según la plataforma:

**Linux**: Soporte nativo. FUSE está integrado en el kernel y está ampliamente disponible. Basta con instalar los paquetes `fuse3` o `libfuse` y ya está listo.

**macOS**: Requiere macFUSE con compromisos de seguridad. Es necesario instalar [macFUSE](https://osxfuse.github.io/), lo que exige:
- Permitir extensiones de kernel de terceros en las Preferencias del Sistema
- En los Mac con Apple Silicon, potencialmente deshabilitar algunas funciones de System Integrity Protection (SIP)
- Conceder permisos de seguridad adicionales

Esto es manejable en máquinas de desarrollo, pero puede entrar en conflicto con las políticas de seguridad corporativas.

**Windows**: FUSE es una tecnología Unix/Linux y no tiene soporte nativo en Windows. Sin embargo, **WSL2 (Windows Subsystem for Linux)** puede funcionar, ya que ejecuta un kernel Linux real. En teoría, FHIR-FUSE debería funcionar dentro de WSL2 con FUSE instalado. Si lo prueba, ¡cuéntenos!

**FreeBSD**: Compatible. FreeBSD tiene soporte FUSE nativo a través de `fusefs-libs`.

## Lo que aprendimos

El hackathon validó nuestra hipótesis central: **tratar los datos FHIR como archivos es intuitivo y potente.** Los desarrolladores comprendieron de inmediato cómo interactuar con el sistema de archivos sin leer la documentación. Las herramientas Unix estándar «simplemente funcionaron» para las tareas comunes.

Más importante aún, descubrimos que la metáfora del sistema de archivos **revela la estructura de los datos FHIR** de una forma que la documentación de la API no logra. Explorar directorios muestra qué tipos de recurso existen, qué recursos están disponibles y cómo se relacionan — todo ello sin leer especificaciones ni realizar llamadas a la API.

El proyecto también puso de relieve el valor de **las abstracciones en capas**. FUSE proporciona la interfaz del sistema de archivos, Rust proporciona seguridad de memoria y capacidades asíncronas, y FHIR proporciona el modelo de datos. Cada capa hace lo que mejor sabe hacer.

## Conclusión

FHIR-FUSE demuestra que **la interoperabilidad sanitaria no tiene por qué ser complicada.** Al mapear los conceptos FHIR a primitivas del sistema de archivos, aprovechamos décadas de herramientas Unix y conocimiento de los desarrolladores.

La interfaz del sistema de archivos no pretende sustituir a las APIs FHIR — es una herramienta complementaria que hace ciertos flujos de trabajo dramáticamente más sencillos. Ya sea que esté migrando datos, analizando recursos, depurando integraciones o simplemente explorando un servidor FHIR, FHIR-FUSE le permite trabajar de la manera que ya conoce.

A veces la mejor innovación consiste en hacer las cosas complejas simples. ¿Y si su servidor FHIR fuera simplemente una carpeta en su ordenador? Ahora puede serlo.

**¿Listo para probar FHIR-FUSE?** El proyecto es completamente de código abierto y está listo para explorar: [Repositorio de GitHub](https://github.com/healthsamurai/fhir-fuse)

**Más información sobre Aidbox:** [Servidor FHIR Aidbox](https://www.health-samurai.io/aidbox?utm_source=blog&utm_medium=article&utm_campaign=FHIR-FUSE)

**Únase a la conversación:** [Comunidad de Health Samurai](https://connect.health-samurai.io/)

Véase también: [Los agentes no son humanos](/blog/agents-are-not-humans).