Repository navigation
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
descis 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
contentby @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