Flow is a full-stack AI task management workspace that turns natural-language instructions into structured, actionable work.
Instead of manually creating tasks, setting priorities, and entering deadlines, users can interact with a single AI agent:
"Finish the backend by Friday and ask Rahul to review it tomorrow."
Flow extracts the actionable work, resolves deadlines into structured dates, persists the tasks, and immediately reflects them on a Kanban board.
The same agent can also answer questions about existing work:
"What are my high-priority tasks?"
The goal is to explore what a task-management system looks like when natural language becomes the primary interface for managing state.
Flow provides a focused workspace built around two core surfaces:
- AI Agent — the primary interface for creating and querying tasks.
- Kanban Board — the persistent visual representation of task state.
The user doesn't need to switch between a task form and a chatbot.
The same agent handles both:
Create work
"Finish the backend by Friday"
↓
Task is created
↓
Appears in Kanban
Understand work
"What do I need to finish?"
↓
Agent reads task state
↓
Answers
Tasks move through three states:
TODO → IN PROGRESS → DONE
Tasks can be dragged between columns, with the updated state persisted to PostgreSQL through the backend.
Natural-language deadlines are converted into structured dates.
For example:
"today"
"tomorrow"
"Friday"
"next Monday"
become:
YYYY-MM-DD
The UI then derives deadline state:
Overdue
Due today
Due tomorrow
Upcoming
This allows deadlines to influence the visual state of the task rather than simply appearing as static text.
┌─────────────────────────────────────────────────────────────┐
│ USER │
│ │
│ "Finish backend by Friday" │
│ "What do I need to finish?" │
└────────────────────────────┬────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ REACT FRONTEND │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ Flow AI │ │ Kanban Board │ │
│ │ │ │ │ │
│ │ Natural-language │ │ TODO │ │
│ │ task interaction │ │ IN PROGRESS │ │
│ │ │ │ DONE │ │
│ └──────────┬──────────┘ └────────────┬───────────┘ │
│ │ │ │
└─────────────┼────────────────────────────────┼──────────────┘
│ HTTP │ HTTP
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ FASTAPI BACKEND │
│ │
│ /chat /tasks /tasks/{id} │
│ │ │ │ │
│ └──────────────┬───────┴────────────────────┘ │
│ │ │
│ ▼ │
│ Agent / Task Logic │
└──────────────┬──────────────────────────────┬───────────────┘
│ │
│ AI inference │ Persistence
▼ ▼
┌─────────────────────────┐ ┌───────────────────────────┐
│ GEMINI │ │ SUPABASE │
│ │ │ │
│ • Task extraction │ │ PostgreSQL │
│ • Intent classification │ │ │
│ • Deadline resolution │ │ tasks │
│ • Task-aware answers │ │ ├── title │
│ │ │ ├── priority │
└─────────────────────────┘ │ ├── due_date │
│ ├── status │
│ └── created_at │
└───────────────────────────┘
A natural-language request enters through the AI interface:
"Finish the backend by Friday"
The request is sent to:
POST /chat
The backend provides the current task context to the AI agent.
The agent determines that the request represents a task creation operation and extracts:
title
priority
due_date
For example:
{
"title": "Finish the backend",
"priority": "medium",
"due_date": "2026-09-25"
}The backend persists the task in PostgreSQL through Supabase.
The frontend receives the successful response and refreshes the Kanban board.
User
↓
React
↓
POST /chat
↓
FastAPI
↓
Gemini
↓
Structured task
↓
Supabase / PostgreSQL
↓
React refresh
↓
Kanban
For a query such as:
"What are my high priority tasks?"
the backend retrieves the user's current tasks and provides them as context to the AI.
The agent generates an answer based on the available task state.
User question
↓
React
↓
POST /chat
↓
FastAPI
↓
Fetch current tasks
↓
Gemini
↓
Answer
↓
React
Dragging a task between Kanban columns triggers:
PATCH /tasks/{task_id}
with a new status:
{
"status": "in_progress"
}The backend updates PostgreSQL and the frontend refreshes its task state.
| Layer | Technology | Responsibility |
|---|---|---|
| Frontend | React | Application UI and state |
| Build Tool | Vite | Frontend development/build |
| Styling | Tailwind CSS | UI and responsive styling |
| Backend | FastAPI | API layer and application logic |
| Language | Python | Backend implementation |
| AI | Google Gemini | Natural-language understanding |
| Database | PostgreSQL | Persistent task state |
| Backend Platform | Supabase | Hosted PostgreSQL and database access |
flow/
│
├── backend/
│ ├── main.py
│ ├── ai.py
│ ├── test_ai.py
│ ├── .env # local only — not committed
│ └── venv/ # local only — not committed
│
├── frontend/
│ ├── public/
│ ├── src/
│ │ ├── App.jsx
│ │ ├── App.css
│ │ ├── index.css
│ │ └── main.jsx
│ ├── package.json
│ ├── package-lock.json
│ └── vite.config.js
│
├── screenshots/
│ ├── dashboard.png
│ ├── ai-agent.png
│ └── deadlines.png
│
├── .gitignore
├── LICENSE
└── README.md
The current application uses a tasks table in PostgreSQL.
tasks
│
├── id
├── title
├── priority
├── due_date
├── status
└── created_at
todo
in_progress
done
low
medium
high
The database is intentionally simple in V1. The application treats the database as the source of truth for task state.
The backend currently exposes the following core endpoints.
GET /GET /tasksReturns the current task collection.
POST /tasksExample:
{
"title": "Finish backend",
"priority": "high",
"due_date": "2026-09-25"
}POST /chatExample:
{
"message": "Finish the backend by Friday"
}The endpoint can either:
- answer a task-related question, or
- identify and create a new task.
PATCH /tasks/{task_id}Example:
{
"status": "done"
}The main workspace combines the Kanban board with the AI agent in a single interface.
The AI agent acts as the primary interface for both creating tasks and querying existing work.
Tasks are visually differentiated based on whether their deadlines are overdue, due today, due tomorrow, or further in the future.
Make sure you have:
- Python 3
- Node.js
- npm
- A Supabase project
- A Google Gemini API key
From the repository root:
cd backendCreate a virtual environment:
python3 -m venv venvActivate it:
source venv/bin/activateInstall dependencies:
pip install fastapi uvicorn python-dotenv supabase google-genai pydanticCreate:
backend/.env
with your own credentials:
SUPABASE_URL=your_supabase_url
SUPABASE_SECRET_KEY=your_supabase_secret
GEMINI_API_KEY=your_gemini_api_keyNever commit .env or expose these credentials publicly.
Start the API:
uvicorn main:app --reloadThe backend will be available at:
http://127.0.0.1:8000
Interactive API documentation is available at:
http://127.0.0.1:8000/docs
Open another terminal:
cd frontendInstall dependencies:
npm installStart the development server:
npm run devOpen:
http://localhost:5173
The backend expects these environment variables:
SUPABASE_URL
SUPABASE_SECRET_KEY
GEMINI_API_KEY
The real .env file is excluded from Git using .gitignore.
Traditional task applications make users manually specify:
Title
Priority
Deadline
Status
Flow explores a different interaction model.
The user expresses intent naturally and the system converts that intent into structured application state.
This makes the AI layer responsible for understanding the request while the database remains responsible for maintaining deterministic state.
The AI interprets natural language, but task state is persisted in PostgreSQL.
Conceptually:
AI
↓
understands intent
↓
structured operation
↓
Database
↓
source of truth
This separation is important because the model should not be treated as the persistent state of the application.
Early versions of the application represented deadlines as strings such as:
"Friday"
"Tomorrow"
"Monday"
That made reliable deadline reasoning difficult.
The current implementation stores:
YYYY-MM-DD
and derives states such as overdue/today/tomorrow in the application layer.
This allows the UI to reason deterministically about deadlines rather than relying on another LLM interpretation.
Flow is currently a focused V1 rather than a production-ready multi-user system.
Some areas intentionally remain outside the current implementation:
- Authentication
- Multi-user isolation
- Slack/WhatsApp integrations
- Background job processing
- Task history/event sourcing
- Semantic retrieval
- Calendar synchronization
- Advanced agent tool calling
- Production deployment
- Rate limiting
- Comprehensive automated test coverage
These are potential directions for future iterations.
- AI task creation
- AI task queries
- Kanban board
- Drag-and-drop status updates
- Priority handling
- Structured deadlines
- Deadline-aware UI
- Supabase persistence
- Authentication
- User-specific workspaces
- Projects
- People/entities
- Task history
- AI tool/function calling
- More granular task updates
- Slack integration
- WhatsApp integration
- Calendar integration
- Background processing
- Redis job queues
- Semantic search with pgvector
- Voice/meeting input
The longer-term direction for Flow is to move from a simple AI task extractor toward an AI-native state management system.
Instead of treating the LLM as a chatbot sitting beside a traditional application, the goal is to let natural language operate on structured application state through explicit tools and well-defined backend operations.
A future interaction could look like:
"Move the backend task to in progress,
tell Rahul I need his review,
and remind me tomorrow if it isn't done."
The agent could decompose that request into multiple validated operations:
Natural Language
│
▼
Agent / Planner
│
┌───────┼────────┐
▼ ▼ ▼
Update Message Reminder
Task Action Action
│ │ │
└───────┼────────┘
▼
Application State
That architecture is deliberately not part of the current V1; it represents the direction in which the system can evolve.
MIT License.


