Inspiration

Care worker turnover in Quebec's home care system is high, and family caregivers have been saying the same three things about it for years.

They repeat their parent's history to every new worker who shows up. Different workers arrive at different approaches to the same situation, so care changes depending on who is on shift. And the same mistakes keep happening, so families end up doing constant follow-up.

The underlying pattern is that knowledge about an elderly person accumulates inside individual workers and leaves when they do. A worker figures out over three weeks that this woman won't eat if you stand over her. Then she moves on, and the next worker starts from nothing.

We wanted the seventh worker to arrive knowing what the first six learned.

What it does

CareCircle puts a one-minute brief in front of every care visit and a one-minute check-out after it.

Before the visit, the worker taps a link and reads about six lines on her phone — no app, no account. The lines are chosen for her specific task at that specific hour. If she has visited before, she sees only what changed since her last visit, which is sometimes nothing.

After the visit, she taps three buttons and answers one question: anything the next person should know?

Her answer becomes a suggestion. The family approves it, and it appears in the next worker's brief, tagged with her name.

The record holds two kinds of short sentences. Preferences written by the family — female worker for bathing, prays around 1 pm. Approaches written by workers — sit down at the table with her; she won't eat if you stand over her.

Other features:

  • Corrections. When something goes wrong, the family writes one line. It appears at the top of every future brief, for every worker.
  • Pattern detection. Observations are tapped from a fixed list, so they can be counted. The same one appearing three times across five visits triggers a suggestion.
  • Continuity counter. Every brief opens with one line: First visit — 14 notes from 6 previous workers.
  • Access control. The elderly person can hide any sentence from any specific person and can see a log of everyone who has read her record.

How we built it

Python and FastAPI on the server, SQLite for the database, Jinja2 templates for the pages, and basic HTML, CSS, and JavaScript for styling. No build step and no separate frontend application.

Three interfaces run from the same server: a desktop console for the family caregiver, a large-type view for the elderly person, and a mobile-only page for the worker.

Visit links. When a visit is created, the server generates a 43-character random string and stores only a hash of it. The real link exists only in the message sent to the worker. Opening it checks three things: the hash matches a visit, the time is within the allowed window, and the visit is not already completed. Checking out marks the visit completed, which is what disables the link.

Building a brief. Five steps. Fetch the elderly person's active sentences. Drop anything hidden from this reader. Drop anything whose tasks don't include this visit's task. Drop anything whose hours don't overlap. Then count the worker's previous visits — new workers get everything, returning workers get only what was edited since they were last there.

Whatever survives goes to the Anthropic API, each sentence labelled with its ID. The model returns up to six lines, each carrying the ID it came from. The server checks every returned ID against the list it sent and discards anything that doesn't match.

Access control. Every read of the record goes through one function that filters by who is asking and writes a row to the access log. Nothing else in the codebase reads the record directly.

Challenges we ran into

Stopping the model from adding things. A model given care notes will volunteer explanations — why someone might be tired, what a symptom could mean. We fixed it structurally rather than by asking nicely. The model only ever receives sentences a human wrote, and every line it returns must carry the ID of the sentence it came from. Anything without a valid ID gets discarded before it reaches the screen.

Getting the model to return nothing. For a returning worker with no changes, the correct brief is zero lines. Models are strongly biased toward producing output and kept generating a full brief anyway. We had to state it explicitly in the prompt and handle the empty case as a real state in the interface rather than an error.

Assessing the real-life encounters.

Accomplishments that we're proud of

The model cannot invent anything, and that's enforced in code rather than in the prompt. Every line on a worker's screen traces back to a sentence a human wrote.

The worker needs no app and no account, which is what makes the whole loop possible.

Cultural and religious needs are handled without a religion field anywhere in the database. Every preference is an individual sentence with its own scope, so two families with the same background can have completely different records.

What we learned

Turnover is a knowledge problem before it's a staffing problem. We can't fix the shortage of care workers, but the specific harm families describe — repeating themselves, inconsistent approaches, recurring mistakes — is about knowledge not surviving handover.

The workers had to become contributors, not just recipients. Our first framing had information flowing one way. That doesn't solve turnover, because the knowledge that matters most is what individual workers figure out on their own.

What's next for CareCircle

Real accounts and onboarding, so a family can enter their own data instead of using seeded data.

Language translation. The record might be in Bengali or Arabic while the worker reads French. The data model supports it; it isn't implemented.

Appointment preparation. A summary of the visit log answering "has anything changed?" with evidence instead of memory.

Built With

Share this project:

Updates

Submission history