A couples' New Year's resolution tracker with progress visualization and monthly email summaries.
- Goal Tracking - Create goals with categories, descriptions, and target dates
- Progress Visualization - Circular progress rings for each goal
- Check-ins - Add notes and updates to track your journey
- Two-Person View - Side-by-side columns for accountability
- Monthly Emails - Automated progress summaries via Gmail
- Password Protection - Simple shared password authentication
- Confetti Celebration - When you hit 100% on a goal!
cd goals-tracker
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r backend/requirements.txt
# Run the server
cd backend
uvicorn main:app --reload
# Open http://localhost:8000
# Default password: goals2026-
Create a new Web Service on Render
- Connect your GitHub repo
- Runtime: Python 3
- Build Command:
pip install -r backend/requirements.txt - Start Command:
cd backend && uvicorn main:app --host 0.0.0.0 --port $PORT
-
Add a Disk for persistent SQLite storage:
- Mount Path:
/var/data - Size: 1 GB
- Mount Path:
-
Set Environment Variables:
Variable Description Example DB_PATHDatabase file path /var/data/goals.dbAPP_PASSWORDShared login password yourpassword123PERSON_1_NAMEFirst person's name MarkPERSON_2_NAMESecond person's name SarahGMAIL_ADDRESSYour Gmail address you@gmail.comGMAIL_APP_PASSWORDGmail App Password xxxx xxxx xxxx xxxxRECIPIENT_EMAILSEmail recipients you@gmail.com,partner@gmail.comAPP_URLYour Render URL https://goals-tracker.onrender.comSECRET_KEYJWT secret (auto-generated) - CRON_SECRETCron job secret (auto-generated) - -
Create a Cron Job for monthly emails:
- Schedule:
0 9 1 * *(9 AM on the 1st of every month) - See
render.yamlfor the full configuration
- Schedule:
To send emails via Gmail:
- Go to Google Account Security
- Enable 2-Step Verification if not already enabled
- Go to App passwords (at the bottom of 2-Step Verification page)
- Select Mail and Other (Custom name) → Enter "Goals Tracker"
- Copy the 16-character password
- Add it as
GMAIL_APP_PASSWORDin Render environment variables
goals-tracker/
├── backend/
│ ├── main.py # FastAPI app
│ ├── database.py # SQLite setup
│ ├── models.py # Pydantic schemas
│ ├── email_service.py # Gmail SMTP
│ └── requirements.txt
├── frontend/
│ ├── index.html # Main page
│ ├── styles.css # Styling
│ └── app.js # JavaScript
├── render.yaml # Render Blueprint
└── README.md
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/login |
Authenticate |
| POST | /api/logout |
Logout |
| GET | /api/config |
Get app config |
| GET | /api/goals |
List all goals |
| POST | /api/goals |
Create a goal |
| PATCH | /api/goals/:id |
Update a goal |
| DELETE | /api/goals/:id |
Delete a goal |
| POST | /api/goals/:id/checkins |
Add check-in |
| DELETE | /api/checkins/:id |
Delete check-in |
| POST | /api/email/test |
Send test email |
| GET | /health |
Health check |
- Backend: Python, FastAPI, SQLAlchemy, SQLite
- Frontend: Vanilla HTML/CSS/JS
- Auth: JWT tokens with HTTP-only cookies
- Email: Gmail SMTP
- Hosting: Render (free tier)
MIT