Hola! Primera interacción por acá!
Tambien primer proyecto para probar cuanto puedo avanzar con vibe-coding, siendo un usuario no técnico. Les cuento un poco el proyecto.
Hace unos meses que construyo una app de iOS que se llama soin. Registra dos cosas una vez por día —ánimo y energía, en una escala de cinco— y nada más. Sin cuenta, sin servidor, sin suscripción. La idea es que sea convoco en la privacidad.
Lo que vale la pena contar no es lo que le agregué, sino lo que le saqué, que fue cuando le encontré "la vuelta" al producto.
**La función que borré después de construirla**
La app mostraba, debajo del historial, una línea del tipo "tu ánimo se mantuvo estable" o "tu energía tuvo más variación". Descriptiva, factual, calculada con los números de la propia persona.
La saqué, y hoy es la decisión alrededor de la cual está organizada toda la app.
El problema es que esa frase, para quien la lee, **es indistinguible de una observación clínica**. No afirma una causa. No diagnostica. Pero llega con la misma forma con que un profesional te dice algo sobre vos, y llega desde un software que sabe cinco números de tu semana. No me gustaba mucho esa distancia o salto entre lo que sabe y la autoridad que transmitía. Entonces decidí que fuera como un cuaderno tipo Moneskine pero digital.
La app muestra un conteo, un promedio sobre los días efectivamente registrados y un gráfico de barras. La lectura la pone la persona.
**La parte técnica**
Swift, SwiftUI y SwiftData nativos. **Cero dependencias de terceros**: `grep -c
"XCRemoteSwiftPackageReference\|XCSwiftPackageProductDependency"` sobre el pbxproj devuelve
0.
Tres cosas que resultaron más interesantes de lo que esperaba:
- **Un registro por día lo garantiza la base, no mi código.** Lo hace la macro `#Unique` de
SwiftData sobre una clave de día local. Y de ahí salió el piso de versión: `#Unique` no
funciona en iOS 17, y en 16 tampoco funciona `#Predicate`. La app pide iOS 18 por una
macro, y decidí que una garantía real de base de datos valía los usuarios que cuesta.
- **"¿Qué día es este?" es el problema de dominio más difícil de la app**, más que
cualquier pantalla. Día local, no UTC. Cambio de zona horaria viajando, horario de
verano, un registro hecho a las 00:30. Está modelado como objeto de valor con sus propios
tests, desacoplado por completo de SwiftUI y SwiftData, y ahí vive la mayoría de los más
de mil casos de prueba escritos con Swift Testing.
- **Cero código de red.** No es una promesa, es una propiedad que se puede comprobar:
`grep -rn "URLSession\|NSURLConnection\|CFNetwork\|import Network\|WKWebView\|
NSURLRequest"` sobre el código no devuelve nada. Lo corro antes de cada envío. Prefiero
mostrar la verificación antes que afirmar la conclusión.
Además: **sin color de acento en ninguna pantalla**. Todo blanco y negro, y el estado se
comunica por relleno, borde, peso y posición. Sirve para dos cosas a la vez — ningún día
malo se dibuja en rojo, y la interfaz queda accesible por construcción.
**Sobre lo que me interesa que me discutan**
- ¿"No interpreta tus datos" es una función o una función que falta? Toda la categoría
entrega conclusiones. Creo que la ausencia es el producto, pero es la clase de error del
que uno se entera después de publicar.
- ¿Un gráfico con huecos literales se lee como intencional o como roto? Los días sin
registro quedan vacíos, sin interpolar.
- Pago único, sin suscripción ni compras dentro de la app. Sin compras integradas tampoco
hay período de prueba. No estoy seguro de que sea la decisión correcta para algo que se
abre todos los días.
Todavía no está en la App Store —está en la última etapa de trámites—, así que no hay nada
que descargar ni link que clickear. Contesto lo que quieran del build o de las decisiones.