↑↓ to move · Enter to open · Esc to close

    All posts
    Article, · 5 min read

    From paper to pixels

    Ten days to turn a hand-drawn sketch into RedCheck's interface: what survived from the notebook, what moved, and the small details that make a planner feel calm.

    By 20 March RedCheck had a complete API and no interface at all (part 2). On 21 March I created the React project. Ten days later the dashboard had a calendar, a heatmap, a focus mode and an AI button. This part is about those ten days.

    A note on the screenshots: they aren’t from back then. To get them, I checked out the frontend exactly as it was on each date, ran it locally and fed it sample data. What you see is the real code of that day, with invented subjects and tasks.

    Day three: the notebook on a screen

    React, TypeScript, Vite and Tailwind CSS. Login on day one, registration on day two. On day three, 23 March, the first dashboard: a greeting, the date, and the tasks grouped by subject, each with a checkbox and its deadline.

    RedCheck’s first dashboard: a white sidebar listing subjects with task counts and a progress circle, and a main area greeting the user with today’s date and listing tasks grouped by subject, each with a checkbox, a deadline and “Edit task” and “Delete task” buttons.
    23 March 2026: the first dashboard. Recreated from that day's code, with sample data.

    It’s plain, and it’s very close to the sketch from part 1, which was itself very close to my notebook. All the HTTP calls lived in a small API layer from the start, with an interceptor that attaches the JWT to every request. Since the backend already existed and was documented, the frontend never had to wait for an endpoint.

    What moved, and why

    Over the following week the layout changed more than I expected, and the sketch lost a few arguments with reality.

    • The calendar moved to the centre. In the sketch it was a small month view tucked into the sidebar. Once each day showed how many tasks it held and how many were done, it was the most useful thing on the screen, and it deserved the space. The task list moved to a column on the right.
    • The sidebar became a dashboard of its own. The progress circle stayed, and a “task balance” chart joined it: the three subjects with the most pending work, so you can see at a glance where to put the effort.
    • Overdue tasks got their own block. In the notebook, an overdue task was simply copied to the next page, again and again. On screen, a task past its deadline moves to a separate “Out of time” section, still grouped by subject. It stays visible without polluting today’s plan.
    • Dates became words. Instead of 07/04/2026, 20:00, a deadline reads “Today, 20:00” in red, “Tomorrow” in yellow or “The day after tomorrow” in green. Nobody should have to do date arithmetic to know what’s urgent.
    RedCheck’s dashboard on 7 April 2026: a sidebar with a progress circle, a task balance chart and SmartCheck AI cards, a central month calendar with past days in green showing completed over total tasks, and a right-hand column greeting the user and listing tasks by subject with coloured deadline labels.
    7 April 2026: the layout two weeks later. Recreated from that day's code, with sample data.

    A heatmap for consistency

    The notebook could tell me how today was going. It couldn’t tell me how the last month had gone. That was the second thing I wanted from an app, and the reason the backend stores a progress snapshot for every day.

    The interface turns each snapshot into a colour, inspired by GitHub’s contribution graph: a day with nothing planned stays blank, a day where nothing got done gets a faint red, and from there it goes through three greens as the completion rate passes 50 % and 80 %. The month calendar uses the same scale, so a good week literally looks green.

    Focus Mode hides the calendar entirely and puts the heatmap next to today’s tasks: just the list and your track record, nothing else.

    RedCheck’s Focus Mode on 7 April 2026: the sidebar on the left, today’s tasks grouped by subject in the centre, and on the right a “Your performance” panel with a GitHub-style heatmap of daily activity from January to April, mostly green in March.
    Focus Mode: today's tasks and the heatmap, without the calendar. Recreated from the code of 7 April, with sample data.

    Small decisions

    • No state library. React’s own hooks were enough: useState for the interface, plain state for what came from the server, and useMemo for derived data like today’s tasks or the heatmap, so they only recompute when their inputs change. Redux or Zustand would have been one more thing to learn and maintain for no visible benefit at this size.
    • Components split late. The dashboard started as one big file. On day four it split into Sidebar, SubjectSection, TaskItem and OverdueSection, once it was clear which pieces repeated. Splitting earlier would have meant guessing.
    • Motion, with a cost I didn’t see yet. On 27 March I added framer-motion for page transitions and small animations: a checkbox that pops, tasks that slide in and out. It made the app feel finished. It was also used in exactly one place, and its exit animations never actually ran. Removing it, months later, saved about 120 KB (part 15).

    What I took from this stage

    • A sketch is a hypothesis. The calendar moving to the centre wasn’t a failure of the sketch, it was the first thing I learned by using the real thing.
    • Having the API finished first paid off exactly as planned: ten days of pure interface work, with no backend detours.
    • The details that make an app calm are cheap: words instead of dates, overdue tasks set aside instead of piled on top.

    In the middle of those ten days, on 26 March, a new button appeared in the sidebar: Daily task analysis. That’s the next part.

    El 20 de marzo RedCheck tenía una API completa y ninguna interfaz (parte 2). El 21 de marzo creé el proyecto de React. Diez días después, el dashboard tenía calendario, mapa de calor, modo foco y un botón de IA. Esta parte va de esos diez días.

    Una nota sobre las capturas: no son de entonces. Para conseguirlas, recuperé el frontend exactamente como estaba en cada fecha, lo arranqué en local y le di datos de ejemplo. Lo que ves es el código real de ese día, con asignaturas y tareas inventadas.

    Día tres: la libreta en una pantalla

    React, TypeScript, Vite y Tailwind CSS. El login el primer día, el registro el segundo. El tercero, 23 de marzo, el primer dashboard: un saludo, la fecha y las tareas agrupadas por asignatura, cada una con su casilla y su fecha límite.

    El primer dashboard de RedCheck: una barra lateral blanca con las asignaturas, el número de tareas de cada una y un círculo de progreso, y una zona principal que saluda al usuario con la fecha de hoy y lista las tareas agrupadas por asignatura, cada una con casilla, fecha límite y botones “Editar tarea” y “Borrar tarea”.
    23 de marzo de 2026: el primer dashboard. Recreado a partir del código de ese día, con datos de ejemplo.

    Es sencillo, y se parece mucho al boceto de la parte 1, que a su vez se parecía mucho a mi libreta. Todas las llamadas HTTP vivían desde el principio en una pequeña capa de API, con un interceptor que añade el JWT a cada petición. Como el backend ya existía y estaba documentado, el frontend nunca tuvo que esperar a ningún endpoint.

    Qué cambió de sitio, y por qué

    Durante la semana siguiente el diseño cambió más de lo que esperaba, y el boceto perdió alguna discusión con la realidad.

    • El calendario pasó al centro. En el boceto era un pequeño mes metido en la barra lateral. En cuanto cada día mostró cuántas tareas tenía y cuántas estaban hechas, se convirtió en lo más útil de la pantalla, y se merecía el espacio. La lista de tareas pasó a una columna a la derecha.
    • La barra lateral se volvió un panel propio. El círculo de progreso se quedó, y se le unió un gráfico de “balance de tareas”: las tres asignaturas con más trabajo pendiente, para ver de un vistazo dónde poner el esfuerzo.
    • Las tareas atrasadas tuvieron su propio bloque. En la libreta, una tarea atrasada simplemente se copiaba a la página siguiente, una y otra vez. En pantalla, una tarea que pasa su fecha límite va a una sección aparte, “Fuera de plazo”, agrupada también por asignatura. Sigue a la vista sin ensuciar el plan del día.
    • Las fechas se volvieron palabras. En lugar de 07/04/2026, 20:00, una fecha límite dice “Hoy, 20:00” en rojo, “Mañana” en amarillo o “Pasado mañana” en verde. Nadie debería tener que hacer cuentas con fechas para saber qué es urgente.
    El dashboard de RedCheck el 7 de abril de 2026: una barra lateral con círculo de progreso, gráfico de balance de tareas y tarjetas de SmartCheck AI, un calendario mensual en el centro con los días pasados en verde indicando tareas completadas sobre el total, y una columna a la derecha que saluda al usuario y lista las tareas por asignatura con etiquetas de fecha de colores.
    7 de abril de 2026: el diseño dos semanas después. Recreado a partir del código de ese día, con datos de ejemplo.

    Un mapa de calor para la constancia

    La libreta me decía cómo iba el día. No me decía cómo había ido el último mes. Eso era lo segundo que quería de una app, y el motivo por el que el backend guarda una foto del progreso de cada día.

    La interfaz convierte cada foto en un color, inspirado en el gráfico de contribuciones de GitHub: un día sin nada planificado queda en blanco, un día en el que no se hizo nada recibe un rojo muy suave, y a partir de ahí pasa por tres verdes a medida que el porcentaje completado supera el 50 % y el 80 %. El calendario mensual usa la misma escala, así que una buena semana se ve, literalmente, verde.

    El modo foco oculta el calendario por completo y pone el mapa de calor junto a las tareas de hoy: solo la lista y tu historial, nada más.

    El modo foco de RedCheck el 7 de abril de 2026: la barra lateral a la izquierda, las tareas de hoy agrupadas por asignatura en el centro y, a la derecha, un panel “Tu rendimiento” con un mapa de calor de actividad diaria al estilo de GitHub de enero a abril, casi todo verde en marzo.
    El modo foco: las tareas de hoy y el mapa de calor, sin el calendario. Recreado a partir del código del 7 de abril, con datos de ejemplo.

    Pequeñas decisiones

    • Sin librería de estado. Los hooks de React bastaban: useState para la interfaz, estado normal para lo que venía del servidor y useMemo para los datos derivados, como las tareas de hoy o el mapa de calor, para que solo se recalculen cuando cambian sus entradas. Redux o Zustand habrían sido una cosa más que aprender y mantener sin ningún beneficio visible a este tamaño.
    • Componentes divididos tarde. El dashboard empezó como un único archivo grande. El cuarto día se dividió en Sidebar, SubjectSection, TaskItem y OverdueSection, cuando ya estaba claro qué piezas se repetían. Dividirlo antes habría sido adivinar.
    • Animaciones, con un coste que aún no veía. El 27 de marzo añadí framer-motion para las transiciones entre páginas y pequeñas animaciones: una casilla que hace pop, tareas que entran y salen deslizándose. Hizo que la app pareciera terminada. También se usaba en un único sitio, y sus animaciones de salida nunca llegaron a ejecutarse. Quitarla, meses después, ahorró unos 120 KB (parte 15).

    Con qué me quedo de esta etapa

    • Un boceto es una hipótesis. Que el calendario pasara al centro no fue un fallo del boceto, fue lo primero que aprendí usando la cosa real.
    • Tener la API terminada antes salió exactamente como esperaba: diez días de trabajo solo de interfaz, sin desvíos al backend.
    • Los detalles que hacen que una app transmita calma son baratos: palabras en lugar de fechas, tareas atrasadas apartadas en lugar de amontonadas encima.

    En mitad de esos diez días, el 26 de marzo, apareció un botón nuevo en la barra lateral: Análisis diario de tareas. Esa es la siguiente parte.

    • Frontend