Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
269eed9
feat: Phase 1 - Code cleanup & configuration
PaddyCH96 Aug 29, 2026
cbfd3c5
docs: Phase 2 planning - Testing & CI
PaddyCH96 Aug 29, 2026
067d905
test(01): complete UAT - 7 passed, 0 issues
PaddyCH96 Aug 29, 2026
9e4931a
docs: mark Phase 1 complete in ROADMAP.md
PaddyCH96 Aug 29, 2026
d7b9ea0
feat: Phase 2 - Testing & CI
PaddyCH96 Aug 29, 2026
402a294
docs: mark Phase 2 complete in ROADMAP.md
PaddyCH96 Aug 29, 2026
e11395b
test(02): complete UAT - 4 passed, 0 issues
PaddyCH96 Aug 29, 2026
7012890
docs(03): complete Phase 3 - Documentation
PaddyCH96 Aug 29, 2026
3b0e012
docs: update STATE.md for Phase 3 completion
PaddyCH96 Aug 29, 2026
38fcb23
feat(04): complete Phase 4 - Database Hosting
PaddyCH96 Aug 29, 2026
82a333d
docs: update STATE.md and ROADMAP.md for Phase 4 completion
PaddyCH96 Aug 29, 2026
74ca666
docs: update Phase 4 UAT checklist with verification results
PaddyCH96 Aug 29, 2026
c351ef1
docs: update ROADMAP.md for Phase 5 and 6 planning
PaddyCH96 Aug 30, 2026
1879f92
feat: prepare for deployment (Phase 5 & 6)
PaddyCH96 Aug 30, 2026
d06412b
fix: add root Dockerfile for Railway deployment
PaddyCH96 Aug 30, 2026
6c570e3
fix: remove *.txt from dockerignore to include requirements.txt
PaddyCH96 Aug 30, 2026
a357efa
chore: trigger redeploy
PaddyCH96 Aug 30, 2026
f8c52d6
fix: add railway.json to root directory
PaddyCH96 Aug 30, 2026
af54059
fix: simplify Dockerfile to copy backend directly
PaddyCH96 Aug 30, 2026
6b0ef96
fix: remove duplicate backend/railway.json causing build failure
PaddyCH96 Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
node_modules/
.next/
frontend/
.git/
.github/
.planning/
data/
assets/
*.md
.env
.env.*
!.env.example
10 changes: 10 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Database (Neon)
DATABASE_URL=postgresql://user:password@host/dbname?sslmode=require

# Backend (Railway)
CORS_ORIGINS=https://your-app.vercel.app
ENVIRONMENT=production
LOG_LEVEL=INFO

# Frontend (Vercel)
NEXT_PUBLIC_API_URL=https://your-app.up.railway.app
99 changes: 99 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install ruff
run: pip install ruff

- name: Run ruff
run: ruff check backend/

test-backend:
name: Test Backend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'

- name: Install dependencies
run: |
cd backend
pip install -r requirements.txt

- name: Run tests
run: |
cd backend
python -m pytest tests/ -v

test-frontend:
name: Test Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json

- name: Install dependencies
run: |
cd frontend
npm ci

- name: Run lint
run: |
cd frontend
npm run lint

- name: Run tests
run: |
cd frontend
npm run test

build:
name: Build
runs-on: ubuntu-latest
needs: [lint, test-backend, test-frontend]
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json

- name: Install frontend dependencies
run: |
cd frontend
npm ci

- name: Build frontend
run: |
cd frontend
npm run build
59 changes: 59 additions & 0 deletions .planning/INGEST-CONFLICTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# FocusFlow Ingest Conflicts

## BLOCKERS (0)

No blockers found. All decisions are consistent.

## WARNINGS (0)

No warnings found. No competing variants.

## INFO (3)

### INFO-001: Deployment Platform Choice
- **Variant A:** Railway (backend + database)
- **Variant B:** Fly.io (backend) + Neon (database)
- **Variant C:** Vercel (frontend) + Railway (backend + database)
- **Resolution:** User choice based on preference and pricing

### INFO-002: Storage for Audio/Voice Notes
- **Variant A:** Local filesystem (current)
- **Variant B:** Object storage (S3-compatible)
- **Variant C:** Cloudinary or similar
- **Resolution:** Start with local filesystem, migrate to object storage if needed

### INFO-003: Feature Priority
- **Variant A:** Deploy first, add features later
- **Variant B:** Complete all features, then deploy
- **Variant C:** Deploy MVP, iterate on features
- **Resolution:** User choice based on timeline and goals

## Auto-Resolved (7)

### AR-001: Backend Framework
- **Input:** FastAPI (from codebase)
- **Resolution:** LOCKED to FastAPI

### AR-002: Frontend Framework
- **Input:** Next.js 16 (from package.json)
- **Resolution:** LOCKED to Next.js 16

### AR-003: Database
- **Input:** PostgreSQL (from docker-compose.yml)
- **Resolution:** LOCKED to PostgreSQL 15

