Inspiration

UnStuck came from a simple frustration: sometimes the problem is not knowing what to do, but actually starting.

People can get trapped in overthinking, perfectionism, fear of failure, distraction, overwhelm, or even planning endlessly without taking action. Most productivity tools respond by giving users more plans and longer to-do lists. UnStuck was designed around the opposite idea: reduce the friction between intention and action.

What it does

UnStuck is an adaptive anti-procrastination companion that helps users move forward one doable step at a time.

It can:

  • ask for context before acting when a goal is too broad
  • detect when planning itself is becoming procrastination
  • break difficult tasks into smaller actions
  • gradually increase action size as momentum builds
  • respond differently when users feel overwhelmed, distracted, perfectionistic, afraid of failure, or emotionally stuck (yoda function)
  • let users update the agent when their real-world progress changes or when they need to give more context (update me option)
  • check in after periods of inactivity
  • preserve user agency around high-commitment actions such as sending, submitting, deleting, or purchasing (safety filtering)
  • recognise when the original task is complete and stop generating unnecessary steps

How we built it

UnStuck was built in Python using Streamlit for the interface and an LLM for reasoning and structured action generation.

The model returns structured outputs containing information such as the user's goal, likely blocker, clarification needs, next action, action difficulty, expected duration, and task-completion status.

Streamlit session state stores progress across interactions, including completed actions, context updates, inactivity status, and the current task.

We also implemented deterministic logic outside the LLM for:

  • planning-loop detection
  • inactivity monitoring
  • safety filtering
  • adaptive action sizing
  • task-completion handling

This combination allows the model to reason about the user's situation while the application controls important behavioural and safety constraints.

Challenges we ran into

One of the biggest challenges was deciding how small each action should be.

Early versions decomposed tasks too aggressively. Even after the user had built momentum, the system continued suggesting tiny and sometimes unnecessary steps. We changed the behaviour so that actions become larger as the user succeeds, allowing UnStuck to transition from activation to meaningful progress and eventually completion.

Another challenge was keeping the agent aligned with the user's real-world situation. Users may skip ahead, complete more than expected, or encounter steps the agent did not anticipate. We added an update mechanism so users can correct the agent and continue from where they actually are.

We also encountered the challenge of preserving user agency. The agent should help someone move forward without pushing them into irreversible actions they have not consciously chosen.

Accomplishments that we're proud of

We are proud that UnStuck evolved beyond a simple chatbot or AI-generated to-do list.

The prototype can maintain state across a task, adapt action difficulty, detect planning paralysis, respond to inactivity, handle emotional blockers, accept real-time context updates, and recognise when a goal has been completed.

We are especially proud of the interaction design: instead of showing users a large future workload, UnStuck focuses attention on the next useful action while still adapting to what happens in the real world.

What we learned

Building UnStuck showed us that creating a useful AI application requires much more than a good prompt.

We learned about:

  • structured LLM outputs
  • stateful AI applications
  • adaptive prompting
  • Streamlit session management
  • safety guardrails
  • behavioural interaction design
  • inactivity monitoring
  • deploying an end-to-end AI prototype

Most importantly, we learned that useful agent behaviour comes from combining model reasoning with application state, deterministic rules, and thoughtful UX.

What's next for UnStuck

The next step is to make UnStuck more proactive and measurable.

Future improvements include:

  • WhatsApp or SMS check-ins when a user becomes inactive
  • longer-term progress and procrastination-pattern tracking
  • personalised action-size adaptation based on previous sessions
  • better planning-loop detection
  • an evaluation harness for systematically testing blocker detection, action quality, safety, and task progression
  • optional integrations with calendars and task-management tools
  • a mobile-friendly interface and push notifications

The long-term goal is for UnStuck to become a lightweight action companion that notices when someone is stuck and helps them move again without overwhelming them.

Built With

  • agentic-ai
  • ai-agents
  • ai-safety
  • generative-ai
  • gpt
  • llm
  • prompt-engineering
  • python
  • python-dotenv
  • streamlit
Share this project:

Updates

Submission history