My friend has a very consistent productivity strategy.
βI'll do it after lunch.β
Then:
βOkay, after dinner.β
βI'll definitely do it tomorrow.β
And somehow, tomorrow always wins.
When I saw the Build for a Friend challenge, I knew I didn't want to build another generic chatbot.
And I definitely didn't want to build a to-do list with an βAIβ button slapped onto it.
I wanted to build something around a problem I'd actually seen.
So I built Tomorrow.
An AI companion for one very specific problem:
What if the hardest part isn't finishing the task but starting it?
Tomorrow is an AI powered anti-procrastination companion.
It doesn't try to manage your entire life.
It doesn't give you a 47 step productivity plan.
And it definitely doesn't respond to every problem with:
βYou got this!β
Instead, it asks:
βWhat's actually stopping you?β
You tell Tomorrow what you're avoiding.
It tries to understand why you're stuck, breaks the task into something smaller, picks one realistic next step and helps you start.
For example:
βI need to finish my React assignment but I don't know where to start.β
A typical productivity app might give you a checklist.
Tomorrow might say:
Don't finish the assignment yet.
Open the project.
Create the form component.
That's it. Give it 15 minutes.
Because sometimes the problem isn't the task.
It's the size of the first step.
The entire experience revolves around a simple loop:
ββββββββββββββββββββ
β What are you β
β avoiding? β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββ
β Understand the β
β blocker β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββ
β Break the task β
β into smaller β
β actions β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββ
β Pick ONE next β
β action β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββ
β Focus session β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββ
β Check in β
ββββββββββ¬ββββββββββ
β
βββββββ΄ββββββ
β β
Done Stuck
β β
Next step Reassess
β β
βββββββ¬ββββββ
β
Start again
The interesting part isn't really the timer.
It's the feedback loop.
Tomorrow doesn't assume the first plan worked.
If the user gets stuck that becomes new information.
If the user finishes it moves forward.
If the task turns out to be bigger than expected it breaks it down again.
The goal isn't perfect planning.
The goal is progress.
This project started with a pretty simple observation.
Procrastination can look like this:
Big Task
β
"I'll do it later"
β
Guilt
β
Avoidance
β
Task feels bigger
β
"Tomorrow."
β
Repeat
Tomorrow tries to interrupt that loop:
Big Task
β
Tell Tomorrow
β
Find the blocker
β
Make it smaller
β
Start for 15 min
β
Progress
Not:
βBecome a productivity machine.β
Just:
βLet's make starting a little easier.β
I didn't want the AI to generate motivational quotes and call that intelligence.
Its job is much more specific.
The user explains what they're avoiding.
βI need to apply for internships but there are so many websites and I don't know where to begin.β
The obvious response would be:
βYou're procrastinating.β
Cool.
Not very helpful.
The actual problem might be overwhelm.
So Tomorrow tries to identify the blocker behind the task.
Different blockers need different responses.
Some examples:
If the problem is:
βI don't know where to start.β
Give them a starting point.
If it's:
βThis feels huge.β
Shrink the task.
βI'm scared I'll do it badly.β
The next step might simply be creating a rough first draft.
The AI isn't only asking:
βWhat should you do?β
It's also asking:
βWhy aren't you doing it?β
Let's say the user enters:
Apply for internships
That's not really one task.
It's a tiny project pretending to be a task. π
Tomorrow can turn it into:
Open your resume.
Pick one internship.
Read only the requirements.
Decide whether you want to apply.
The goal isn't to solve the entire journey in one response.
It's to find the smallest useful action.
This is where the idea becomes more than a chatbot.
Imagine the user says:
βI need to apply for internships but I'm overwhelmed and keep putting it off.β
Tomorrow first tries to understand the blocker.
Task:
Apply for internships
Possible blocker:
Overwhelm
Problem:
The task contains too many hidden steps.
Next action:
Open your resume.
Focus:
15 minutes
So instead of telling the user to spend the next three hours applying everywhere, Tomorrow gives them one thing:
Now imagine the user comes back and says:
βI didn't do it.β
That's not treated as failure.
It's information.
Tomorrow can ask:
βWhat got in the way?β
The user says:
βI opened LinkedIn and started scrolling.β
Now the next response can change.
Original task
β
Apply for internships
β
Blocker
Overwhelm
β
First action
Open resume
β
User got distracted
β
Reassess
β
Smaller action
Open the resume file only
The AI isn't simply repeating:
βTry again!β
It's using the failed attempt to decide what to do next.
That's the part I cared about.
A normal chatbot might work like:
User
β
Question
β
AI response
β
Conversation ends
Tomorrow is designed more like:
User
β
Task
β
Blocker
β
Next action
β
Task state
β
Focus session
β
User check-in
β
Updated context
β
New action
βΊ
The response isn't just displayed as text.
It influences the next state of the task.
That's what turns the AI from a chat box into part of the workflow.
I wanted the application to know where the user actually is instead of treating every message as a completely new conversation.
The basic state flow is:
NEW
β
BLOCKED
β
BROKEN_DOWN
β
STARTED
β
COMPLETED
And when things don't go according to plan:
STARTED
β
STUCK
β
REASSESS
β
NEW SMALLER STEP
That STUCK β REASSESS loop is important.
Because real people don't follow plans perfectly.
And honestly, if they did I probably wouldn't have built this. π
The system needs to treat a failed attempt as context not as a dead end.
The plan didn't work. So let's figure out why.
I kept the architecture intentionally simple:
User Input
β
React UI
β
Task + Conversation State
β
Context / Prompt Builder
β
Open-Weight AI Model
β
Blocker + Next Action
β
Task State Update
β
Focus Session
β
User Check-In
β
Updated Context
βΊ
The frontend handles the interaction.
The application state keeps track of where the user is.
The context layer gives the model the information it needs about the current task and previous interaction.
The model then helps determine things like:
What is the user trying to do?
β
What is blocking them?
β
How can the task be reduced?
β
What is ONE useful next action?
The important part is what happens after the model responds.
The result is used to update the task workflow rather than simply being shown as another chat message.
At a high level, the AI interaction can be thought of as:
User message
β
Extract task
β
Identify blocker
β
Estimate task complexity
β
Generate smaller actions
β
Select one next action
β
Return structured guidance
β
Update task state
Input:
"I need to finish my React project but I'm overwhelmed."
β
Task:
Finish React project
Blocker:
Overwhelm
β
Breakdown:
- Identify missing feature
- Open relevant component
- Create component
- Connect component
- Test it
β
Selected next action:
Open the project and identify the missing feature.
β
State:
STARTED
This is important because I don't want the model to produce a giant wall of productivity advice.
I want the output to be useful to the application's workflow.
This was one of the biggest design decisions in the project.
If the AI were removed the app would lose the part that:
The model isn't decorating the interface.
It's helping determine what happens next.
That makes the open-weight AI part of the core product logic rather than an extra feature added to the UI.
This is where the project became more interesting to me.
At first, the idea was simply:
βI'll use an AI model to help break down tasks.β
But then I thought about the kind of information Tomorrow could eventually handle:
That's a lot of personal context.
And I didn't want the long-term version of Tomorrow to require sending all of that to a closed AI provider.
So I designed the project around an open-weight AI model and a local-friendly architecture.
The open model isn't there just because the challenge asks for open AI.
It changes what the product can eventually become.
A productivity assistant that knows your unfinished work and personal struggles is dealing with information that can feel much more sensitive than an ordinary chatbot conversation.
That's why local inference is an especially interesting direction for this type of product.
Imagine telling your productivity assistant:
βI've been avoiding job applications because I'm scared I'll get rejected.β
That's much more personal than:
βGive me a pasta recipe.β
π
For something like Tomorrow, privacy matters.
A long-term version could work like:
User
β
βΌ
Personal Context
β
βΌ
Local AI Model
β
βΌ
Next Best Action
β
βΌ
User
The idea is:
Your personal productivity context shouldn't automatically have to leave your device just to get useful AI assistance.
And because the model is open-weight, the project isn't permanently tied to one proprietary AI provider.
The interesting part of building an AI product isn't always getting the model to respond.
It's getting the response to be useful.
One problem I had to think about was task size.
If the user says:
βI need to finish my project.β
A technically correct response could be:
βBreak the project into smaller tasks.β
But that's not actionable.
The user is still staring at the same giant project.
So the system needs to go one level deeper:
"Finish my project"
β
"What part?"
β
"Build the frontend"
β
"What part of the frontend?"
β
"Create the login page"
β
"What's the smallest action?"
β
"Open the project and create Login.jsx"
That's the difference between advice and an actionable next step.
Another challenge is what happens when the user doesn't complete that step.
A normal chatbot might simply suggest the same thing again.
Tomorrow needs to treat that as information.
That feedback is what makes the workflow adaptive.
This is probably the most important part of the challenge for me.
I could have started with:
βWhat cool AI application should I build?β
Instead, I started with:
βWhat does my friend actually struggle with?β
The answer was pretty obvious.
They didn't need another productivity lecture.
They didn't need a complicated dashboard.
They needed help getting past:
βI'll do it tomorrow.β
So I built around that.
And starting with a person instead of a technology changed the product.
It made me remove things that sounded cool but didn't really solve the problem.
No giant productivity dashboard.
No unnecessary streak system.
No pretending that waking up at 5 AM will magically fix everything.
What are you avoiding?
Why?
What's the smallest thing you can do next?
The biggest thing I learned from this project was:
AI doesn't have to solve the entire problem.
Sometimes it just needs to solve the next 10 minutes.
That changed how I thought about the product.
I initially imagined features like:
But then I asked myself:
Would any of this actually help my friend start?
Not necessarily.
So I kept stripping things back.
One problem.
One person.
One next step.
And honestly, I think the product got better every time I removed something.
There are a few directions I'd love to explore.
Instead of typing:
βI'm avoiding my assignmentβ¦β
the user could just say it.
That could make the interaction feel much more natural.
Over time, Tomorrow could notice recurring patterns.
βYou tend to postpone tasks when the first step isn't clear.β
Or:
βYou usually get started when the task is broken into smaller actions.β
That could make the assistant more personalized without requiring the user to explain everything from scratch every time.
The long-term goal is to make the entire experience work locally:
UI
β
Local Data
β
Local AI
β
Personalized Guidance
No cloud AI dependency for the core experience.
Just a private AI companion running on your own machine.
The project was built and tested through an agent-assisted development workflow as part of the challenge.
The agent workflow helped iterate on the application logic, task flow and user experience while keeping the core idea focused on one question:
What's the smallest useful action the user can take next?
My friend didn't need another app telling them:
βWake up at 5 AM.β
They didn't need a 12-step morning routine.
They didn't need another productivity guru.
They needed something that could say:
βForget the whole thing for a second. What's the smallest thing you can do right now?β
That's what I wanted Tomorrow to become.
Not an AI that manages your entire life.
Not another to-do list.
Not another chatbot that gives you motivational paragraphs and disappears.
Just a small, private, open-AI companion that helps you take the first step.
Because sometimes the hardest part of getting something done...
is simply starting.