### AR-004: Authentication
- **Input:** None (from README)
- **Resolution:** No authentication (local-only)

### AR-005: Telemetry
- **Input:** None (from README)
- **Resolution:** No telemetry

### AR-006: License
- **Input:** MIT (from README)
- **Resolution:** MIT license

### AR-007: Test Framework
- **Input:** Vitest + pytest (from package.json and README)
- **Resolution:** Vitest for frontend, pytest for backend
44 changes: 44 additions & 0 deletions .planning/PROJECT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# FocusFlow Studio

## Overview

FocusFlow is a full-stack, local-first productivity app combining Pomodoro/Flowmodoro timers with Pranayama breathing exercises, kanban tasks, journaling, audio tracks, voice notes, and a whiteboard — all wrapped in 5 handcrafted themes. Zero telemetry, no accounts, runs entirely on your machine via Docker.

## Goals

- Ship a polished, deployable productivity app
- Maintain local-first, zero-telemetry philosophy
- Deploy to a public URL for portfolio demonstration
- Clean up code, add missing features, and ensure production readiness

## Non-Goals

- User authentication / multi-user support
- Cloud sync or backend-as-a-service
- Mobile native apps (PWA acceptable)
- Monetization

## Tech Stack

| Layer | Stack |
|-------|-------|
| Frontend | Next.js 16, React 19, Tailwind CSS 4, Framer Motion, Three.js |
| Backend | Python 3.12, FastAPI, Psycopg2 |
| Database | PostgreSQL 15 |
| Container | Docker + Docker Compose |

## Locked Decisions

- **Runtime:** Docker Compose (local-first)
- **Database:** PostgreSQL 15 (not SQLite, not Supabase)
- **Backend framework:** FastAPI
- **Frontend framework:** Next.js 16 with App Router
- **No auth:** Local-only, no user accounts
- **No telemetry:** Zero external analytics

## Success Metrics

- App runs via `docker compose up` with zero errors
- All features functional and tested
- Deployed to a public URL (Vercel + Railway/Fly.io or similar)
- Portfolio-ready README with live demo link
85 changes: 85 additions & 0 deletions .planning/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# FocusFlow Requirements

## R1: Timer System
- [x] Pomodoro timer (25/5 default)
- [x] Flowmodoro (count-up with proportional breaks)
- [x] Strict Mode (beforeunload trap)
- [ ] Customizable timer durations
- [ ] Timer persistence across page reloads

## R2: Breathing Exercises
- [x] Pranayama Ring (4-4-4 breathing guide)
- [ ] Multiple breathing patterns (4-7-8, box breathing)
- [ ] Breathing session logging

## R3: Task Management
- [x] Kanban task board
- [x] Add/complete/delete tasks
- [ ] Task categories/tags
- [ ] Task reorder/drag-and-drop

## R4: Session Analytics
- [x] Focus score heatmap
- [ ] Export analytics data
- [ ] Weekly/monthly summaries

## R5: Journal
- [x] Timestamped journal entries
- [ ] Rich text editing
- [ ] Journal search
- [ ] Journal export

## R6: Audio Player
- [x] Lo-fi, rain, forest ambiance
- [ ] Volume control per track
- [ ] Custom audio upload
- [ ] Audio mixing (multiple tracks)

## R7: Voice Notes (Vani)
- [x] Record and store voice memos
- [ ] Playback controls
- [ ] Transcription
- [ ] Voice note management (delete, rename)

## R8: Whiteboard (Mandala)
- [x] Freeform drawing canvas
- [ ] Color picker
- [ ] Save/load whiteboards
- [ ] Export as image

## R9: Wisdom Panel
- [x] Rotating tips from Bhagavad Gita, Yoga Sutras & Ayurveda
- [ ] User-expandable wisdom collection
- [ ] Daily wisdom notification

## R10: Themes
- [x] Deep Space, Forest Zen, Cyberpunk, Vintage, Sattva
- [ ] Theme persistence
- [ ] Custom theme creation

## R11: Production Readiness
- [ ] Backend .dockerignore
- [ ] Environment variable configuration
- [ ] Error handling and logging
- [ ] API rate limiting
- [ ] Health check endpoints

## R12: Deployment
- [ ] Frontend deploy (Vercel/Netlify)
- [ ] Backend deploy (Railway/Fly.io/Render)
- [ ] Database hosting (Neon/Supabase/Railway)
- [ ] CI/CD pipeline (GitHub Actions)
- [ ] Custom domain setup

## R13: Documentation
- [ ] Comprehensive README with live demo link
- [ ] API documentation (Swagger/OpenAPI)
- [ ] Contributing guidelines
- [ ] Architecture diagram

## R14: Testing
- [x] Frontend unit tests (Vitest)
- [x] Backend API tests (pytest)
- [ ] Integration tests
- [ ] E2E tests
- [ ] CI test automation
Loading
Loading