Inspiration

I kept coming back to one question: why does handing something over at home take so much explaining?

A broken washer sounds like one problem. Then there’s the appointment window, who can be home, what the technician said, and whether the repair actually worked. Someone has to keep all of that straight.

That’s where Loose Ends started. I wanted a place to leave the whole situation, so the next person could pick it up without starting from scratch.

What it does

The demo follows a washer repair. Sam needs to leave before the technician arrives. Alex can cover, but only after 3. Loose Ends notices the gap and helps draft a request for a later visit.

Sam can then share a private link with Alex. Alex reads the details and accepts the follow up. Until that happens, responsibility stays with Sam.

My favorite part is what happens after someone says, “The technician came.” Loose Ends asks whether the washer is working or whether something is still pending. That small question captures what I wanted this project to do: remember the unfinished part.

How I built it

I started with a simple browser prototype to get the idea on screen. It looked promising, but everything lived in one browser, so there wasn’t a real handoff yet.

I used AI coding tools to help build the application with React, TypeScript, Vinext, and Cloudflare D1. The notebook now saves shared records on the server, and each person gets a separate link with a specific role.

Both views update as the situation changes. Recipient links expire and can be revoked, and the history records which role made each update.

This version is an Alexa+ web simulation. It uses conversation rules rather than a live language model, and technician messages remain drafts inside the demo.

Challenges

Testing exposed mistakes that were easy to miss while following the happy path.

“It is not fixed” could mark the repair complete. “Alex cannot cover” could mark Alex available. Seeing those results made it clear that recognizing a keyword wasn’t enough.

I added explicit rules for negation, approval, ownership, and completion. Changing the plan now clears earlier message approval, and a handoff only takes effect when the recipient accepts it.

Getting two separate views to agree was another important step. I tested acceptance, updates, completion, and reloading to make sure both people were seeing the same saved situation.

What I learned

I learned that the details around a task can matter as much as the task itself.

Who has agreed to help? Is the new appointment time confirmed? Did the visit solve anything? Those questions shaped the project more than the interface did.

Loose Ends now passes 37 automated tests and 24 hosted API checks. There’s still work to do, especially around more flexible conversation and testing with other people. But the core handoff works, and that feels like a meaningful place to build from.

Built With

Share this project:

Updates

Submission history