A full-stack project management application for planning, organizing, and tracking projects and tasks. Built with FastAPI, React, TypeScript, and PostgreSQL.
Live Application: https://pulsepm.vercel.app
Live API: https://web-production-8f59b.up.railway.app
- Overview
- Features
- Tech Stack
- Getting Started
- Project Structure
- Frontend Development
- Backend Development
- Deployment
- Future Roadmap
Pulse PM is a portfolio project demonstrating a complete full-stack web application with:
- Frontend: Modern React SPA with TypeScript, deployed on Vercel
- Backend: Production-ready FastAPI REST API, deployed on Railway with PostgreSQL
- Authentication: Secure JWT-based authentication with password hashing
- Architecture: Clean layered design with proper separation of concerns
This project showcases practical experience with enterprise-grade tooling and best practices.
- User registration and login with secure authentication
- JWT token-based session management
- User profile management
- Password hashing with bcrypt-compatible algorithms
- Create, view, update, and delete projects
- Ownership-based access control
- Project descriptions and metadata
- Organize tasks within projects
- Create tasks within projects
- Task status tracking (To Do, In Progress, Completed)
- Task priority levels (Low, Medium, High)
- Task assignments and due dates
- Task descriptions and metadata
- Soft delete functionality for data preservation
- Audit timestamps (created_at, updated_at)
- Cascade deletes with proper constraints
- Foreign key relationships
- Live deployment (Vercel + Railway)
- Comprehensive API documentation (OpenAPI/Swagger UI, ReDoc)
- Health check endpoints
- Type-safe validation with Pydantic
- Full TypeScript interface definitions
| Component | Technology | Version |
|---|---|---|
| UI Framework | React | 18.2.0 |
| Language | TypeScript | 5.3.2 |
| Build Tool | Vite | 5.0.0 |
| Routing | React Router | 6.14.1 |
| State Management | TanStack React Query | 5.9.0 |
| HTTP Client | Axios | 1.6.0 |
| Testing | Vitest | 1.0.0 |
| Test Library | React Testing Library | 14.1.0 |
| Hosting | Vercel | - |
| Component | Technology | Version |
|---|---|---|
| Framework | FastAPI | 0.129.0 |
| Web Server | Uvicorn | 0.40.0 |
| Language | Python | 3.13.9 |
| Database | PostgreSQL | Latest |
| ORM | SQLAlchemy | 2.0.46 |
| Validation | Pydantic | 2.12.5 |
| Authentication | python-jose (JWT) | 3.5.0 |
| Password Hashing | passlib + pbkdf2_sha256 | 1.7.4 |
| Testing | pytest | 9.0.2 |
| Hosting | Railway | - |
- For Full Stack: Git, Node.js 16+, Python 3.13.9+
- Backend Only: Python 3.13.9+, PostgreSQL or SQLite
- Frontend Only: Node.js 16+
git clone https://github.com/dylanmckay04/pulsepm.git
cd pulsepmcd app
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
cd ..
pip install -r requirements.txtCreate .env file in project root:
DATABASE_URL=sqlite:///./test.db
SECRET_KEY=your-super-secret-key-here
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
cd frontend
npm installTerminal 1 - Backend:
uvicorn app.main:app --reload
# Runs on http://localhost:8000Terminal 2 - Frontend:
cd frontend
npm run dev
# Runs on http://localhost:3000- Frontend: http://localhost:3000
- API Docs: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
pulsepm/
├── app/ # FastAPI backend
│ ├── api/ # Route handlers
│ ├── models/ # SQLAlchemy ORM models
│ ├── schemas/ # Pydantic validation
│ ├── core/ # Config, security, dependencies
│ ├── database.py # Database setup
│ └── main.py # FastAPI app
├── frontend/ # React TypeScript frontend
│ ├── src/
│ │ ├── api/ # Axios configuration
│ │ ├── auth/ # Authentication context
│ │ ├── components/ # Reusable components
│ │ ├── pages/ # Page components
│ │ ├── test/ # Test files
│ │ ├── App.tsx
│ │ └── main.tsx
│ ├── package.json
│ └── vite.config.ts
├── tests/ # Backend integration tests
├── alembic/ # Database migrations
├── requirements.txt # Python dependencies
├── README.md # This file
└── Dockerfile* # Docker configuration
See [Backend README](./app/README.md) for backend-specific architecture details.
cd frontend
npm run devnpm run build # Creates optimized build
npm run preview # Preview production buildnpm run test # Run all tests
npm run test:ui # Run tests in UI modesrc/pages/: Main page components (Login, Projects, Tasks, etc.)src/components/: Reusable UI componentssrc/auth/: Authentication context providersrc/api/: Axios client configurationsrc/types.ts: TypeScript interfaces
- JWT token-based authentication
- Protected routes via AuthProvider
- React Query for server state management
- React Router for navigation
- Vitest for unit and integration tests
- TypeScript for type safety
For detailed backend documentation, see Backend README.
pip install -r requirements.txt
uvicorn app.main:app --reload- Users:
/users/register,/users/login,/users/me - Projects:
/projects/(CRUD operations) - Tasks:
/tasks/(CRUD operations) - Health:
/health
Visit http://localhost:8000/docs (OpenAPI/Swagger UI) or http://localhost:8000/redoc for full API documentation.
The frontend is deployed on Vercel:
- Connect your GitHub repository to Vercel
- Vercel automatically detects the React/Vite setup
- Set environment variable:
VITE_API_URL= https://web-production-8f59b.up.railway.app - Deployments trigger on push to main branch
Live URL: https://pulsepm.vercel.app
The backend is deployed on Railway with PostgreSQL:
- Connect GitHub repository
- Railway detects
Procfileandruntime.txt - Release command runs Alembic migrations
- Production environment variables configured in Railway dashboard
- Deployments trigger on push to main branch
Live URL: https://web-production-8f59b.up.railway.app
Railway (Production Backend)
DATABASE_URL: PostgreSQL connection stringSECRET_KEY: Strong secret for JWT signingALGORITHM: HS256ACCESS_TOKEN_EXPIRE_MINUTES: 30
Vercel (Production Frontend)
VITE_API_URL: Backend API base URL
pytest -v # Run all tests with verbose output
pytest tests/test_api.py -v # Run specific test file
pytest --cov=app tests/ # Run with coverage reportnpm run test # Run all tests
npm run test:ui # Interactive test UI- FastAPI async endpoints handle concurrent requests efficiently
- PostgreSQL with indexed queries for fast lookups
- Railway auto-scaling for load distribution
- Response times typically <100ms
- Vite for fast builds
- React Query for efficient caching and synchronization
- Vercel edge network for fast global delivery
- TypeScript prevents runtime errors
- JWT Bearer tokens with configurable expiration
- bcrypt-compatible password hashing
- Secure token storage in browser (localStorage with HTTPS)
- Ownership-based access control (users own projects)
- Protected routes on frontend
- Authorization checks on all backend API endpoints
- HTTPS enforced on Railway and Vercel
- Environment-based secret management
- CORS properly configured
- Type-safe validation with Pydantic and TypeScript
- Project collaborators and permissions
- Shared team workspaces
- User roles (admin, member, viewer)
- Activity logs and audit trails
- Task comments and discussions
- File attachments to tasks
- Recurring tasks
- Custom task fields
- Kanban board view
- Email notifications for task assignments
- Webhook support
- Third-party integrations (Slack, GitHub)
- Task reminders
- Project analytics dashboard
- Task completion metrics
- Team productivity Reports
- Data export (CSV, JSON)
This project is part of a portfolio and is available for reference.
Built by Dylan McKay as a portfolio demonstration of full-stack web development capabilities.
GitHub Profile: https://github.com/dylanmckay04/