docs: restructure documentation into organized folders
Some checks failed
Deploy to Coolify / Code Quality (pull_request) Has been cancelled
Deploy to Coolify / Run Tests (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Development (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Production (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Test (pull_request) Has been cancelled
Pull Request Checks / Validate PR (pull_request) Has been cancelled
Some checks failed
Deploy to Coolify / Code Quality (pull_request) Has been cancelled
Deploy to Coolify / Run Tests (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Development (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Production (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Test (pull_request) Has been cancelled
Pull Request Checks / Validate PR (pull_request) Has been cancelled
Organized docs into logical subdirectories:
**New Structure:**
- docs/
- README.md (index with quick links)
- PROJECT_PLAN.md (root level - main roadmap)
- development/
- getting-started.md (5-min quickstart)
- local-setup.md (detailed Docker Compose guide)
- workflow.md (daily development)
- git-workflow.md (branching strategy)
- architecture/
- overview.md (tech stack, design)
- database.md (schema, RLS, migrations)
- api.md (endpoints, functions)
- deployment/
- production.md (Docker, Coolify)
- ci-cd.md (automated pipelines)
**Cleaned Up:**
- Moved DEV_SETUP.md → docs/development/local-setup.md
- Removed outdated SETUP.md (referenced old Coolify setup)
- Replaced with getting-started.md (current Docker Compose flow)
- Updated README.md links to new structure
All paths tested, no broken links.
This commit is contained in:
84
docs/README.md
Normal file
84
docs/README.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# Pantry Documentation
|
||||
|
||||
Complete documentation for the Pantry household inventory management system.
|
||||
|
||||
## 📚 Documentation Structure
|
||||
|
||||
### 🚀 Getting Started
|
||||
|
||||
- **[Project Overview](PROJECT_PLAN.md)** - Vision, roadmap, and MVP phases
|
||||
- **[Local Setup Guide](development/local-setup.md)** - Docker Compose development environment
|
||||
- **[Getting Started](development/getting-started.md)** - Quick start for new developers
|
||||
|
||||
### 🏗️ Architecture
|
||||
|
||||
- **[Architecture Overview](architecture/overview.md)** - Tech stack, design decisions, data flow
|
||||
- **[Database Schema](architecture/database.md)** - Tables, relationships, RLS policies, migrations
|
||||
- **[API Reference](architecture/api.md)** - Supabase endpoints, Edge Functions, helpers
|
||||
|
||||
### 💻 Development
|
||||
|
||||
- **[Development Workflow](development/workflow.md)** - Daily workflow, conventions, best practices
|
||||
- **[Git Workflow](development/git-workflow.md)** - Branching strategy, PR process, reviews
|
||||
|
||||
### 🚢 Deployment
|
||||
|
||||
- **[Production Deployment](deployment/production.md)** - Docker, Coolify, environment setup
|
||||
- **[CI/CD Pipeline](deployment/ci-cd.md)** - Automated testing, builds, deployments
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Quick Links by Role
|
||||
|
||||
### New Developer
|
||||
1. [Local Setup Guide](development/local-setup.md) - Get running in 5 minutes
|
||||
2. [Architecture Overview](architecture/overview.md) - Understand the stack
|
||||
3. [Development Workflow](development/workflow.md) - Daily development process
|
||||
|
||||
### Feature Implementation
|
||||
1. [Database Schema](architecture/database.md) - Table structure and queries
|
||||
2. [API Reference](architecture/api.md) - Available endpoints
|
||||
3. [Git Workflow](development/git-workflow.md) - Branch naming, PR checklist
|
||||
|
||||
### Deployment & Operations
|
||||
1. [Production Deployment](deployment/production.md) - Deploy to production
|
||||
2. [CI/CD Pipeline](deployment/ci-cd.md) - Automated workflows
|
||||
|
||||
---
|
||||
|
||||
## 📊 Current Status
|
||||
|
||||
**MVP Progress:** 14/34 issues complete (41.2%)
|
||||
|
||||
- ✅ Week 1: Database + Frontend Foundation (6/6)
|
||||
- ✅ Week 2: Core Inventory Management (8/8)
|
||||
- 🔄 Week 3: Barcode Scanning (1/5)
|
||||
- ⏸️ Week 4-6: Tag UI, PWA, Deployment (20 remaining)
|
||||
|
||||
See [PROJECT_PLAN.md](PROJECT_PLAN.md) for detailed roadmap.
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
For contribution guidelines, see [Development Workflow](development/workflow.md).
|
||||
|
||||
Key points:
|
||||
- Feature branches off `develop`
|
||||
- PRs require review before merge
|
||||
- Follow conventional commits
|
||||
- Write tests for new features
|
||||
|
||||
---
|
||||
|
||||
## 🔗 External Resources
|
||||
|
||||
- **Repository:** https://gitea.jeanlucmakiola.de/pantry-app/pantry
|
||||
- **Supabase Docs:** https://supabase.com/docs
|
||||
- **Nuxt 4 Docs:** https://nuxt.com
|
||||
- **Open Food Facts API:** https://wiki.openfoodfacts.org/API
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2026-02-09
|
||||
**Version:** 0.1.0-alpha (MVP in progress)
|
||||
189
docs/development/getting-started.md
Normal file
189
docs/development/getting-started.md
Normal file
@@ -0,0 +1,189 @@
|
||||
# Getting Started with Pantry Development
|
||||
|
||||
Welcome! This guide will get you from zero to running Pantry locally in ~5 minutes.
|
||||
|
||||
## 🎯 What You'll Build
|
||||
|
||||
A self-hosted kitchen inventory app with:
|
||||
- Inventory management (add, edit, delete items)
|
||||
- Tag-based organization (Fridge, Freezer, Dairy, etc.)
|
||||
- Unit conversions (g, kg, L, cups)
|
||||
- Barcode scanning (coming soon)
|
||||
- PWA features (offline, installable)
|
||||
|
||||
## ⚡ Quick Start
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- **Docker** & **Docker Compose** - [Install](https://docs.docker.com/get-docker/)
|
||||
- **Bun** - [Install](https://bun.sh): `curl -fsSL https://bun.sh/install | bash`
|
||||
- **Git**
|
||||
|
||||
### One-Command Setup
|
||||
|
||||
```bash
|
||||
# Clone the repo
|
||||
git clone https://gitea.jeanlucmakiola.de/pantry-app/pantry.git
|
||||
cd pantry
|
||||
|
||||
# Run the setup script
|
||||
./dev.sh
|
||||
```
|
||||
|
||||
That's it! The script will:
|
||||
1. ✅ Start Supabase services (Docker Compose)
|
||||
2. ✅ Wait for services to initialize
|
||||
3. ✅ Install frontend dependencies
|
||||
4. ✅ Launch Nuxt dev server
|
||||
|
||||
### Access the App
|
||||
|
||||
| Service | URL | Purpose |
|
||||
|---------|-----|---------|
|
||||
| **App** | `http://localhost:3000` | Main frontend |
|
||||
| **Supabase Studio** | `http://localhost:54323` | Database admin UI |
|
||||
| **API** | `http://localhost:54321` | Backend API |
|
||||
|
||||
## 🎮 Try It Out
|
||||
|
||||
1. Open `http://localhost:3000`
|
||||
2. Click **"Add Manually"** to create your first item
|
||||
3. Fill in:
|
||||
- Name: "Milk"
|
||||
- Quantity: 1
|
||||
- Unit: Liter
|
||||
- Tags: Fridge, Dairy
|
||||
- Expiry: Set a date
|
||||
4. Click **"Add Item"** and see it in the grid!
|
||||
|
||||
### Explore Features
|
||||
|
||||
- **Edit item:** Click "Edit" on any card
|
||||
- **Adjust quantity:** Use +/- buttons
|
||||
- **Delete item:** Click "Delete" (confirms first)
|
||||
- **View database:** Open Supabase Studio at `:54323`
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
```
|
||||
pantry/
|
||||
├── app/ # Nuxt 4 frontend
|
||||
│ ├── components/ # Vue components
|
||||
│ │ └── inventory/ # Inventory UI (List, Card, Forms)
|
||||
│ ├── composables/ # Data hooks (useInventory, useSupabase)
|
||||
│ ├── pages/ # Routes (index, scan, settings)
|
||||
│ └── types/ # TypeScript definitions
|
||||
├── supabase/
|
||||
│ └── migrations/ # Database schema (001-005)
|
||||
├── docker-compose.yml # Supabase services
|
||||
├── docker/
|
||||
│ └── kong.yml # API gateway config
|
||||
└── docs/ # Documentation
|
||||
```
|
||||
|
||||
## 🛠️ Common Tasks
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# All services
|
||||
docker-compose logs -f
|
||||
|
||||
# Just the database
|
||||
docker-compose logs -f db
|
||||
```
|
||||
|
||||
### Reset Database
|
||||
|
||||
```bash
|
||||
# Stop and remove volumes (fresh start)
|
||||
docker-compose down -v
|
||||
|
||||
# Restart (migrations auto-apply)
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Access Database Directly
|
||||
|
||||
```bash
|
||||
# psql CLI
|
||||
docker-compose exec db psql -U postgres -d postgres
|
||||
|
||||
# Or use Supabase Studio (GUI)
|
||||
open http://localhost:54323
|
||||
```
|
||||
|
||||
### Stop Everything
|
||||
|
||||
```bash
|
||||
# Stop services (keep data)
|
||||
docker-compose stop
|
||||
|
||||
# Stop and remove everything
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
## 🔍 What's Included
|
||||
|
||||
### Database (Pre-seeded)
|
||||
|
||||
**30 Units:**
|
||||
- Weight: g, kg, mg, lb, oz
|
||||
- Volume: mL, L, cup, tbsp, tsp
|
||||
- Count: piece, dozen, bottle, can, jar
|
||||
|
||||
**33 Tags:**
|
||||
- Position: Fridge, Freezer, Pantry
|
||||
- Type: Dairy, Meat, Vegetables, Fruits
|
||||
- Dietary: Vegan, Gluten-Free, Organic
|
||||
- Custom: Low Stock, To Buy, Meal Prep
|
||||
|
||||
### Features (Working Now)
|
||||
|
||||
- ✅ Add/Edit/Delete inventory items
|
||||
- ✅ Tag selection (multi-select)
|
||||
- ✅ Unit conversions
|
||||
- ✅ Expiry date tracking with warnings
|
||||
- ✅ Responsive layout (mobile-ready)
|
||||
- ✅ Quantity quick actions (+/- buttons)
|
||||
|
||||
### Features (Coming Soon)
|
||||
|
||||
- ⏳ Barcode scanning (Week 3)
|
||||
- ⏳ User authentication UI
|
||||
- ⏳ Tag management
|
||||
- ⏳ PWA (offline mode)
|
||||
|
||||
## 📚 Next Steps
|
||||
|
||||
### Learn the Stack
|
||||
|
||||
1. **[Architecture Overview](../architecture/overview.md)** - Tech stack and design decisions
|
||||
2. **[Database Schema](../architecture/database.md)** - Tables and relationships
|
||||
3. **[Development Workflow](workflow.md)** - Daily development process
|
||||
|
||||
### Make Your First Change
|
||||
|
||||
1. Pick an issue from Gitea
|
||||
2. Create a branch: `git checkout -b feature/your-feature`
|
||||
3. Make changes, test locally
|
||||
4. Commit: `git commit -m "feat: your feature"`
|
||||
5. Push and create PR
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
See **[Local Setup Guide](local-setup.md)** for:
|
||||
- Port conflicts
|
||||
- Database connection issues
|
||||
- Frontend errors
|
||||
- Environment variables
|
||||
|
||||
## 🤝 Need Help?
|
||||
|
||||
- **Documentation:** Browse `/docs` folder
|
||||
- **Issues:** Create an issue on Gitea
|
||||
- **Local setup:** See [local-setup.md](local-setup.md)
|
||||
|
||||
---
|
||||
|
||||
**Ready to code?** Check out the [Development Workflow](workflow.md)!
|
||||
335
docs/development/local-setup.md
Normal file
335
docs/development/local-setup.md
Normal file
@@ -0,0 +1,335 @@
|
||||
# Pantry - Local Development Setup
|
||||
|
||||
Self-hosted household pantry management app with barcode scanning.
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- **Docker** & **Docker Compose** (for Supabase backend)
|
||||
- **Bun** (for Nuxt frontend) - Install: `curl -fsSL https://bun.sh/install | bash`
|
||||
- **Git**
|
||||
|
||||
### 1. Clone & Setup
|
||||
|
||||
```bash
|
||||
git clone https://gitea.jeanlucmakiola.de/pantry-app/pantry.git
|
||||
cd pantry
|
||||
```
|
||||
|
||||
### 2. Start Supabase (Backend)
|
||||
|
||||
```bash
|
||||
# Start all Supabase services
|
||||
docker-compose up -d
|
||||
|
||||
# Wait ~10 seconds for services to initialize
|
||||
# Check status
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
**Services running:**
|
||||
- PostgreSQL: `localhost:5432`
|
||||
- Supabase API: `http://localhost:54321`
|
||||
- Supabase Studio: `http://localhost:54323` (admin UI)
|
||||
|
||||
### 3. Apply Database Migrations
|
||||
|
||||
The migrations are automatically applied on first startup via `/docker-entrypoint-initdb.d`.
|
||||
|
||||
To verify:
|
||||
```bash
|
||||
docker-compose exec db psql -U postgres -d postgres -c "\dt"
|
||||
```
|
||||
|
||||
You should see: `inventory_items`, `products`, `tags`, `units`, `item_tags`
|
||||
|
||||
### 4. Start Nuxt App (Frontend)
|
||||
|
||||
```bash
|
||||
cd app
|
||||
bun install
|
||||
bun run dev
|
||||
```
|
||||
|
||||
**App running:** `http://localhost:3000`
|
||||
|
||||
### 5. Open & Test
|
||||
|
||||
1. Visit `http://localhost:3000`
|
||||
2. Click "Add Manually" to create your first inventory item
|
||||
3. Access Supabase Studio at `http://localhost:54323` to view database
|
||||
|
||||
---
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
```
|
||||
pantry/
|
||||
├── app/ # Nuxt 4 frontend
|
||||
│ ├── components/ # Vue components
|
||||
│ │ └── inventory/ # Inventory CRUD UI
|
||||
│ ├── composables/ # Supabase client, data hooks
|
||||
│ ├── pages/ # Routes (index, scan, settings)
|
||||
│ └── types/ # TypeScript definitions
|
||||
├── supabase/
|
||||
│ └── migrations/ # SQL schema & seed data
|
||||
├── docker/
|
||||
│ └── kong.yml # API gateway config
|
||||
├── docker-compose.yml # Supabase services
|
||||
└── .env # Environment variables
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Common Tasks
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# All services
|
||||
docker-compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker-compose logs -f db
|
||||
docker-compose logs -f auth
|
||||
```
|
||||
|
||||
### Reset Database
|
||||
|
||||
```bash
|
||||
# Stop services
|
||||
docker-compose down -v
|
||||
|
||||
# Restart (migrations auto-apply)
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Access Database
|
||||
|
||||
```bash
|
||||
# psql
|
||||
docker-compose exec db psql -U postgres -d postgres
|
||||
|
||||
# Supabase Studio (GUI)
|
||||
# http://localhost:54323
|
||||
```
|
||||
|
||||
### Run Migrations Manually
|
||||
|
||||
```bash
|
||||
# If you add new migrations after initial setup
|
||||
docker-compose exec db psql -U postgres -d postgres -f /docker-entrypoint-initdb.d/003_helper_functions.sql
|
||||
```
|
||||
|
||||
### Create Test User
|
||||
|
||||
```bash
|
||||
# Via Supabase Studio: http://localhost:54323
|
||||
# → Authentication → Add User
|
||||
# Email: test@example.com
|
||||
# Password: password123
|
||||
|
||||
# Or via curl:
|
||||
curl http://localhost:54321/auth/v1/signup \
|
||||
-H "apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"test@example.com","password":"password123"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testing Features
|
||||
|
||||
### 1. Inventory Management
|
||||
- Add items manually via form
|
||||
- Edit quantities with +/- buttons
|
||||
- Delete items
|
||||
- View expiry warnings
|
||||
|
||||
### 2. Tags & Organization
|
||||
- Pre-seeded tags: Fridge, Freezer, Pantry, Dairy, Vegan, etc.
|
||||
- Multi-select tags when adding items
|
||||
- Color-coded badges
|
||||
|
||||
### 3. Units
|
||||
- 30 pre-seeded units (g, kg, L, cups, pieces, etc.)
|
||||
- Automatic conversion support
|
||||
|
||||
### 4. Barcode Scanning (Week 3 - In Progress)
|
||||
- Camera access (requires HTTPS in production)
|
||||
- Manual barcode entry fallback
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Port Conflicts
|
||||
|
||||
If ports 5432, 54321, or 3000 are in use:
|
||||
|
||||
```bash
|
||||
# Check what's using the port
|
||||
sudo lsof -i :5432
|
||||
|
||||
# Option 1: Stop conflicting service
|
||||
# Option 2: Change port in docker-compose.yml
|
||||
```
|
||||
|
||||
### Database Connection Refused
|
||||
|
||||
```bash
|
||||
# Wait for PostgreSQL to fully start
|
||||
docker-compose logs db | grep "ready to accept connections"
|
||||
|
||||
# If stuck, restart
|
||||
docker-compose restart db
|
||||
```
|
||||
|
||||
### Migrations Not Applied
|
||||
|
||||
```bash
|
||||
# Verify migrations directory is mounted
|
||||
docker-compose exec db ls -la /docker-entrypoint-initdb.d
|
||||
|
||||
# Manually apply
|
||||
docker-compose exec db bash
|
||||
cd /docker-entrypoint-initdb.d
|
||||
for f in *.sql; do psql -U postgres -d postgres -f "$f"; done
|
||||
```
|
||||
|
||||
### Frontend: Module Not Found
|
||||
|
||||
```bash
|
||||
cd app
|
||||
rm -rf node_modules bun.lock .nuxt
|
||||
bun install
|
||||
bun run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Database Schema
|
||||
|
||||
### Tables
|
||||
|
||||
| Table | Purpose | Rows (Est.) |
|
||||
|-------|---------|-------------|
|
||||
| `inventory_items` | Current inventory | 100-500 |
|
||||
| `products` | Barcode cache (Open Food Facts) | 500-2000 |
|
||||
| `tags` | Organization labels | 50 (33 pre-seeded) |
|
||||
| `units` | Measurement units | 50 (30 pre-seeded) |
|
||||
| `item_tags` | Many-to-many item ↔ tag | 200-1000 |
|
||||
|
||||
### Pre-Seeded Data
|
||||
|
||||
**Units (30):**
|
||||
- Weight: g, kg, mg, lb, oz
|
||||
- Volume: mL, L, cup, tbsp, tsp, gal, qt, pt
|
||||
- Count: piece, dozen, package, bottle, can, jar, box, bag
|
||||
|
||||
**Tags (33):**
|
||||
- Position: Fridge, Freezer, Pantry, Cabinet
|
||||
- Type: Dairy, Meat, Vegetables, Fruits, Snacks
|
||||
- Dietary: Vegan, Gluten-Free, Organic, Kosher, Halal
|
||||
- Custom: Low Stock, To Buy, Meal Prep, Leftovers
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Authentication
|
||||
|
||||
**Default Setup (Development):**
|
||||
- Auto-confirm emails (no SMTP needed)
|
||||
- Anyone can sign up
|
||||
- JWT tokens valid for 1 hour
|
||||
|
||||
**Create Admin User:**
|
||||
|
||||
```sql
|
||||
-- Via psql
|
||||
docker-compose exec db psql -U postgres -d postgres
|
||||
|
||||
INSERT INTO auth.users (id, email, encrypted_password, email_confirmed_at)
|
||||
VALUES (
|
||||
gen_random_uuid(),
|
||||
'admin@pantry.local',
|
||||
crypt('admin123', gen_salt('bf')),
|
||||
NOW()
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Environment Variables
|
||||
|
||||
**.env** (root)
|
||||
```bash
|
||||
POSTGRES_PASSWORD=postgres
|
||||
JWT_SECRET=your-secret-here
|
||||
ANON_KEY=<supabase-anon-key>
|
||||
SERVICE_ROLE_KEY=<supabase-service-role-key>
|
||||
```
|
||||
|
||||
**app/.env** (Nuxt)
|
||||
```bash
|
||||
NUXT_PUBLIC_SUPABASE_URL=http://localhost:54321
|
||||
NUXT_PUBLIC_SUPABASE_ANON_KEY=<same-as-above>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Development Workflow
|
||||
|
||||
1. **Make changes** to Nuxt app → Hot reload at `localhost:3000`
|
||||
2. **Database changes** → Create new migration in `supabase/migrations/`
|
||||
3. **Test** → Add items, scan barcodes, check database
|
||||
4. **Commit** → Feature branch → PR to `develop`
|
||||
|
||||
---
|
||||
|
||||
## 🚢 Production Deployment (Coming Soon)
|
||||
|
||||
See `docs/DEPLOYMENT.md` for:
|
||||
- Coolify setup
|
||||
- Environment configuration
|
||||
- SSL/HTTPS setup
|
||||
- Backups
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- [Architecture](docs/ARCHITECTURE.md)
|
||||
- [Database Schema](docs/DATABASE.md)
|
||||
- [API Reference](docs/API.md)
|
||||
- [Development Guide](docs/DEVELOPMENT.md)
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
This is a personal project, but issues and PRs welcome!
|
||||
|
||||
1. Fork the repo
|
||||
2. Create feature branch (`git checkout -b feature/amazing-feature`)
|
||||
3. Commit changes (`git commit -m 'Add amazing feature'`)
|
||||
4. Push to branch (`git push origin feature/amazing-feature`)
|
||||
5. Open Pull Request
|
||||
|
||||
---
|
||||
|
||||
## 📝 License
|
||||
|
||||
MIT License - See LICENSE file
|
||||
|
||||
---
|
||||
|
||||
## 🙋 Support
|
||||
|
||||
- Issues: https://gitea.jeanlucmakiola.de/pantry-app/pantry/issues
|
||||
- Docs: https://gitea.jeanlucmakiola.de/pantry-app/pantry/wiki
|
||||
|
||||
---
|
||||
|
||||
**Version:** 0.1.0-alpha (MVP in progress)
|
||||
**Status:** Week 2 complete, Week 3 in progress (14/34 issues done)
|
||||
Reference in New Issue
Block a user