Full deployment history for this project.
Consolidate open PRs, compatible upgrades, and platform auth Validated locally and through a READY Vercel preview. Merge commit preserves every original PR head in ancestry.
chore: validate consolidated upgrades and platform auth
chore: validate consolidated upgrades and platform auth
🎨 Palette: Add confirmation dialog for clearing playlist - Implement AlertDialog for 'Clear Playlist' action in PlaylistPanel - Update workspace component tests to reflect the new interaction flow - Update Palette journal with learnings about destructive actions Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
⚡ Bolt: cache archive statistics in getArchiveStats Implement memoization for archive statistics in `lib/podcast/archive.ts` to avoid O(N) recalculation on every request. The cache is invalidated in `writeMemory` and returns a shallow copy to prevent external mutation. Performance impact: Reduces execution time of `getArchiveStats` by ~85% (from ~14ms to ~2ms for 100 calls in baseline tests). Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
⚡ Bolt: Optimize archive service performance - Pre-compute static seed sources to avoid repeated mapping - Implement caching for expensive archive stats calculation - Invalidate cache when sources or entries are added - Ensure getArchiveStats returns shallow copies for safety Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
🎨 Palette: add confirmation dialog for clear playlist action - Implement AlertDialog to prevent accidental deletion of the local playlist. - Update tests to reflect the new confirmation flow. - Ensure keyboard accessibility and proper ARIA roles for the dialog. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
🛡️ Sentinel: Add authentication to OPML import endpoint Add `requirePlatformApiKey` check to `app/api/v1/opml/import/route.ts` to prevent unauthorized mass feed syncing when `PLATPHORM_PROTECTED=1` is enabled. Added `__tests__/opml-auth.test.ts` to verify the fix. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
🛡️ Sentinel: [HIGH] Fix missing authentication on sensitive endpoints Added API key requirements to the /api/v1/audit and /api/v1/jobs endpoints to prevent unauthorized access to system logs and job queues. 🚨 Severity: HIGH 💡 Vulnerability: Missing authentication on sensitive endpoints 🎯 Impact: Unauthorized access to system audit logs and job management 🔧 Fix: Integrated requirePlatformApiKey(request) check in the affected route handlers ✅ Verification: Added vitest reproduction and verification tests in __tests__/audit_auth.test.ts Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Merge pull request #189 from mbarbine/copilot/add-podcast-playlist-feature Persist submitted podcast URLs into session-scoped public playlists with attribution
feat: auto-persist submitted podcasts to public session playlists Agent-Logs-Url: https://github.com/mbarbine/platphorm-podcasts/sessions/90d52f7d-726a-4163-a531-bc67b0b3587a Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #188 from mbarbine/copilot/add-podcast-playlist-functionality Unify ingest contract and add persistent playlists, clip pipeline, and engagement analytics
fix: stabilize pocketcasts resolver test and lint warning Agent-Logs-Url: https://github.com/mbarbine/platphorm-podcasts/sessions/93ced048-7258-4c0c-afe2-1e6d3aedc897 Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
feat: add playlists clips analytics and enrich ingest metadata Agent-Logs-Url: https://github.com/mbarbine/platphorm-podcasts/sessions/93ced048-7258-4c0c-afe2-1e6d3aedc897 Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #187 from mbarbine/copilot/merge-all-pull-requests Consolidate all open PRs into one branch
fix: resolve consolidated branch validation issues Agent-Logs-Url: https://github.com/mbarbine/platphorm-podcasts/sessions/e0238364-8d39-4c60-a291-0b061e9cf7d8 Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
chore: finalize consolidated pull request branch Agent-Logs-Url: https://github.com/mbarbine/platphorm-podcasts/sessions/e0238364-8d39-4c60-a291-0b061e9cf7d8 Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
🧹 Bolt: [code health improvement] Refactor app/api/v1/ingest/route.ts
🧪 Testing: Add tests for getCuratedCatalogEpisodes
🧪 Testing Improvement: test getFeedIndexCatalogPodcasts
🧹 Bolt: Remove commented out dead code from podcast submission route
🧪 Add tests for Supabase createClient
perf: optimize webhook deliveries with concurrent fetching Replaced the sequential `for...of` loop in the webhook delivery cron job with concurrent fetching using `Promise.allSettled`. This significantly reduces the total execution time of the cron job.
fix: provide rss json-feed test mutation script
Merge pull request #143 from mbarbine/bolt/eq-bars-extraction-16510515235169277838 ⚡ Bolt: [performance improvement] Extract EqBars to reduce React re-renders
feat: implement text list bulk ingestion and generic category tag extraction - Add `categories` extraction (for `<category>`, `<itunes:category>`, and `<label>`) to all RSS/Atom/JSONFeed/OPML parsers in `lib/rss.ts`. - Expand `detectCategory` in `lib/categories.ts` to accept an array of parsed tags and enhance categorization based on feed labels. - Introduce `text-list` format detection in `lib/rss.ts` and `app/api/v1/ingest/route.ts` to support bulk importing plain-text URL lists like OPML playlists directly via the ingest endpoint. - Provide a robust background CLI `scripts/bulk-ingest.ts` for massive (62k+) lists to bypass serverless timeouts. - Fix the N+1 query issue in `app/api/cron/daily-sync/route.ts` with Supabase upsert payload normalization, fixing the existing test suite failure in `daily-sync-performance.test.ts`. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
perf(ui): memoize podcast list and category lookups Extract the inline `.find()` logic for `selectedCategoryObj` and the inline `.filter()` logic for `communityPodcasts` into separate `useMemo` hooks in `app/page.tsx`. This avoids repeatedly recalculating and filtering arrays on every render (such as during fast-firing audio tuner updates), decreasing unnecessary CPU overhead and garbage collection. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>