IndieSats
com.indiesats.app
Gunnar Stødle gusto@satpay.no Discover indie music, support artists with Lightning
No accounts. No fiat. No bullshit. Stream and support independent artists directly via Bitcoin Lightning. - Background audio playback - Zap artists instantly - Publish with your Nostr ID - Auto-generated RSS feeds - No tracking, no cookies Built for the freedom-loving music fan.
First release: Jul 9, 2026, 46 total releases.
Most recent release: Jul 26, 2026.
Appears in 1 app stack.
0 sats / 0 zaps received in the past year.
Sats Received
Underlying data available via MCP: app_zaps, app_releases.
Zap Count
Underlying data available via MCP: app_zaps, app_releases.
Releases
- Jul 26, 2026 1.1.9### Added - **Smart support link**: Footer "Help keep IndieSats online" link now opens Zap UI directly when a wallet (NWC or LNC) is connected. Falls back to `lightning:` link if no wallet. - **Zap Store description**: Added "Publish with your Nostr ID" and "Auto-generated RSS feeds" to app listing.
- Jul 26, 2026 1.1.8### Changed - **Relays**: Added `wss://purplepag.es` to all relay lists (profile, NIP-65, client discovery, server fallback). - **Relays**: Removed `wss://nostr.mom` — doesn't index `kind: 36787` or `#client: indiesats` tags, making it useless for music discovery.
- Jul 22, 2026 1.1.7### Fixed - **Zap modal**: Shows generic "Wallet connected" label regardless of wallet type (LNC or NWC). Previously showed "NWC connected" even when using LNC. - **RSS value blocks**: Artist lnaddress now comes first in item-level value recipients for better dumb-app compatibility. ### Changed - **Publish UI**: Clarified that 2% platform split is track-level (not channel-level) in publish-track and publish-album pages.
- Jul 21, 2026 1.1.6### Fixed - **Search**: Artist searches now correctly find all tracks. - **RSS feed**: Improved reliability when loading artist feeds.
- Jul 21, 2026 1.1.5### Changed - **Amethyst music feed support**: Tracks now publish in the format Amethyst and other Nostr music apps expect natively. - **Better relay handling**: Fixed duplicate relay listings in publish confirmation and ensured events always reach the IndieSats relay.
- Jul 21, 2026 1.1.4### Changed - **Share format**: Removed `&play=` param from share URLs — cleaner, no redundant scroll hint. - **Share format**: Removed `nostr:npub` line from artist-page track shares — consistent 3-line format everywhere (text + artist URL + MP3). Npub is already in the artist URL.
- Jul 21, 2026 1.1.3### Changed - **Kind 1 publish format**: Album and track announcements now use a single artist page link instead of `nostr:nevent1...` references. Social clients get a clean preview card instead of broken event references. No functional change — kind 1063 events remain canonical track metadata. - **Removed `i`/`k` tags from kind 1**: Podcast GUID tags now only live on kind 1063 events where they belong. - **Removed `e` tags from kind 1**: Track references are no longer needed; social clients display the artist page link.
- Jul 21, 2026 1.1.2### Fixed - **RSS feed**: Use `display_name` from Nostr profile for channel `<title>` instead of `name` (username). Podcast Index and music apps search by feed name, not track titles — `display_name` is the human-readable artist name. - **Artist page**: Display `display_name` first, fall back to `name`, then npub. Consistent with RSS feed identity. - **RSS feed**: Added `itunes:order` tag for proper album track display ordering in podcast apps. ### Changed - **Artist page**: Removed redundant zap button from album section header. Profile-level "Zap Artist" button and per-track quick zaps already cover all payment paths. Matches RSS-only artist layout (no album header zap). - **Artist page**: Simplified album modal to description only — no track list or play button. Tracks are already visible and playable on the artist page below. - **Relay**: Removed whitelist, open publishing to all.
- Jul 20, 2026 1.1.1### Fixed - **Copy**: Changed "streaming sats" to "sats" and "split" on publish-track and publish-album pages. "Streaming sats" incorrectly implied keysend streaming feature; IndieSats uses value recipient splits, not keysend streaming.
- Jul 20, 2026 1.1.0### Breaking Changes - **Anonymous Publishing Removed**: All anonymous publish infrastructure removed — `/api/publish-anon`, `/api/publish-album-anon`, `handleAnonymousPublish()`, `handleAnonymousAlbumPublish()`, anon toggle, anon stats. Anonymous publishing is no longer supported. Artists must use their own Nostr identity. ### Added - **Optional Platform Fee Split**: Added "Support IndieSats — X% of streaming sats" checkbox to publish-track and publish-album pages. Checked by default. Fee is configurable via admin panel (`/api/config` returns `{ platformFee: N }`). When checked, adds `['split', 'IndieSats', 'indiesats@satpay.no', '2', 'lnaddress']` to NIP-94 tags. Unchecking removes the split entirely — artist keeps 100%. - **Platform Fee Validation**: Split validation now accounts for platform fee: `userSplits + platformFee ≤ 100%`. Clear error message when exceeded. - **Dynamic Fee Display**: Publish pages fetch current fee from `/api/config` and update UI. If `platformFee = 0`, checkbox hides automatically. ### Changed - **Copy**: "0% fee" changed to "no mandatory fee" on publish-track, publish-album, and about pages for consistency.
More…
- **About Page**: Removed anonymous publishing option card. Updated artist section to mention optional platform support. - **Admin Panel**: Removed anonymous publishing toggle and stats. Admin now only manages platform fee. - Jul 19, 2026 1.0.34### Fixed - **RSS/Keysend**: Fixed keysend not appearing in RSS when both `lnaddress` and `keysend` payment tags exist (`.find()` returned first match only) - **RSS/Keysend**: Fixed `hasKeysend` check incorrectly depending on `paymentMethod === 'keysend'` when both tags exist - **RSS/Keysend**: Fixed `artistSplit > 0` guard blocking keysend output when auto-added self-split makes `artistSplit = 0` - **RSS/Keysend**: Added self-split detection — splits matching artist's own lud16 no longer reduce keysend split (keysend gets 100% when all splits are self-splits) - **Publish Track**: Unified track publish flow to auto-add artist split from lud16 when no splits provided (consistent with album and anonymous flows) ### Added - **Keysend Forwarder**: Added `routes.json` with 4 track GUIDs mapped to `jonathan@satpay.no` for keysend forwarding
- Jul 19, 2026 1.0.33### Fixed - **Artist page (RSS)**: Suppressed "Singles" section header for flat RSS feeds — "Singles" is a Nostr concept, RSS is just a track list - **Artist page (RSS)**: Fixed lud16 fallback when RSS item has `<podcast:value>` with only keysend recipients (no lnaddress) — was showing null instead of falling back to channel-level lud16 - **Artist page (RSS)**: Removed per-section zap buttons for RSS feeds — artist-level zap/boost lives in profile header, per-track zaps use player quick zap
- Jul 19, 2026 1.0.32### Fixed - **Server**: Republish endpoint now fails fast when no relays accept event (was silently losing events) - **Server**: Added missing `verifyEvent` import from nostr-tools (republish would crash) - **Server**: Removed dead duplicate `unwrapAudioUrl` helper ### Changed - **Server**: Extracted `checkAdminAuth`, `handleAdminRequest`, `handleRepublish`, `readJsonBody`, `sendError` helpers — deduplicated 33 error blocks + 6 body parsers - **Artist page**: Extracted `sortTracksByNumber` helper (shared between RSS and Nostr load paths) - **Search**: Parallelized RSS feed fetching — search now ~8s max instead of up to 80s
- Jul 19, 2026 1.0.31### Fixed - **Quick Zap**: Fixed toast not showing on home page (invisible toast from conflicting CSS) - **Player**: Added button press feedback (`active:scale-95`) to zap button on both pages - **UI**: Consolidated toast visibility handling between `ui.js` and `utils.js`
- Jul 19, 2026 1.0.30### Fixed - **Share URLs**: Strip `nostr:` prefix from npub in share URLs (was causing "Invalid npub" errors) - **Server OG**: Remove existing OG tags before injecting track-specific ones (fixes logo showing instead of cover art) - **Server**: Use `queryRelay()` instead of `nostr-tools Relay` class (relay API compatibility)
- Jul 19, 2026 1.0.29### Fixed - **Server**: Fixed nostr-tools relay API (`relay.query()` instead of `relay.get()`) - **Server**: Relay lookups now work correctly (no more "relay.get is not a function" errors)
- Jul 19, 2026 1.0.28### Fixed - **Homepage**: Track cards now show cover art instead of artist profile picture - **Artist page**: Share buttons now work in album/multi-album view (were dead) - **Server OG**: Nostr artist track shares now include cover art in preview - **Server OG**: Fallback track lookup by cover URL when clients strip query params
- Jul 18, 2026 1.0.27### Fixed - **Search**: Fixed search to match against `t` tags (genre, music, indiesats)
- Jul 18, 2026 1.0.26### Changed - **Artist page**: Removed redundant zap button from album modal (still available on album/singles headers)
- Jul 18, 2026 1.0.25### Added - **Artist page**: Zap buttons on album headers — "⚡ Zap [Artist]" with yellow lightning bolt - **Artist page**: Zap button on album modal header - **Artist page**: Singles section header with zap button for flat track lists - **Nostr**: imeta tags on kind 1 posts for rich inline previews (title, artist, cover art) ### Changed - **Artist page**: Consistent zap button styling across all sections
- Jul 17, 2026 1.0.24### Added - **Publish**: RSS feed URL now shown in anonymous publish success (Track & Album) ### Changed - **Publish**: Cleaner album header style (removed ◉ dot and → arrow) - **Publish**: Removed '🎵 Tracks' header from artist page - **Publish**: Updated Nostr profile help text — 'published to Nostr' is now primary - **Publish**: Consistent RSS feed messaging across all flows
- Jul 17, 2026 1.0.23### Added - **RSS feed**: Rich show notes with album descriptions, artist, and genre info - **RSS feed**: `itunes:season` and `itunes:episode` tags for AntennaPod album grouping - **Publish**: Album genre now stored on each track for self-contained metadata ### Changed - **RSS feed**: Owner name changed to "indiesats.com" (was "IndieSats") - **Artist page**: Removed Play button from album header (click first track to play) - **RSS feed**: Genre now read from track level only (simplified, no album fallback)
More…
### Fixed - **RSS feed**: Genre filter now skips "indiesats" and "music" tags - Jul 15, 2026 1.0.22# Changelog ## 1.0.19 (2026-07-14) ### Fixed - **Homepage**: Track cards now show artist name from track tag (e.g., "Spite Fug") instead of profile name ("IndieSats") ## 1.0.18 (2026-07-14) ### Fixed
More…
- **Artist page**: Track ordering now correct (1,2,3,4) for albums - **Artist page**: Shows track artist name (e.g., "Spite Fug") instead of profile name ("IndieSats") - **Artist page**: Clean track titles without "1." prefix - **RSS feed**: Sorts oldest-first so albums play in order - **RSS feed**: Track titles without album suffix (matches Wavlake style) - **RSS feed**: Removed `itunes:episode`/`itunes:season` tags (cleaner in Fountain/music apps) - **Publish form**: Removed redundant track number field (auto-assigns 1,2,3,4) ### Changed - RSS items now use only `podcast:episode`/`podcast:season` (PodcastIndex namespace) - Track artist name pulled from track's `artist` tag, not profile ## 1.0.17 Previous release - Jul 15, 2026 1.0.21# Changelog ## 1.0.19 (2026-07-14) ### Fixed - **Homepage**: Track cards now show artist name from track tag (e.g., "Spite Fug") instead of profile name ("IndieSats") ## 1.0.18 (2026-07-14) ### Fixed
More…
- **Artist page**: Track ordering now correct (1,2,3,4) for albums - **Artist page**: Shows track artist name (e.g., "Spite Fug") instead of profile name ("IndieSats") - **Artist page**: Clean track titles without "1." prefix - **RSS feed**: Sorts oldest-first so albums play in order - **RSS feed**: Track titles without album suffix (matches Wavlake style) - **RSS feed**: Removed `itunes:episode`/`itunes:season` tags (cleaner in Fountain/music apps) - **Publish form**: Removed redundant track number field (auto-assigns 1,2,3,4) ### Changed - RSS items now use only `podcast:episode`/`podcast:season` (PodcastIndex namespace) - Track artist name pulled from track's `artist` tag, not profile ## 1.0.17 Previous release - Jul 15, 2026 1.0.20# Changelog ## 1.0.19 (2026-07-14) ### Fixed - **Homepage**: Track cards now show artist name from track tag (e.g., "Spite Fug") instead of profile name ("IndieSats") ## 1.0.18 (2026-07-14) ### Fixed
More…
- **Artist page**: Track ordering now correct (1,2,3,4) for albums - **Artist page**: Shows track artist name (e.g., "Spite Fug") instead of profile name ("IndieSats") - **Artist page**: Clean track titles without "1." prefix - **RSS feed**: Sorts oldest-first so albums play in order - **RSS feed**: Track titles without album suffix (matches Wavlake style) - **RSS feed**: Removed `itunes:episode`/`itunes:season` tags (cleaner in Fountain/music apps) - **Publish form**: Removed redundant track number field (auto-assigns 1,2,3,4) ### Changed - RSS items now use only `podcast:episode`/`podcast:season` (PodcastIndex namespace) - Track artist name pulled from track's `artist` tag, not profile ## 1.0.17 Previous release - Jul 14, 2026 1.0.19### Fixed - **Homepage**: Track cards now show artist name from track tag (e.g., "Spite Fug") instead of profile name ("IndieSats")
- Jul 14, 2026 1.0.18### Fixed - **Artist page**: Track ordering now correct (1,2,3,4) for albums - **Artist page**: Shows track artist name (e.g., "Spite Fug") instead of profile name ("IndieSats") - **Artist page**: Clean track titles without "1." prefix - **RSS feed**: Sorts oldest-first so albums play in order - **RSS feed**: Track titles without album suffix (matches Wavlake style) - **RSS feed**: Removed `itunes:episode`/`itunes:season` tags (cleaner in Fountain/music apps) - **Publish form**: Removed redundant track number field (auto-assigns 1,2,3,4) ### Changed
More…
- RSS items now use only `podcast:episode`/`podcast:season` (PodcastIndex namespace) - Track artist name pulled from track's `artist` tag, not profile - Jul 13, 2026 1.0.17# Changelog All notable changes to this project will be documented in this file. ## [1.0.16] - 2026-07-13 ### Fixed - RSS feed Podcasting 2.0 spec compliance improvements - Added `xmlns:dc` Dublin Core namespace - Fixed `podcast:category` format (added `text=` attribute)
More…
- Added `podcast:txt` purpose=npub for cryptographic ownership proof - Added `dc:creator` for track artist attribution - Added `podcast:publisher` for IndieSats platform feeds - Added `itunes:season`/`itunes:episode` alongside podcast: versions - Added standard RSS `<category>Music</category>` - Fixed `podcast:image` src→href with alt attribute - Added `<author>` tag for better compatibility - Track share links now use raw track title without splitting - Simplified share text format: "Check out {title} on indiesats.com" ## [1.0.15] - Previous - Previous release - Jul 13, 2026 1.0.16### Fixed - RSS feed Podcasting 2.0 spec compliance improvements - Added `xmlns:dc` Dublin Core namespace - Fixed `podcast:category` format (added `text=` attribute) - Added `podcast:txt` purpose=npub for cryptographic ownership proof - Added `dc:creator` for track artist attribution - Added `podcast:publisher` for IndieSats platform feeds - Added `itunes:season`/`itunes:episode` alongside podcast: versions - Added standard RSS `<category>Music</category>` - Fixed `podcast:image` src→href with alt attribute
More…
- Added `<author>` tag for better compatibility - Track share links now use raw track title without splitting - Simplified share text format: "Check out {title} on indiesats.com" - Jul 12, 2026 1.0.15### Changed - Removed confusing helper text under Band Name field on publish pages
- Jul 12, 2026 1.0.14### Changed - Version bump to fix Zapstore release issue
- Jul 12, 2026 1.0.13### Changed - **Publish pages**: Changed "Artist Profile" to "Nostr Profile" - **Publish pages**: Changed "your artist profile" to "your profile" in RSS description
- Jul 12, 2026 1.0.12### Changed - **Artist page zap button labels**: Simplified from "⚡ Zap Artist" / "⚡ Boost Artist" to just "⚡ Zap" / "⚡ Boost" - Works better for publishers/platforms (like IndieSats itself) where "Artist" doesn't fit - Zap modal still shows full context (e.g., "ZAP IndieSats")
- Jul 12, 2026 1.0.11### Fixed - **LNC zap timeout**: Increased wait time from 5s to 15s for LNC connection before zapping - LNC WASM initialization can take 8-10 seconds - Prevents premature "boost failed" errors when zapping quickly after navigation
- Jul 12, 2026 1.0.10### Fixed - **LNC wallet disconnect**: Fixed critical bug where disconnect button didn't work on web or APK - Root cause: Typo in `disconnectLnc()` - `cachedPassword` should be `cachedNativePassword` - Added error handling with try/catch/finally in disconnect handler - Improved event delegation for more reliable click handling in Capacitor WebView
- Jul 12, 2026 1.0.9### Fixed - **Zapping for "Publish with IndieSats" tracks**: Zaps now correctly go to the track owner's lightning address (e.g., `gusto@satpay.no`) instead of always going to `indiesats@satpay.no` - Parser now extracts `lud16` from NIP-94 events - Home page now preserves track's `lud16` instead of overwriting with artist profile
- Jul 12, 2026 1.0.8⚡ Zapping Fixed in Android App - Fixed zapping for artists published via IndieSats option - LNURL lookups now use absolute URLs for Capacitor WebView compatibility - Feed URLs also use absolute URLs for copy/paste in APK - Better error handling when lightning address lookup fails
- Jul 12, 2026 1.0.7🎵 Publish with IndieSats - Fixed publishing via IndieSats option in Android app - Added explicit CORS handling for Capacitor WebView compatibility - Synced web assets properly (Capacitor sync)
- Jul 12, 2026 1.0.6🐛 APK Anonymous Publish Fix - Fixed anonymous publishing hang in Android APK - Added explicit `mode: 'cors'` and `credentials: 'omit'` for Capacitor WebView fetch - Enhanced console logging for debugging publish flow
- Jul 12, 2026 1.0.5⚡ Faster RSS & Better PodcastIndex Compliance - File sizes now fetched at publish time and cached in NIP-94 event tags - RSS feed generation is now instant (no HTTP HEAD requests during feed generation) - Proper enclosure lengths for PodcastIndex validation - 5s timeout on HEAD requests, graceful fallback to '0' if unavailable - Album publishing fetches all file sizes in parallel
- Jul 11, 2026 1.0.4🔄 Consistent Relay List Updated relay list across the app to use the same 5 relays everywhere: - relay.indiesats.com - relay.primal.net - purplerelay.com - nos.lol - nostr.mom
- Jul 11, 2026 1.0.3🔧 Bug Fixes - Fixed RSS feed XML escaping (`&` in URLs) — now passes PodcastIndex validation - Fixed publish forms crash when `getElementById` returns null (optional chaining) - Removed dead `anon-artist` reference from publish flows - Added `trackNumber` field support in NIP-94 events
- Jul 11, 2026 1.0.2🎵 Simplified Publishing Clearer distinction between your profile and track attribution when publishing.
- Jul 11, 2026 1.0.1🔐 Secure mobile key storage Wallet credentials (LNC & NWC) now stored in native secure storage: - Android: Keystore via EncryptedSharedPreferences - Protected from XSS and browser extension access - Survives app kills and device restarts Also: - Native pull-to-refresh on homepage - Next/skip button on lockscreen media controls
- Jul 10, 2026 1.0
- Jul 9, 2026 1.0.0