Skip to content

v0.1.0

Latest

Choose a tag to compare

@github-actions github-actions released this 04 Sep 19:17
· 152 commits to main since this release
e86ce56

What's Changed

  • Add per-podcast Nostr feed: show kind:1 notes from any client by @ChadFarrow in #1
  • Auto-scroll to episode panel on mobile when a podcast is selected by @ChadFarrow in #2
  • Promote Nostr feed to a global home-page section + fix mobile viewport by @ChadFarrow in #3
  • Linkify URLs and nostr: mentions inside note bodies by @ChadFarrow in #4
  • Hide raw nostr: URIs from displayed note content by @ChadFarrow in #5
  • Add reply / repost / zap actions to feed cards by @ChadFarrow in #6
  • Quote repost + scrollable episode list + mobile header overflow fix by @ChadFarrow in #7
  • Promote podcast selection to a full-page detail view by @ChadFarrow in #8
  • Extract useNostrFeed hook + wrapper by @ChadFarrow in #9
  • Stop iOS Safari from zooming + sticking on form-input focus by @ChadFarrow in #10
  • Click recipients stamp to expand value-block split details by @ChadFarrow in #11
  • Show raw value-block split, drop computed % and "weight" label by @ChadFarrow in #12
  • Drop type prefix from value-block recipient row by @ChadFarrow in #13
  • Add Fountain relay to publish targets by @ChadFarrow in #14
  • Resolve boost amount via quoted kind:9735 zap receipts by @ChadFarrow in #15
  • Fall back to bolt11 HRP when zap receipt omits amount tag by @ChadFarrow in #17
  • Add private boost option for logged-in Nostr users by @ChadFarrow in #21
  • Add BoostBox support for LNURL boosts and intermix in global feed by @ChadFarrow in #20
  • Scaffold Spark rail, BoostBox sidechannel, and Nostr-backed wallet backup by @ChadFarrow in #18
  • Post-merge refactor cleanup by @ChadFarrow in #22
  • Remove dev test-feed button and RSS scaffolding by @ChadFarrow in #23
  • Cache feed-author kind:0 + NIP-65 fallback for missing profiles by @ChadFarrow in #24
  • Add purplepag.es to kind:0 / kind:10002 lookups by @ChadFarrow in #25
  • Default avatar with deterministic color + initial by @ChadFarrow in #26
  • Fall back to DefaultAvatar on broken picture URLs by @ChadFarrow in #27
  • Fix mobile copy in episode-list empty state by @ChadFarrow in #28
  • chore: trigger deploy to verify Vercel main-only config by @ChadFarrow in #29
  • Update search placeholder to Bowl After Bowl by @ChadFarrow in #30
  • Show reply threads inline and persist repost state on Nostr feeds by @ChadFarrow in #31
  • Format episode duration and player time as h:mm:ss by @ChadFarrow in #32
  • Add Spark to the zap rail and surface LNURL ERROR responses by @ChadFarrow in #33
  • Tag zap errors with their source so users can tell what's rejecting by @ChadFarrow in #34
  • Link podcast names in note cards into the show detail view by @ChadFarrow in #35
  • Add Amber signer support for Android by @ChadFarrow in #36
  • Add PWA support so Android users can install to Home Screen by @ChadFarrow in #37
  • Cover iOS PWA basics: splash screens + safe-area insets by @ChadFarrow in #38
  • Harden Amber sign-in round-trip by @ChadFarrow in #39
  • Collapse Amber + extension buttons into one Sign in with Nostr by @ChadFarrow in #40
  • Terminate Amber callbackUrl with &event= per NIP-55 spec by @ChadFarrow in #41
  • Switch Amber to same-tab dispatch + clipboard return by @ChadFarrow in #42
  • Add Continue-from-Amber tap and label the Amber path explicitly by @ChadFarrow in #43
  • Consolidate Lightning wallet into a single modal in the account menu by @ChadFarrow in #44
  • Portal WalletModal to body to escape header's containing block by @ChadFarrow in #45
  • Drop the rail picker and "Signed as" indicator from the boost modal by @ChadFarrow in #46
  • Drop the "Paying with " line from the boost modal by @ChadFarrow in #47
  • Sanitize kind:0 profile JSON + add a route-level error boundary by @ChadFarrow in #48
  • Tolerate cached notes that predate the replies field by @ChadFarrow in #49
  • Add MIT license by @ChadFarrow in #50
  • Time-bound bunker connect + better Primal iOS auth-URL surface by @ChadFarrow in #51
  • Auto-retry the Generate flow when Safari regains visibility by @ChadFarrow in #52
  • Fix React error #310 on iOS remote-signer login by @ChadFarrow in #53
  • fix: retry nostrconnect while pending, not only after failure by @ChadFarrow in #54
  • Skip Nostr note when all splits fail; allow Nostr-only boosts by @ChadFarrow in #55
  • Show pending and live items in episode lists by @ChadFarrow in #56
  • Parse podcast:liveItem from RSS for pending live items by @ChadFarrow in #57
  • Probe the NWC wallet at connect-time by @ChadFarrow in #58
  • NWC probe: fall back to get_balance if get_info isn't granted by @ChadFarrow in #59
  • Make NWC connect failures impossible to miss by @ChadFarrow in #60
  • Add in-memory fallback for the NWC URI when localStorage is hostile by @ChadFarrow in #61
  • Sort pending live items ascending by start time by @ChadFarrow in #62
  • Require a connected wallet to send a boost by @ChadFarrow in #63
  • Fix REFRESH button showing stale cached content by @ChadFarrow in #64
  • Always do a full fetch on mount, not incremental since-based by @ChadFarrow in #65
  • fix: parse podcast:value from RSS liveItem blocks by @ChadFarrow in #66
  • Enforce 100 sat minimum boost to ensure 1% splits get paid by @ChadFarrow in #67
  • feat: add fullscreen now playing view by @ChadFarrow in #68
  • Add Boost All Tracks feature (MOAB branch) by @ChadFarrow in #69
  • feat: expandable episode rows with per-episode boost by @ChadFarrow in #70
  • Fix text overlap in episode rows on mobile by @ChadFarrow in #71
  • feat: add podcast:socialInteract tag support (Nostr only) by @ChadFarrow in #75
  • fix(social-interact): parse socialInteract from RSS since PI doesn't expose it by @ChadFarrow in #76
  • Tighten thread indentation on mobile by @ChadFarrow in #77
  • Move discussion button off inline metadata row on mobile by @ChadFarrow in #78
  • Swap Spark rail from Breez to Spark Labs SDK by @ChadFarrow in #79
  • Pin podcast show header while episodes scroll; fix nested scroll and button overflow by @ChadFarrow in #80
  • Remove preset amount buttons from boost modal — input only by @ChadFarrow in #81
  • Start boost modal with blank amount field instead of a pre-filled default by @ChadFarrow in #82
  • feat: show full RSS show notes (content:encoded) in expanded episode panel by @ChadFarrow in #83
  • fix: change boost modal amount placeholder from "enter sats" to "enter amount" by @ChadFarrow in #84
  • fix: move show header buttons inside the flex-1 info column to prevent overflow by @ChadFarrow in #85
  • Add full-page episode detail view for better mobile UX by @ChadFarrow in #86
  • Add per-episode Nostr boost feed to episode detail view by @ChadFarrow in #87
  • Tier 1 refactoring: extract shared utilities to eliminate duplication by @ChadFarrow in #88
  • Remove DeferredOnScroll from global feed on home page by @ChadFarrow in #89
  • Add episode share links (?podcast=&episode=) by @ChadFarrow in #90
  • Fix Primal/NIP-46 paste login timing out on iOS same-device flow by @ChadFarrow in #91
  • Make remote signer dropdown background opaque by @ChadFarrow in #92
  • Auto-retry and translate 'subscription closed' NIP-46 errors by @ChadFarrow in #93
  • Improve Primal same-device login UX by @ChadFarrow in #94
  • Disconnect Spark wallet on Nostr sign-out and npub switch by @ChadFarrow in #95
  • Clarify Primal uses Have URI, not Generate URI by @ChadFarrow in #96
  • Fix Primal NIP-46 generate flow: single relay + correct UI guidance by @ChadFarrow in #97
  • Fix NWC backup not auto-restoring on mobile (nostash/iOS) by @ChadFarrow in #98
  • Fix NWC restore not firing after sign-out + sign-in by @ChadFarrow in #99
  • Skip relay+NIP-44 on same-account sign-in via sessionStorage stash by @ChadFarrow in #100
  • feat: sort music album feeds by disc/track number instead of date by @ChadFarrow in #102
  • Auto-play next track on music feeds by @ChadFarrow in #103
  • fix: supply explicit preimage in NWC keysend for Zeus embedded node by @ChadFarrow in #104
  • fix: correct NWC error messages for Zeus embedded node limitation by @ChadFarrow in #105
  • feat: add Nostr live stream discovery (NIP-53 kind:30311) by @ChadFarrow in #106
  • Fix split rounding so small recipients aren't zeroed by @ChadFarrow in #107
  • Improve mobile layout of fullscreen live-stream player by @ChadFarrow in #108
  • Move play/pause onto the live-stream video as a tap overlay by @ChadFarrow in #109
  • Show only play/pause in the mini-bar for live streams by @ChadFarrow in #110
  • Optimize live loading: RSS fetch dedupe/cache, persistent + health-scored Nostr pool, feed racing by @ChadFarrow in #111
  • Add Picture-in-Picture for video streams + Media Session controls by @ChadFarrow in #112
  • Resume live HLS streams on foreground (iOS Safari background fix) by @ChadFarrow in #113
  • Add permanent /live/ share links for Nostr streams by @ChadFarrow in #114
  • Add podroll support (host-recommended shows) by @ChadFarrow in #115
  • docs: fix CLAUDE.md spots the podroll refactor made stale by @ChadFarrow in #116
  • Fix boost success sound not playing on mobile by @ChadFarrow in #117
  • Fix live share link and boost routing to point at the stream host, not the platform bot by @ChadFarrow in #121
  • Surface playback errors in the fullscreen player and stop truncating them by @ChadFarrow in #122
  • fix(boost): stop the Nostr share checkbox reading backwards by @ChadFarrow in #123
  • Let signed-in users pick who signs their boost note by @ChadFarrow in #124
  • Nostr boost-note destination picker + Spark restore fixes by @ChadFarrow in #125
  • Compact the Share-on-Nostr picker into a pill row by @ChadFarrow in #126
  • Stop the boost modal jittering when the share picker toggles by @ChadFarrow in #127
  • Skip search autofocus on touch devices so header home nav stays put by @ChadFarrow in #128
  • feat(pc2.0): synced transcripts + funding links, and episode-page tabs by @ChadFarrow in #130
  • Show active chapter's artwork as now-playing art by @ChadFarrow in #131
  • Add non-PI feed preview by pasting an RSS URL into search by @ChadFarrow in #135
  • Recognize podcastindex.org show URLs in search by @ChadFarrow in #136
  • Support podcast:alternateEnclosure video renditions by @ChadFarrow in #137
  • Detect HLS + untyped video alternate enclosures by @ChadFarrow in #138
  • Overlay the Audio/Video toggle on the show artwork by @ChadFarrow in #139
  • Move Audio/Video toggle under the art/video instead of overlaying it by @ChadFarrow in #140
  • Upgrade lnaddress boost legs to keysend when the address publishes one by @ChadFarrow in #143
  • Proxy the keysend well-known lookup — direct fetch is CORS-blocked by @ChadFarrow in #144
  • Privacy policy + homepage copy for Google OAuth verification by @ChadFarrow in #146
  • fix(boost): the tap-time sound unlock was claiming an audio session too by @ChadFarrow in #147
  • Add Google onboarding that generates a Nostr key for keyless users by @ChadFarrow in #141
  • Feature/generated profile by @ChadFarrow in #142
  • Clear the sender name on anonymous boosts, default it to "boostmebitch.com user" by @ChadFarrow in #149
  • Link episode boost notes to the episode, not the show by @ChadFarrow in #150
  • Show each split's lnaddress/keysend address in the boost modal by @ChadFarrow in #151
  • Serve .well-known/keysend and the bare-domain lightning address by @ChadFarrow in #153
  • Add streaming sats per minute by @ChadFarrow in #152
  • Stop a full or blocked localStorage from freezing settings controls by @ChadFarrow in #154
  • Tag streaming settlements as auto, not stream by @ChadFarrow in #156
  • Tag streaming settlements as auto, not stream by @ChadFarrow in #157
  • Reconnect a live stream on resume instead of replaying a dead buffer by @ChadFarrow in #158
  • Follow the artist during a live show by @ChadFarrow in #155
  • Tag the feed's declared npubs on boost notes by @ChadFarrow in #161
  • Fix the purpose spelling, and read <podcast:person npub> too by @ChadFarrow in #162
  • Share favorites across apps via one NIP-51 list by @ChadFarrow in #163
  • Revert the cross-app favorites merge (#163 was merged by accident) by @ChadFarrow in #164
  • Re-land cross-app favorites, gated by address so it's a no-op for everyone else by @ChadFarrow in #165
  • Fix/favorites data loss and read trust by @ChadFarrow in #169
  • Move favorites to kind:10333, where tag order carries the data by @ChadFarrow in #170
  • explicitFeeds is not in the hydrator, and two docs sent readers after it by @ChadFarrow in #171
  • Pay @fountain.fm recipients over LNURL so their metadata survives by @ChadFarrow in #172
  • Add a pull request template by @ChadFarrow in #173
  • An unanswered wallet is not a failed payment by @ChadFarrow in #174
  • Close every NWC client — a leaked socket stopped payments mid-session by @ChadFarrow in #175
  • Fix/nwc connection reuse by @ChadFarrow in #177
  • BoostBox is a per-leg route, so 30/min silently ate the tail of a boo… by @ChadFarrow in #178
  • Pin which NIP-47 failure may be retried, against the real SDK classes by @ChadFarrow in #179
  • Fix/zap boostbox descriptor by @ChadFarrow in #180
  • Republish a local signer's Spark backup when the relays have none by @ChadFarrow in #160
  • Put the Spark backup's zero-relay assert in the wrapper, and name the event we asked for by @ChadFarrow in #181
  • Show the song's art during a valueTimeSplit, not the show's by @ChadFarrow in #182
  • Refactor/dedupe and loading perf by @ChadFarrow in #184
  • fix(ui): name the merged contents tab for chapters, not one track by @ChadFarrow in #185
  • feat(notes): make bare URLs in show notes clickable by @ChadFarrow in #186
  • feat(nostr): look up any npub's boosts, sent and received by @ChadFarrow in #187
  • feat(search): name the person behind a pasted npub before you click by @ChadFarrow in #188
  • feat(favorites): give favorites their own page by @ChadFarrow in #189
  • docs: record the third half of the handoff rule and a touch-target floor by @ChadFarrow in #193
  • feat(live): favorite the songs a live show plays by @ChadFarrow in #191
  • feat(android): ship Boost Me Bitch on Zapstore as a Trusted Web Activity by @ChadFarrow in #190
  • ci(android): stop Bubblewrap's first-run prompt killing the build by @ChadFarrow in #194
  • fix(mutes): stop demanding an Amber prompt on every page load by @ChadFarrow in #195
  • fix(favorites): refuse to publish an empty list over a full one by @ChadFarrow in #196
  • fix(favorites): never believe a baseline the local cache cannot back by @ChadFarrow in #197
  • fix(meta): a 429 is not Podcast Index saying no by @ChadFarrow in #198
  • feat(nostr): show a wide BMB banner on every boost note by @ChadFarrow in #199
  • fix(nostr): the boost banner URL must be the production one, always by @ChadFarrow in #200
  • fix(meta): give a link-preview fetcher the OG tags in the head by @ChadFarrow in #201
  • Feat/amber callback return by @ChadFarrow in #202
  • fix(og): try every artwork candidate, not just the first by @ChadFarrow in #204
  • docs: htmlLimitedBots does not fix jumble, and no word list can by @ChadFarrow in #203
  • fix(amber): the callback lands in a different tab, so the record cannot be tab-scoped by @ChadFarrow in #206
  • fix(ui): the note card's show thumbnail goes through by @ChadFarrow in #205
  • feat(og): draw an animated cover's first frame instead of skipping it by @ChadFarrow in #207
  • docs: route the boost banner's files to their doc by @ChadFarrow in #208
  • fix(signer): never make Amber render a seed phrase nobody asked to see by @ChadFarrow in #209
  • docs(amber): re-measure the wire facts on 6.5.2, and write up the seed exposure by @ChadFarrow in #210
  • docs: correct the storage/nostr cycle rule, which this branch made wrong by @ChadFarrow in #211
  • docs: record the nsec leak and the five other npub-explorer review findings by @ChadFarrow in #212
  • docs: a symptom this repo will be blamed for, and should not be by @ChadFarrow in #213
  • fix(amber): a purpose belongs to the CALL, not to the function by @ChadFarrow in #214
  • docs(amber): the clipboard path works in the TWA — correct three claims that said otherwise by @ChadFarrow in #215
  • fix(streaming): settle on playback time, and round a track up to its artist by @ChadFarrow in #217
  • fix(keysend): remember a target that does not pay, and widen the refusal retry by @ChadFarrow in #218
  • fix(nwc): the NWC backup could never reach Amber — the connection string's own ? killed it by @ChadFarrow in #216
  • fix(nostr): read favorites and mutes from the relays we write them to by @ChadFarrow in #219
  • Pay the leg that found no route, and stop stripping its metadata by @ChadFarrow in #220
  • BoostBox's desc is correct — the duplication was ours by @ChadFarrow in #221
  • Start the Google consent popup from the click, not a mount effect by @ChadFarrow in #224
  • Never ask for the Google popup from behind a script fetch by @ChadFarrow in #225
  • Mutes: close two paths that silently lose a mute by @ChadFarrow in #226
  • feat(npub): read zap receipts again, in their own section by @ChadFarrow in #227
  • Add a Nostr read index so feeds and favorites load fast by @ChadFarrow in #228
  • fix(chapters): recover a chapters file a strict parse throws out by @ChadFarrow in #230
  • Resize podcast covers instead of shipping posters by @ChadFarrow in #231
  • Publish kind:3369 value playback receipts for streaming settles by @ChadFarrow in #229
  • Private favorites: carry content, and a public/private/off choice by @ChadFarrow in #222
  • Turn the private half on, now that every writer carries content by @ChadFarrow in #232
  • Fix the private-favorites review blockers that #222 merged without by @ChadFarrow in #233
  • CLAUDE.md: the rules #233 came out of, and two facts #232 made stale by @ChadFarrow in #234
  • Keep the read index alive, fill its bundle, and serve live streams from it by @ChadFarrow in #236
  • Stop one silent relay taxing every query on the homepage by @ChadFarrow in #235
  • Read the live-streams row from the index, and paint before resolving by @ChadFarrow in #237
  • CLAUDE.md: the two rules the read-index work cost, and the CDN trap under it by @ChadFarrow in #238
  • feat(feed): serve the whole feed, not the newest 50 by @ChadFarrow in #241
  • A show share and an episode share are different links, and different buttons by @ChadFarrow in #242
  • perf(nostr): resolve profiles beside the reply tree, and in one query by @ChadFarrow in #243
  • fix(wallet): show what an NWC connection may SPEND, not the node's balance by @ChadFarrow in #244
  • feat(feeds): open musicL playlists, a page of tracks at a time by @ChadFarrow in #246
  • Surface playlists PI ranked low, and repair the ones it holds blank by @ChadFarrow in #247
  • Stop claiming a playlist isn't in Podcast Index, and surface one this site didn't publish by @ChadFarrow in #248
  • fix(playlist): resolve a track's own value block, and never pay the curator's by @ChadFarrow in #249
  • Fix NIP-51 mute list cipher detection and support NIP-44 private halves by @ChadFarrow in #250
  • feat(search): a content-type selector that picks LANES, not a filter by @ChadFarrow in #251
  • Look an npub up under NPUB and nowhere else by @ChadFarrow in #252
  • An option to read a show oldest-first by @ChadFarrow in #253
  • fix(mobile): close the remaining iOS-PWA gaps by @ChadFarrow in #254
  • docs: cut CLAUDE.md in half by deleting what docs/ already said by @ChadFarrow in #256
  • feat(brand): one repo, two deploys — add the Boost Me Buddy brand by @ChadFarrow in #255
  • fix(favorites): render a list on a device that has never seen it by @ChadFarrow in #258
  • feat(streaming): send action 'stream' when a leg pays the show, not a… by @ChadFarrow in #259
  • fix(nostr): publish the site profile where profiles are actually read by @ChadFarrow in #260
  • chore: close reachable sharp CVEs, cap PI calls, honour reduced motion by @ChadFarrow in #261
  • docs: record how a squash merge disguises a merged branch by @ChadFarrow in #262
  • fix(player): make every ❚❚ control actually pause by @ChadFarrow in #263
  • fix(pi): a rate limit is not an outage by @ChadFarrow in #264
  • fix(ui): stop the favorite heart resizing and shoving its neighbours by @ChadFarrow in #266
  • feat(playlists): give the curated collection its own route by @ChadFarrow in #267
  • feat(playlists): resolve tracks from Postgres before Podcast Index by @ChadFarrow in #268
  • feat(playlists): add a Community collection, and fix ?publisher= restore by @ChadFarrow in #269
  • feat(nostr): unfurl the episode a note links into a playable card by @ChadFarrow in #265
  • fix(cache): bound the RSS caches by BYTES, not just by entry count by @ChadFarrow in #270
  • docs(claude): a miss is not an answer, but a HIT is by @ChadFarrow in #271
  • fix(ui): size the note card's FAVORITE chip to match its row by @ChadFarrow in #272
  • fix(feed): keep the metadata a superseded resolve pass already fetched by @ChadFarrow in #273
  • refactor(ui): make the note's episode card point, not play or pay by @ChadFarrow in #274
  • fix(nostr): unfurl a note's fountain link on the show, not on PI's item by @ChadFarrow in #276
  • refactor(ui): one control on the note's episode card by @ChadFarrow in #277
  • feat(nostr): render our own boost notes as the same card as everyone else's by @ChadFarrow in #278
  • perf(playlists): stop a blank PI record costing a deep link a whole round trip by @ChadFarrow in #279
  • fix(mutes): remember a private half we have already opened by @ChadFarrow in #280
  • fix(art): show the whole episode cover, never a square crop by @ChadFarrow in #281
  • feat(boosts): carry a reply address so Helipad can boost back by @ChadFarrow in #283
  • fix(boosts): make the reply address one a receiver can actually use by @ChadFarrow in #284
  • Say the Google option also gets you a Lightning wallet by @ChadFarrow in #285
  • Add a download control to the favorites library by @ChadFarrow in #286
  • fix(favorites): say how many exported favorites have no title yet by @ChadFarrow in #287
  • feat(favorites): back up the kind:10333 event, not a document about it by @ChadFarrow in #288
  • feat(favorites): see and repair the private half, back it up, and fix track resolution by @ChadFarrow in #289
  • Pin that the PI batch door stays bounded (check:fanout) by @ChadFarrow in #290
  • Share one moment of an episode from any contents row by @ChadFarrow in #293
  • Fold a duplicate feed group instead of dropping its items, and run the spec's vectors by @ChadFarrow in #294
  • docs(ops): the buddy Vercel project has its own env, and BoostBox 401s there by @ChadFarrow in #300
  • Google sign-in: stop reporting a refused origin as "cancelled" by @ChadFarrow in #282
  • docs(ops): the Boost Me rename is applied, and its re-review is live now by @ChadFarrow in #302
  • Bring the index's relay defaults back in line with the measurement by @ChadFarrow in #303
  • docs(ops): the BoostBox curl probe proves nothing, and looks like it proves something by @ChadFarrow in #305
  • Serve a profile as the bytes its signature covers by @ChadFarrow in #306
  • Add the leaf that decides which people a boost note may tag by @ChadFarrow in #292
  • Print the memory curve on the line that already prints every minute by @ChadFarrow in #307
  • Escape the ? in every payload handed to Amber, so a boost note signs by @ChadFarrow in #308
  • Stop rebuilding every tracked subscription once a minute by @ChadFarrow in #309
  • Report what the relay library holds open, beside what we hold by @ChadFarrow in #311
  • Stop leaking a MessagePort for every relay message the index receives by @ChadFarrow in #312
  • Make Amber sign-in work again on Android: intent: URL, home-screen callback, and Nostr Connect by @ChadFarrow in #310
  • Write down the two rules today produced, and account for the budget by @ChadFarrow in #314
  • Fix what the Pixel 6 found: the TWA dead-end, the "+" in Amber's name, and three smaller faults by @ChadFarrow in #315
  • Remember that the user opened their private lists, instead of asking every load by @ChadFarrow in #316
  • One playlist entry point per width; pin the favorites backup file; report which relays took the publish by @ChadFarrow in #317
  • Stop the played-so-far list painting a horizontal scrollbar by @ChadFarrow in #318
  • Name the artist on the live show's played-so-far list by @ChadFarrow in #319
  • Show the private-half tool only when there is a private half, and make it one control by @ChadFarrow in #320
  • Worktree audit pass by @ChadFarrow in #321
  • Audit pass: bound the fan-outs, close the transports, and stop rendering feed-chosen hrefs by @ChadFarrow in #322
  • Remove the "Saved to N of M relays" favorites notice by @ChadFarrow in #323
  • Show the Greatest Hits playlist's play counts on each track row by @ChadFarrow in #324
  • ci(android): make the first Zapstore publish able to succeed, prove it before a tag, and re-shoot the listing by @ChadFarrow in #325
  • feat(android): a Boost Me Buddy app for Zapstore, and the Bitch APK on GitHub by @ChadFarrow in #326

Full Changelog: https://github.com/ChadFarrow/boostmebitch/commits/v0.1.0