Construyendo Hydrame: recordatorios inteligentes sin la insistencia
Una app de recordatorios vive o muere por sus notificaciones. Así diseñé las de Hydrame para animarte con suavidad — y adaptarse a tu día en lugar de pelearse con él.
La mayoría de las apps de recordatorios tienen el mismo defecto fatal: los recordatorios. Se disparan según un horario fijo, ignoran lo que estás haciendo y poco a poco te enseñan a descartarlos sin leerlos. En cuanto una notificación se convierte en ruido, toda la app se convierte en ruido.
Hydrame es una app para seguir tu hidratación, y el seguimiento del agua es enteramente un problema de recordatorios. Si los avisos son buenos, la app funciona. Si insisten demasiado, la desinstalas antes del jueves. Así que dediqué la mayor parte del tiempo de diseño a una sola pregunta: ¿cómo le recuerdas a alguien que beba agua sin convertirte en aquello que detesta?
Los horarios fijos son el enemigo
El enfoque ingenuo es una alarma cada dos horas. Es fácil de construir y miserable de soportar. Vibra durante las reuniones, mientras duermes una siesta y diez minutos después de que acabas de beber un vaso. Cada recordatorio a destiempo te cuesta un poco de confianza, y esa confianza no vuelve.
La idea que dio forma a Hydrame: un recordatorio solo es bueno si llega en un momento en el que realmente podrías actuar. Todo lo demás es ruido disfrazado de ayuda.
Adaptarse al día
En lugar de un temporizador fijo, Hydrame reparte un objetivo diario a lo largo de tus horas de vigilia y solo te anima cuando de verdad te has quedado atrás y ha pasado suficiente tiempo desde el último aviso. Registrar una bebida empuja el siguiente recordatorio más adelante. Bebe con constancia y puede que no sepas nada de él — que es justo el objetivo.
La lógica central de programación es deliberadamente pequeña:
interface ReminderContext {
now: Date;
wakeHour: number; // e.g. 8
sleepHour: number; // e.g. 23
goalMl: number; // daily target
consumedMl: number; // logged so far today
lastNudge: Date | null;
minGapMinutes: number; // breathing room between nudges
}
function shouldNudge(ctx: ReminderContext): boolean {
const hour = ctx.now.getHours();
// Never during sleeping hours.
if (hour < ctx.wakeHour || hour >= ctx.sleepHour) return false;
// Respect a minimum gap so we never feel pushy.
if (ctx.lastNudge) {
const gapMin = (ctx.now.getTime() - ctx.lastNudge.getTime()) / 60000;
if (gapMin < ctx.minGapMinutes) return false;
}
// How much *should* you have had by now, given the day's progress?
const dayLength = ctx.sleepHour - ctx.wakeHour;
const elapsed = Math.max(0, hour - ctx.wakeHour);
const expectedMl = ctx.goalMl * (elapsed / dayLength);
// Only nudge if you're meaningfully behind the curve.
return ctx.consumedMl < expectedMl * 0.85;
}
No hay nada ingenioso en las matemáticas, y es intencional. El umbral de 0.85 significa “atrasado, pero no de forma castigadora”. La protección de minGapMinutes es la diferencia entre un compañero y un pesado. La mayor parte del trabajo consistió en quitar razones para dispararse, no en añadirlas.
El texto de la notificación importa tanto como el momento
Un recordatorio perfectamente sincronizado puede sentar mal igual si las palabras son las equivocadas. “¡Estás fracasando en tu objetivo!” es técnicamente un aviso. También es un pequeño acto de hostilidad que has invitado a la pantalla de bloqueo de alguien.
Los recordatorios de Hydrame son cortos, cálidos y nunca hacen sentir culpa:
- “Un buen momento para un vaso de agua.”
- “Mitad del día — ¿nos ponemos un poco al día?”
Sin signos de exclamación peleando por tu atención. Sin una racha a punto de “romperse”. El tono es el de un amigo que lo menciona, no el de un entrenador que lo grita.
Tranquila por defecto, configurable por elección
Los valores por defecto son la decisión de diseño más importante de cualquier app, porque la mayoría de la gente nunca los cambia. Por eso Hydrame llega silenciosa: un número prudente de avisos, ninguno de noche, todos fáciles de reducir aún más.
Si quieres objetivos más exigentes o comprobaciones más frecuentes, ahí están. Pero optas por más, nunca sales de menos. Esa única inversión — la calma como suelo, no como techo — es la mayor parte de lo que hace que la app se sienta respetuosa.
El objetivo nunca fue maximizar las notificaciones. Fue ganarse cada una.
Lo que le diría a cualquiera que construya una app de recordatorios
- Vincula los recordatorios a momentos accionables, no al reloj. Un aviso sobre el que no puedes actuar es solo ruido.
- Deja siempre espacio para respirar. Un intervalo mínimo entre alertas no es negociable.
- Escribe el texto como una persona, no como una métrica. La calidez no cuesta nada y compra mucha confianza.
- Haz que la opción tranquila sea la predeterminada. La gente vive en tus valores por defecto.
Hydrame ya está disponible en Google Play, y las notificaciones siguen siendo la parte que no dejo de refinar. Si la pruebas, cuéntame cómo sientes los avisos — ese feedback da forma a lo que viene después. En silencio, por supuesto.
// Lecturas relacionadas
Más del diario
Una rutina de hidratación que no depende de la fuerza de voluntad
La mayoría de los consejos sobre hidratación se reducen a 'bebe más agua' y confían en que la fuerza de voluntad haga el resto. Aquí una rutina construida en torno a señales y recordatorios suaves, no a la disciplina.
Construir Granyn: un control de presupuesto sin inicio de sesión bancario, en tres tablas
Cómo Granyn controla el gasto en varias divisas y detecta facturas recurrentes sin vincular una sola cuenta bancaria — el esquema Room detrás de todo, y las concesiones que exige.
Acciones de notificación en Android bien hechas: marcar una dosis como tomada sin abrir la app
Una guía práctica de los botones de acción de notificación en Android — PendingIntent, la restricción del trampolín de actividad, goAsync() y actualizar el estado de Room con seguridad.