···176 setSkippedFiles(result.skippedFiles || [])
177 setFailedFiles(result.failedFiles || [])
178 setUploadedCount(result.uploadedCount || result.fileCount || 0)
179+180+ // Debug: log failed files
181+ console.log('Failed files:', result.failedFiles)
182+183+ // Check for 419/413 errors and show alert
184+ const hasSizeError = result.failedFiles?.some((file: any) => {
185+ const error = file.error?.toLowerCase() || ''
186+ console.log('Checking error:', error, 'contains PDS?', error.includes('pds'))
187+ return error.includes('pds is not allowing') ||
188+ error.includes('your pds is not allowing') ||
189+ error.includes('request entity too large')
190+ })
191+192+ console.log('Has size error:', hasSizeError)
193+194+ if (hasSizeError) {
195+ window.alert('Some files were too large for your PDS. Your PDS is not allowing uploads large enough to store your site. Please contact your PDS host. This could also possibly be a result of it being behind Cloudflare free tier.')
196+ }
197+198 setSelectedSiteRkey('')
199 setNewSiteName('')
200 setSelectedFiles(null)
···350351 const isTimeout = error?.name === 'AbortError' || error?.message === 'Upload timeout';
352 const isRateLimited = error?.status === 429 || error?.message?.toLowerCase().includes('rate');
353+ const isRequestEntityTooLarge = error?.status === 419 || error?.status === 413;
354+355+ // Special handling for 419/413 Request Entity Too Large errors
356+ if (isRequestEntityTooLarge) {
357+ const customError = new Error('Your PDS is not allowing uploads large enough to store your site. Please contact your PDS host. This could also possibly be a result of it being behind Cloudflare free tier.');
358+ (customError as any).status = 419;
359+ throw customError;
360+ }
361362 // Retry on DPoP nonce conflicts, timeouts, or rate limits
363 if ((isDPoPNonceError || isTimeout || isRateLimited) && attempt < maxRetries - 1) {