← All work

React · Node · SQL · AI

CareFlow

Next.js simulator for CNA skills and written exams: an LLM evaluator scores each step of a skill against the state rubric, and hybrid retrieval keeps practice questions grounded in the real curriculum.

Role
Solo developer
Dates
2025
Stack
React · Node · SQL · AI

Live · careflowlearn.org

Overview

Certified nursing assistants pass a skills exam where an evaluator watches them perform a procedure step by step, and marks it against a checklist where missing one item fails the whole skill. CareFlow simulates that: the student talks through a skill, and the evaluator scores each step against the rubric and pushes back on what they got wrong. Evaluation runs server-side on DeepSeek V4 Flash, with turn idempotency keys so a retried request cannot double-score an attempt.

The written side generates practice questions with retrieval over the official study material, using Qdrant for vector search and OpenSearch for lexical search together — pure vector search kept returning passages that were topically close but missed the exact term a question needed. Question generation itself runs offline through Gemini as a scripted job rather than in the request path, so the live service never waits on a generation call.

Getting the curriculum in was its own project. CNAScraper crawls the official textbook's table of contents, walks the chapter and front-matter links, carries the part title down as hierarchical context, and splits the text recursively into chunks that keep that context attached. Without the hierarchy the chunks are unusable — a paragraph about hand placement means nothing if you cannot tell which procedure it belongs to.

Rubric detail varies by state, so skills procedures are stored per exam provider with their own scenario seeds rather than one national checklist. On the operations side, the hosted tier sleeps its containers after inactivity, so keepwarm is a tiny Node script that pings the front end and the API every fourteen minutes to beat the cold-start window. It is not clever, but a student hitting a thirty-second cold start on their first question does not come back.