Version: 1.0
Date: February 10, 2026
Duration: 6 Weeks to MVP
Status: Pre-Development
Before beginning development, ensure you have completed:
- Read all documentation in this directory
- Supabase account created
- Development environment set up (see Development_Setup_Guide.md)
- Git repository initialized
- All prerequisites installed (.NET SDK, Node.js, etc.)
Tasks:
- Create Supabase project
- Save all credentials securely
- Run PostgreSQL migration script (see Database_Schema_Design.md)
- Verify all tables created correctly
- Enable Row Level Security on all tables
- Create RLS policies
- Test database connection
Deliverables:
- ✅ Supabase project operational
- ✅ All tables created with proper indexes
- ✅ RLS policies active
Verification:
-- Run in Supabase SQL Editor
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
-- Should show: families, members, tasks, point_transactions, rewards, reward_redemptionsTasks:
- Create FamilyTogether.API project (
dotnet new webapi) - Install NuGet packages
- Create folder structure (Controllers, Services, Data, etc.)
- Create AppDbContext with all entities
- Configure appsettings.json with Supabase connection
- Configure Program.cs (JWT, CORS, DbContext)
- Create health check endpoint for testing
- Test API runs locally (dotnet run)
Deliverables:
- ✅ API project structure complete
- ✅ Database connection working
- ✅ API accessible at http://localhost:5000
Verification:
dotnet run
# Navigate to https://localhost:5001/swagger
# Should see Swagger UITasks:
- Create AuthController
- Implement POST /api/auth/register endpoint
- Implement POST /api/auth/login endpoint
- Configure JWT authentication middleware
- Create test user via Supabase dashboard
- Test login endpoint with Postman
- Verify JWT token generation
Code to Implement:
// AuthController.cs
[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] RegisterRequest request)
{
// 1. Create user in Supabase Auth
// 2. Create family record
// 3. Create parent member record
// 4. Return JWT token
}
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginRequest request)
{
// 1. Verify credentials with Supabase
// 2. Get family & member info
// 3. Return JWT token
}Deliverables:
- ✅ Users can register
- ✅ Users can login
- ✅ JWT tokens issued correctly
Tasks:
- Create Railway account
- Connect GitHub repository
- Configure environment variables in Railway
- Deploy API
- Test production API endpoint
- Configure custom domain (optional)
Environment Variables to Set:
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_KEY=your_anon_key
SUPABASE_JWT_SECRET=your_jwt_secret
DATABASE_URL=postgresql://...
CORS_ORIGINS=https://familytogether.netlify.app
Deliverables:
- ✅ API deployed and accessible
- ✅ Production database connection working
- ✅ Authentication working in production
Tasks:
- Create FamilyTogether.SPA folder structure
- Create index.html with basic layout
- Implement IndexedDB initialization (src/services/db.js)
- Create object stores (tasks, members, syncQueue, etc.)
- Create IndexedDB wrapper functions (get, add, update, delete)
- Test IndexedDB in browser console
Code to Implement:
// src/services/db.js
export async function initDB() {
return new Promise((resolve, reject) => {
const request = indexedDB.open('FamilyTogetherDB', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// Create object stores with indexes
const tasksStore = db.createObjectStore('tasks', { keyPath: 'id' });
tasksStore.createIndex('family_id', 'family_id', { unique: false });
tasksStore.createIndex('assigned_to', 'assigned_to', { unique: false });
// ... create other stores
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}Deliverables:
- ✅ IndexedDB initialized
- ✅ All object stores created
- ✅ CRUD operations working
Tasks:
- Add Supabase JavaScript client
- Create auth service (src/services/auth.js)
- Implement login UI (HTML + CSS)
- Implement register UI
- Handle JWT token storage in localStorage
- Create authentication state management
- Test login/register flows
Code to Implement:
// src/services/auth.js
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(CONFIG.supabaseUrl, CONFIG.supabaseKey);
export async function login(email, password) {
const { data, error } = await supabase.auth.signInWithPassword({
email,
password
});
if (error) throw error;
// Store token
localStorage.setItem('auth_token', data.session.access_token);
return data;
}Deliverables:
- ✅ Users can login via SPA
- ✅ JWT token stored securely
- ✅ UI shows logged-in state
Tasks:
- Create sync service (src/services/sync.js)
- Implement SyncManager class
- Create queueChange() function
- Implement sync() function to POST to API
- Handle sync responses (accepted/rejected changes)
- Implement conflict resolution (apply server version)
- Add online/offline event listeners
Code to Implement:
// src/services/sync.js
export class SyncManager {
constructor(db, apiUrl, authToken) {
this.db = db;
this.apiUrl = apiUrl;
this.authToken = authToken;
}
startAutoSync() {
setInterval(() => this.sync(), 30000); // 30 seconds
window.addEventListener('online', () => this.sync());
}
async sync() {
if (!navigator.onLine) return;
// Get pending changes from sync queue
const changes = await this.db.syncQueue
.where('status').equals('pending')
.toArray();
// POST to /api/sync
const response = await fetch(`${this.apiUrl}/api/sync`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.authToken}`
},
body: JSON.stringify({ changes })
});
const result = await response.json();
// Process accepted/rejected changes
await this.processServerResponse(result);
}
}Deliverables:
- ✅ Changes queued when offline
- ✅ Auto-sync every 30 seconds when online
- ✅ Sync conflicts handled
Tasks:
- Test create task while offline
- Verify task in IndexedDB
- Verify task in sync queue
- Go online and wait for sync
- Verify task synced to server
- Test edit task offline
- Test delete task offline
- Document any issues found
Test Scenarios:
- Create 5 tasks offline → Sync → Verify all 5 in database
- Edit task offline → Sync → Verify changes applied
- Delete task offline → Sync → Verify soft delete
- Trigger conflict → Verify LWW resolution
Deliverables:
- ✅ All offline scenarios pass
- ✅ Sync working reliably
Tasks:
- Create WPF project (
dotnet new wpf) - Install NuGet packages (EF Core SQLite, Newtonsoft.Json)
- Create folder structure (Data, Services, ViewModels, Views)
- Create AppDbContext for SQLite
- Create entity models matching database schema
- Run initial EF migration
- Test SQLite database created in AppData
SQLite Location:
%AppData%\FamilyTogether\app.db
Deliverables:
- ✅ WPF project structure complete
- ✅ SQLite database initialized
- ✅ Can save and retrieve data locally
Tasks:
- Create RelayCommand class
- Create ObservableObject base class
- Create MainViewModel
- Create TasksViewModel
- Implement INotifyPropertyChanged pattern
- Create basic UI (MainWindow.xaml)
- Create TasksView.xaml
- Bind ViewModels to Views
- Test two-way data binding
Code to Implement:
// ViewModels/TasksViewModel.cs
public class TasksViewModel : ObservableObject
{
private readonly ITaskService _taskService;
private ObservableCollection<TaskEntity> _tasks;
public ObservableCollection<TaskEntity> Tasks
{
get => _tasks;
set => SetProperty(ref _tasks, value);
}
public ICommand LoadTasksCommand { get; }
public ICommand CreateTaskCommand { get; }
public TasksViewModel(ITaskService taskService)
{
_taskService = taskService;
LoadTasksCommand = new RelayCommand(async () => await LoadTasksAsync());
CreateTaskCommand = new RelayCommand<TaskEntity>(async (task) => await CreateTaskAsync(task));
}
private async Task LoadTasksAsync()
{
var tasks = await _taskService.GetTasksAsync();
Tasks = new ObservableCollection<TaskEntity>(tasks);
}
}Deliverables:
- ✅ MVVM pattern implemented
- ✅ UI responsive to ViewModel changes
- ✅ Commands working
Tasks:
- Create SyncService class
- Implement HttpClient for API calls
- Create sync queue processing logic
- Implement timer for auto-sync (30 seconds)
- Handle offline/online scenarios
- Apply server updates to local database
- Test sync with Railway API
Code to Implement:
// Services/SyncService.cs
public class SyncService
{
private readonly HttpClient _httpClient;
private readonly AppDbContext _dbContext;
private readonly Timer _syncTimer;
public async Task SyncAsync()
{
// Get pending changes
var changes = await _dbContext.SyncQueue
.Where(sq => sq.Status == "pending")
.ToListAsync();
if (!changes.Any()) return;
// Build payload
var payload = new { changes = changes.Select(...) };
// POST to API
var response = await _httpClient.PostAsJsonAsync("/api/sync", payload);
var result = await response.Content.ReadFromJsonAsync<SyncResponse>();
// Process response
await ProcessServerResponse(result);
}
}Deliverables:
- ✅ Auto-sync working every 30 seconds
- ✅ Offline changes synced when online
- ✅ Server updates applied to local DB
Tasks:
- Test all CRUD operations
- Test offline functionality
- Test sync with SPA (multi-device scenario)
- Add loading indicators
- Add error handling and user feedback
- Polish UI (colors, fonts, spacing)
- Create installer (optional)
Deliverables:
- ✅ WPF app fully functional
- ✅ Syncs with SPA
- ✅ User experience polished
Tasks:
- Create SyncController
- Implement POST /api/sync endpoint
- Parse client changes
- Validate data
- Detect conflicts (compare timestamps)
- Implement Last-Write-Wins resolution
- Save changes to database
- Return server updates since last sync
- Create SyncLog records
Code to Implement:
// Controllers/SyncController.cs
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class SyncController : ControllerBase
{
private readonly ISyncService _syncService;
[HttpPost]
public async Task<IActionResult> Sync([FromBody] SyncRequest request)
{
var userId = User.FindFirst("sub").Value;
var familyId = await GetFamilyIdForUser(userId);
var response = await _syncService.ProcessSyncAsync(
familyId,
request.Changes,
request.LastSyncTimestamp
);
return Ok(response);
}
}Deliverables:
- ✅ Sync endpoint working
- ✅ Conflicts resolved correctly
- ✅ Server sends back updates
Tasks:
- Create TasksController
- Implement GET /api/tasks
- Implement POST /api/tasks
- Implement PUT /api/tasks/{id}
- Implement DELETE /api/tasks/{id}
- Implement POST /api/tasks/{id}/complete
- Implement POST /api/tasks/{id}/approve
- Implement POST /api/tasks/{id}/reject
- Add authorization checks (role-based)
- Test all endpoints with Postman
Deliverables:
- ✅ All task endpoints working
- ✅ Parent/child role checks enforced
- ✅ Integration tests passing
Tasks:
- Create PointsController
- Implement GET /api/points
- Implement GET /api/points/history
- Implement POST /api/points/adjust (admin only)
- Create RewardsController
- Implement CRUD for rewards
- Implement POST /api/rewards/{id}/redeem
- Test point calculation accuracy
- Test reward redemption flow
Deliverables:
- ✅ Points system working
- ✅ Rewards can be created and redeemed
- ✅ Point transactions accurate
Tasks:
- Create FamilyController
- Implement GET /api/family/members
- Implement POST /api/family/members
- Implement DELETE /api/family/members/{id}
- Write unit tests for all services
- Write integration tests for all controllers
- Test end-to-end workflows
- Fix any bugs found
Deliverables:
- ✅ Family management complete
- ✅ Test coverage >80%
- ✅ All critical bugs fixed
Tasks:
- Add XML comments to all public methods
- Update API documentation
- Review code for best practices
- Refactor any messy code
- Run security scan
- Update README.md
- Create deployment guide
Deliverables:
- ✅ Code well-documented
- ✅ Ready for deployment
Test Scenarios:
-
Two SPAs syncing:
- Create task in SPA 1
- Verify appears in SPA 2 after sync
- Edit task in SPA 2
- Verify changes appear in SPA 1
-
SPA and WPF syncing:
- Create task in WPF
- Verify appears in SPA
- Complete task in SPA
- Approve task in WPF
-
Conflict resolution:
- Edit same task offline in both apps
- Bring online, sync both
- Verify LWW resolution
Deliverables:
- ✅ All multi-device scenarios pass
- ✅ Sync working reliably
Test Scenarios:
- User offline for 1 week, 100+ changes, then sync
- Network interruption during sync
- Corrupted IndexedDB/SQLite database
- Extremely large task lists (1000+ tasks)
- Rapid task creation (stress test)
- Invalid JWT token
- Database connection failure
- Supabase downtime simulation
Deliverables:
- ✅ Edge cases handled gracefully
- ✅ Error messages helpful
Tasks:
- Run database query performance tests
- Add missing indexes if queries slow
- Test API response times under load
- Optimize N+1 query problems
- Test IndexedDB with large datasets
- Optimize sync payload size
- Implement pagination for large lists
- Add caching where appropriate
Performance Targets:
- API responses: <500ms p95
- Database queries: <50ms average
- Sync for 100 changes: <2 seconds
- IndexedDB operations: <100ms
Deliverables:
- ✅ Performance benchmarks met
- ✅ App feels fast and responsive
Security Checklist:
- All endpoints require authentication (except login/register)
- RLS policies prevent cross-family data access
- Passwords hashed with bcrypt
- JWT tokens expire (60 minutes)
- HTTPS enforced in production
- CORS configured correctly
- SQL injection prevented (parameterized queries)
- XSS prevented (input sanitization)
- Rate limiting implemented
- Sensitive data not in logs
Deliverables:
- ✅ Security audit complete
- ✅ All vulnerabilities addressed
Tasks:
- Review all environment variables
- Set up production Supabase project (if separate)
- Configure production database
- Run migrations in production
- Set up monitoring (Sentry, Uptime Robot)
- Create deployment checklist
- Test production API endpoints
Deliverables:
- ✅ Production environment ready
- ✅ Monitoring configured
Tasks:
- Create Netlify account
- Connect GitHub repository
- Configure build settings
- Set environment variables
- Create netlify.toml
- Deploy to production
- Test production SPA
- Configure custom domain (optional)
netlify.toml:
[build]
publish = "."
command = ""
[[redirects]]
from = "/*"
to = "/index.html"
status = 200Deliverables:
- ✅ SPA deployed and accessible
- ✅ All features working in production
Tasks:
- Build WPF release configuration
- Create installer (optional - ClickOnce)
- Create GitHub release
- Upload WPF executable
- Write installation instructions
- Test download and install
- Update app to point to production API
Deliverables:
- ✅ WPF app available for download
- ✅ Installation process documented
Tasks:
- Invite 5-10 beta users
- Provide clear instructions
- Monitor for errors (Sentry)
- Collect user feedback
- Create bug tracking spreadsheet
- Fix critical bugs immediately
- Plan improvements for v1.1
Deliverables:
- ✅ Beta users onboarded
- ✅ Feedback collected
- ✅ Critical bugs fixed
Tasks:
- Create user manual (how to use the app)
- Create FAQ document
- Record demo video (optional)
- Write blog post announcement
- Update README.md with screenshots
- Create troubleshooting guide
- Write privacy policy
- Write terms of service
Deliverables:
- ✅ User documentation complete
- ✅ Legal documents ready
Tasks:
- Final smoke test of all features
- Enable Supabase RLS in production
- Send announcement to beta users
- Post on social media (optional)
- Monitor error logs closely
- Be ready for hotfixes
- Celebrate! 🎉
Deliverables:
- ✅ FamilyTogether v1.0 LAUNCHED!
Use this checklist each day:
- Pull latest code from git
- Review tasks for today
- Check Sentry for errors (if deployed)
- Prioritize any bugs
- Write tests first (TDD when possible)
- Commit frequently (every feature/fix)
- Write clear commit messages
- Comment complex code
- Follow code style guide
- Run all tests
- Push code to git
- Update progress tracking
- Document any blockers
- Plan next day's tasks
| Risk | Mitigation |
|---|---|
| Supabase down | Have Railway API use direct PostgreSQL connection |
| IndexedDB not working | Fallback to localStorage for critical data |
| Sync conflicts frequent | Provide manual resolution UI |
| Railway free tier limits | Monitor usage, upgrade if needed |
| JWT security breach | Implement refresh tokens, short expiry |
| Offline for 30+ days | Implement sync pagination, limit to 1000 changes |
Track these weekly:
| Metric | Week 1 | Week 2 | Week 3 | Week 4 | Week 5 | Week 6 |
|---|---|---|---|---|---|---|
| API endpoints complete | 2 | 5 | 8 | 15 | 20 | 24 |
| Test coverage % | 20% | 40% | 60% | 75% | 85% | 85% |
| Bugs found | 5 | 10 | 15 | 20 | 10 | 5 |
| Bugs fixed | 3 | 8 | 12 | 18 | 20 | 24 |
| Features complete | 10% | 30% | 50% | 75% | 95% | 100% |
- Push notifications
- Task templates
- Weekly/monthly reports
- Export data to CSV
- Dark mode
- Streak system
- Recurring tasks improvements
- Mobile responsive design
- Progressive Web App (PWA)
- Native mobile apps (React Native / .NET MAUI)
- Advanced conflict resolution (manual review)
- Team/school features
- API for third-party integrations
END OF IMPLEMENTATION ROADMAP