A clean, responsive web-based note-taking and task management application built with vanilla HTML, CSS, JavaScript in the frontend, FastAPI used as backend framework and MySQL as database.
A modern, full-stack note management application built with FastAPI and MySQL, featuring a responsive web interface for creating, reading, updating, and deleting notes with advanced search and categorization capabilities.
✨ Core Features:
- 📝 Create Notes - Add new notes with title, content, and category
- 📖 View All Notes - Display all notes in a clean card-based layout
- ✏️ Edit Notes - Update note content, title, and category
- 🗑️ Delete Notes - Remove notes permanently
- 🌐 REST API - Full-featured API endpoints for programmatic access
- Framework: FastAPI (Python web framework)
- Database: MySQL 8.0.44
- ORM: SQLAlchemy 2.0.46
- Database Driver: PyMySQL
- Template Engine: Jinja2
- Environment Management: python-dotenv
- HTML5 - Semantic markup
- CSS3 - Modern styling with gradients
- JavaScript - Interactive functionality
- Python 3.14+
- A modern web browser (Chrome, Firefox, Safari, Edge)
- Basic understanding of HTML/CSS/JS (for modifications)
- Python 3.14+
- MySQL 8.0+ (running and accessible)
- pip (Python package manager)
git clone https://github.com/nushant22/QuickNote-App.git
cd QuickNote-Apppython -m venv .venv
# On Windows
.venv\Scripts\activate
# On macOS/Linux
source .venv/bin/activatepip install -r requirements.txtCreate a .env file in the project root with the following variables:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password_here
DB_NAME=QuickNote_AppNote: Make sure MySQL is running and the database QuickNote_App exists.
python -m uvicorn QuickNote_App.main:app --reloadThe application will be available at: http://127.0.0.1:8000
QuickNote-App/
Project_Note/
├── database/
│ ├── __init__.py
│ ├── db.py
│ └── models.py
├── routes/
│ ├── __init__.py
│ └── note.py
├── schemas/
│ ├── __init__.py
│ └── note.py
├── templates/
│ ├── edit.html
│ └── index.html
├── __init__.py
├── main.py
├── README.md
└── requirements.txt
- Navigate to http://127.0.0.1:8000/notes/
- Fill in the form with:
- Title: Note title
- Content: Note content
- Category: Select or type a category
- Click "Add Note"
- All notes are displayed as cards on the main page
- Each card shows: Title, Content Preview, Category, Creation Date, and Actions
- Click the "Edit" button on any note card
- Update the note details
- Click "Update Note"
- Click the "Delete" button on any note card
- The note will be permanently removed
- Navigate to http://127.0.0.1:8000/notes/
- Fill in the form with:
- Title: Note title
- Content: Note content
- Category: Select or type a category
- Click "Add Note"
- All notes are displayed as cards on the main page
- Each card shows: Title, Content Preview, Category, Creation Date, and Actions
- Click the "Edit" button on any note card
- Update the note details
- Click "Update Note"
- Click the "Delete" button on any note card
- The note will be permanently removed
http://127.0.0.1:8000/notes
Get All Notes
GET /api/all
Response:
[
{
"id": 1,
"title": "My First Note",
"content": "Note content here...",
"category": "Personal",
"created_at": "2026-01-22T10:30:00",
"updated_at": "2026-01-22T10:30:00"
}
]Get Note by ID
GET /api/{id}
Example: GET /api/1
Search Notes
GET /api/search?query=search_term
Example: GET /api/search?query=python
Create Note
POST /api/create
Content-Type: application/json
{
"title": "New Note",
"content": "Note content",
"category": "Work"
}
Update Note
PUT /api/update/{id}
Content-Type: application/json
{
"title": "Updated Title",
"content": "Updated content",
"category": "Updated Category"
}
Delete Note
DELETE /api/delete/{id}
Example: DELETE /api/delete/1
CREATE TABLE note (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content LONGTEXT NOT NULL,
category VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);- Host: 127.0.0.1 (localhost)
- Port: 3306 (default MySQL port)
- Driver: PyMySQL
- Connection String:
mysql+pymysql://user:password@host:port/database
- The password is URL-encoded in the connection string (special characters like
@are encoded as%40) - Connection pooling is enabled with
pool_pre_ping=Trueto maintain connection health - Tables are automatically created on application startup if they don't exist
The application includes comprehensive error handling:
- Database connection errors are caught and logged
- Invalid input data is validated using Pydantic schemas
- HTTP exceptions are properly formatted with status codes
- Missing resources return 404 responses
- Internal errors return 500 responses with error details
python -m uvicorn QuickNote_App.main:app --reloadThe --reload flag enables auto-restart on file changes.
python -m uvicorn QuickNote_App.main:app --host 0.0.0.0 --port 8000 --workers 4- 🔐 User authentication and authorization
- 📧 Email notifications
- 🏷️ Tags in addition to categories
- 📎 File attachments
- 🎨 Note color coding
- 📱 Mobile app
- 🔄 Real-time collaboration
- 📊 Notes statistics and analytics
- 🌙 Dark mode UI
- 🔔 Reminders and notifications
Problem: Can't connect to MySQL server
- Solution: Ensure MySQL is running and credentials in
.envare correct
Problem: Address already in use
- Solution: Change the port:
python -m uvicorn QuickNote_App.main:app --port 8001
Problem: ModuleNotFoundError
- Solution: Ensure virtual environment is activated and dependencies are installed
Problem: Cross-origin requests fail
- Solution: Configure CORS in
main.pyif needed
This project is licensed under the MIT License - see the LICENSE file for details.
- Design inspiration from Google Keep
- Icons from FontAwesome
- Color palette from Coolors
Nushant Ghimire
- LinkedIn: nushant-ghimire-861b87325
- GitHub: @nushant22
- Email: [nushantghimire22@gmail.com]
⭐ If you find this project useful, please give it a star!
💡 Have suggestions? Open an issue
Last Updated: February 2026