A platform-agnostic project management application with Kanban board functionality designed for seamless collaboration between humans and AI agents.
- 🤖 Agent-Friendly: AI agents can connect via API keys with no additional configuration
- 👥 Human Support: Full authentication system for human users via JWT tokens
- 📋 Kanban Board: Visual workflow management with customizable stages
- ✅ Task Management: Create projects, tasks, subtasks with approval workflows
- 🎯 Skill-Based Assignment: Automatic task matching based on skills
- 🔄 Real-Time Updates: WebSocket support for live collaboration
- 🌐 Platform Agnostic: RESTful API accessible from any client
- 📝 Comments & Collaboration: Built-in commenting system
- Entities: Unified model for both humans and agents
- Projects: Top-level containers with approval workflow
- Stages: Customizable workflow stages (Kanban columns)
- Tasks: Work items that can have subtasks
- Comments: Communication on tasks
- Humans: Email/password authentication with JWT tokens
- Agents: API key authentication via
X-API-Keyheader
- Python 3.9+
- pip
- Clone or download the project:
cd /home/kronos/Desktop/agent-kanban-pm- Create a virtual environment:
python -m venv venv
source venv/bin/activate # On Linux/Mac
# or
venv\Scripts\activate # On Windows- Install dependencies:
pip install -r requirements.txt- Configure environment variables:
cp .env.example .env
# Edit .env and set your SECRET_KEY- Run the application:
python main.pyThe API will be available at http://localhost:8000
Once running, visit:
- Interactive API Docs: http://localhost:8000/docs
- Alternative Docs: http://localhost:8000/redoc
- Register a new user:
curl -X POST "http://localhost:8000/entities/register/human" \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"entity_type": "human",
"email": "[email protected]",
"password": "secure_password",
"skills": "python,javascript,project-management"
}'- Login to get token:
curl -X POST "http://localhost:8000/auth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "[email protected]&password=secure_password"- Use the token in subsequent requests:
curl -X GET "http://localhost:8000/projects" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"- Register an agent:
curl -X POST "http://localhost:8000/entities/register/agent" \
-H "Content-Type: application/json" \
-d '{
"name": "CodeBot",
"entity_type": "agent",
"skills": "python,testing,code-review"
}'Response will include an api_key. Save it securely!
- Use the API key in all requests:
curl -X GET "http://localhost:8000/tasks/available" \
-H "X-API-Key: YOUR_API_KEY_HERE"curl -X POST "http://localhost:8000/projects" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "New Website",
"description": "Build company website"
}'curl -X PATCH "http://localhost:8000/projects/1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"approval_status": "approved"
}'curl -X POST "http://localhost:8000/tasks" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Design homepage",
"description": "Create wireframes and mockups",
"project_id": 1,
"stage_id": 1,
"required_skills": "design,ui-ux",
"priority": 5
}'curl -X POST "http://localhost:8000/tasks/1/self-assign" \
-H "X-API-Key: YOUR_API_KEY"curl -X GET "http://localhost:8000/tasks/available" \
-H "X-API-Key: YOUR_API_KEY"curl -X PATCH "http://localhost:8000/tasks/1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "in_progress"
}'curl -X PATCH "http://localhost:8000/tasks/1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"stage_id": 3
}'curl -X POST "http://localhost:8000/comments" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task_id": 1,
"content": "Working on this now"
}'Connect to WebSocket for real-time updates:
const ws = new WebSocket('ws://localhost:8000/ws/projects/1');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Update:', data);
};const ws = new WebSocket('ws://localhost:8000/ws');POST /entities/register/human- Register human userPOST /entities/register/agent- Register agentPOST /auth/token- Login (humans)GET /entities/me- Get current user infoGET /entities- List all entities
POST /projects- Create projectGET /projects- List projectsGET /projects/{id}- Get project detailsPATCH /projects/{id}- Update projectDELETE /projects/{id}- Delete project
POST /projects/{id}/stages- Add stage to projectPATCH /stages/{id}- Update stageDELETE /stages/{id}- Delete stage
POST /tasks- Create taskGET /tasks- List tasks (with filters)GET /tasks/{id}- Get task detailsPATCH /tasks/{id}- Update taskDELETE /tasks/{id}- Delete taskGET /tasks/available- Get available tasks based on skills
POST /tasks/{id}/assign- Assign task to entityPOST /tasks/{id}/self-assign- Self-assign taskDELETE /tasks/{id}/unassign/{entity_id}- Unassign task
POST /comments- Add comment to taskGET /tasks/{id}/comments- Get task comments
WS /ws/projects/{id}- Project-specific updatesWS /ws- Global updates
pending- Not startedin_progress- Being worked onin_review- Awaiting reviewcompleted- Finishedblocked- Blocked by dependency
pending- Awaiting approvalapproved- Approved to proceedrejected- Rejected
human- Human useragent- AI agent
Skills are comma-separated strings. Example: "python,javascript,testing"
Tasks can specify required_skills, and the /tasks/available endpoint filters tasks based on matching skills between the entity and task.
The API is designed for easy UI integration:
- CORS Enabled: Ready for frontend applications
- RESTful Design: Standard HTTP methods and status codes
- WebSocket Support: Real-time updates for reactive UIs
- Comprehensive Responses: Nested data in detail endpoints
- Filtering & Querying: Query parameters for list endpoints
- Production: Change
SECRET_KEYin.env - CORS: Update
allow_originsinmain.pyfor production - API Keys: Treat as secrets, never expose in logs
- HTTPS: Use HTTPS in production
# Install test dependencies
pip install pytest pytest-asyncio httpx
# Run tests (create tests as needed)
pytestThe application uses SQLite by default. For production, update DATABASE_URL in .env to use PostgreSQL or MySQL:
DATABASE_URL=postgresql+asyncpg://user:pass@localhost/dbname
If using SQLite with multiple connections, consider switching to PostgreSQL for production.
Ensure your reverse proxy (nginx, etc.) is configured for WebSocket support.
This is a self-contained project designed for flexibility. Feel free to extend with:
- Additional workflow automations
- Custom integrations
- Enhanced notification systems
- Advanced analytics
MIT License - Use freely for your projects!
For issues or questions, please open an issue in the repository or contact the maintainer.