Skip to content

Releases: 04r/listal

1.0.17

Choose a tag to compare

@04r 04r released this 02 Jul 20:28
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

Choose a tag to compare

@04r 04r released this 02 Jul 19:32
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

Choose a tag to compare

@04r 04r released this 02 Jul 19:32
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

Choose a tag to compare

@04r 04r released this 02 Jul 19: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.14

Choose a tag to compare

@04r 04r released this 02 Jul 18:21
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

Choose a tag to compare

@04r 04r released this 02 Jul 18:09
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

Choose a tag to compare

@04r 04r released this 02 Jul 15:29
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

Choose a tag to compare

@04r 04r released this 02 Jul 15:06
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

Choose a tag to compare

@04r 04r released this 02 Jul 14:26
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

Choose a tag to compare

@04r 04r released this 02 Jul 14:26
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>