Releases: 04r/listal
Releases · 04r/listal
Release list
1.0.17
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.16
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.16
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.15
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.14
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.13
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.12
v1.0.12 — playlist create hotfix - sql/005_defensive_playlist_policies.sql: re-applies sp_insert / sp_update / sp_delete / spm_insert / spm_delete in case 003 didn't fully apply on a given DB. Also sets owner_id default to auth.uid() so the client can never send a mismatching value. - Client: create() now pulls the live auth.uid via supabase.auth.getUser() instead of the cached meId, and generates the playlist id client-side so the follow-up SELECT-after-INSERT can't hit the members-based SELECT policy before the owner-membership row is written. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.11
v1.0.11 — RLS hotfix + visualizer styles + view modes + zoom Critical: - sql/004_fix_member_rls_recursion.sql: shared_playlist_members SELECT policy self-referenced, so Postgres threw "infinite recursion detected in policy" and every playlist create failed. Replace with a SECURITY DEFINER helper that bypasses its own RLS. Same helper wired into every other policy that had to look up membership. UI: - Audio visualizer: click canvas to cycle style; four new renderers (mirror, radial, blocks, ribbon); sensitivity, bar count, smoothing, and mirror controls exposed via Settings → Visualizer. - TrackList sticky column header had `bg-[var(--grad-header)]` which compiles to `background-color: linear-gradient(...)` (invalid → falls back to transparent). Switched to inline `background:` so content scrolled underneath is properly covered. - Track view can switch between List and Grid (grid shows large artwork squares) via Settings → Appearance. - UI scale slider (80%..160%) in Settings → Appearance globally rescales every text and control by adjusting the root font-size. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.10
v1.0.10 — playlists are cloud-only - Sidebar consolidates the old local Playlists + Shared groups into one Playlists group backed by Supabase shared_playlists. Solo and multi-member playlists live in the same list; a member-count icon marks the shared ones. - One-shot startup migration copies any pre-existing local (SQLite) playlists into Supabase as solo playlists, then deletes the local rows. Idempotent — collisions are skipped and second launches do nothing. - Add-to-playlist submenus everywhere (TrackList, SearchView, AddTrack dialog) now write to the cloud store instead of the SQLite playlist tables. The local tracks table stays as a metadata cache. - Sidebar's + always opens the friend-picker dialog; leave the picker empty for a solo playlist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1.0.10
v1.0.10 — playlists are cloud-only - Sidebar consolidates the old local Playlists + Shared groups into one Playlists group backed by Supabase shared_playlists. Solo and multi-member playlists live in the same list; a member-count icon marks the shared ones. - One-shot startup migration copies any pre-existing local (SQLite) playlists into Supabase as solo playlists, then deletes the local rows. Idempotent — collisions are skipped and second launches do nothing. - Add-to-playlist submenus everywhere (TrackList, SearchView, AddTrack dialog) now write to the cloud store instead of the SQLite playlist tables. The local tracks table stays as a metadata cache. - Sidebar's + always opens the friend-picker dialog; leave the picker empty for a solo playlist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>