Giter Club home page Giter Club logo

podcrypt's Introduction

podcrypt's People

Contributors

lastmjs avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

bdemann

podcrypt's Issues

Idea for downloading audio without proxy and unifying formats

So, two big issues with downloads are the proxy that I have to maintain, the 404s that it causes sometimes, the lack of MSE support in all browsers, and the lack of mp4 segmented file support for MSE. Being able to download audio from an audio element could fix all of these.

Imagine, what if we could record audio from an audio element and save it to IndexedDB. I already know that the audio element supports streaming everything that I've thrown at it. I believe I can record audio from the audio element. If I were somehow able to greatly speed up the playback and record it, I could maybe mimic the speed of file downloads, and save a universal format to IndexedDB. This could be a potential solution. A problem I can see is the maximum playback rate. I believe it's 16x in Chrome and FireFox. This shouldn't be too bad, but is probably longer than it would take to just download the file. Also, browsers mute the audio element after going above a certain playback rate, I'm not sure if the muting would show up in the recording. Also, would the recording be sped up as well?

UI Revamp feedback

  • Positives
    • Pretty cool
    • I like it a lot
    • Very nice very clean and crisp
    • Actually pretty good
    • I'm impressed
  • Negatives
    • Needs more color
    • Too empty, what website am I even on?
    • Parts are clunky (on desktop)

Sprint 8

  • Backing up the state to a json file stopped partway for me...
  • Add currently playing title, and potentially other useful information to the top bar
  • Handle the quota exceeded error gracefully...tell the users what to do
    • navigator.storage.estimate().then((e) => console.log(e))
    • Find the best API for determining storage
    • Put something on the downloads page when there are no downloads
  • Make sure the marquee is working correctly on all screen sizes, I'm hoping the Chrome simulator thing was just wrong...make sure the text goes all the way out one side and all the way into the other
    • The scrolling disappearance and reappearance is not consistent across mobile and desktop
    • Do not freeze the main thread, the marquee lags
    • Only scroll if the text is too big
  • Homepage
    • Loading for each tab individually...try not to block if possible
    • Instead of saying no results tell the user to search for podcasts above, just like the my podcasts tab
    • Refactor pc-podcast-search-results completely...
    • Add the tabindex to the global state so that it is persisted on refreshes
    • It all seems to be working well, just make it smooth now
    • When you hit search, change the tab index
    • Consider dynamically adding the search results page...and consider not naming the tab search results, but naming it the search term (this can probably wait until 1.0 or 2.0)
    • The homepage loads like 20MB of stuff!
    • Add something to the top bar when an episode isn't playing
  • Downloading Wyre Talks episodes is broken. Only part of the episodes get downloaded, like 3 minutes worth
  • Backing up data download broke
    • Programmatic clicks seem to be blocked on mobile browsers
  • Make a donation wallet web component...I already have need of this in two different projects...perhaps split it up into multiple components
  • Look into Netlify's built-in proxying...we might be able to do that instead of running out own proxy

Sprint 6 - Jordan

  • Invalid date when creating a wallet for the first time?
  • Add cursor pointer everywhere needed on desktop
  • The playlist episode url thing broke
  • Add controls to playlist and podcast and episode overviews
    • We have to get the podcast and episode overviews to update only certain parts of the ui on every state change
  • Make everything perfectly pretty on mobile and desktop
  • Add a color scheme, look at maker and dharma and other cool defi interfaces for inspiration
  • Change the way we indicate if you've listened, like an email
  • Standardize font sizes and colors?
  • Fix the main podcast list...move podcast title to top, add description in faded text with ellipses
  • Update the ethers.js provider to the default one so that infura can be used as backup
  • Basic automated tests for payouts
  • Add payment pending notifications
  • Update podcast ethereum address and ens name correctly in the wallet and everywhere...make sure it stays up to date correctly...for example, in the wallet, the address to display is pulled from the statically saved podcast description
  • Fix nonces for payouts. Before this feature is officially supported, just implement it yourself: ethers-io/ethers.js#435 (comment)
  • Podcast downloads
  • fix podcrypt.eth resolver...the resolver contract address that I deployed is incorrect for some reason...I need to set it to the correct one (look at lastmjs.eth, that one was done correctly). After I setup the resolver, I can set the address for the resolver to resolve to
  • Fix podcrypt.eth resolver...it got messed up and set to 0x0x somehow...
  • Show the ENSName and the ethereumAddress to the user when the click on the verified button
  • A little UI bug : when I play an episode and select another , it stops the player but it does not play the other episode . The icon is "pause"
  • Fix the weird white screen thing
  • Fix the weird html index page that randomly comes up
  • Fix the logs, see if you can get the app to stop being laggy
  • Make the main menu scrollable, perhaps add icons to the menu items
  • Add basic favicon
  • We need to fix components so that they do not react to other components url changes...
  • Play all from podcast overview?
  • Add three dots control to podcast row...remove/delete podcast completely, add all episodes to playlist
  • Scroll to the top when switching certain views
  • Clicking on an episode preview is adding the episode to the playlist
  • Fill out the entire email for the verified stuff
  • Add verified status to the main list of podcasts, encourage people to reach out to unverified podcasts
  • Redo the following
    • Podcast overview
      • Episodes look bad on ipads and desktop
    • Episode overview
    • Podcast search results
    • Wallet
  • Create the podcast and episode components...they will be used in many places
  • Add copy link address options for podcasts and episodes
  • Add About button to the main page when the list of podcasts is empty. Make sure the about page is as simple and explanatory as possible
  • Into the Ether is broken...their contract is taking up too much gas...should we increase the gaslimit? I guess so...

Run market statistics

I want to see how big this market is potentially. Use subscription numbers, put in the ability to see how much money is possible to be flowing under various circumstances, various numbers of people how adopt, the percentage I take, their intervals and the amount they give. Get a rough liberal and conservative estimate for the market cap here.

Whitepaper

I think it would be useful to publish a "whitepaper" of sorts that clearly explains the vision of Podcrypt and the model that it exhorts.

  • Explain the concept of voluntary universal subscriptions, and why universal subscriptions are more scalable for end users than one-off subscriptions like Patreon provides
  • Explain the benefits of the following adjectives: automatic, fair, peer-to-peer
  • Explain why Podcrypt is a dapp (if that's even important), how it is completely open source (if it goes that way), and will not be beholden to closed gatekeepers like Apple (PWA that can be distributed on IPFS, Ethereum Swarm, or other distributed and decentralized file storage platforms)
  • Competitors
  • Long-term strategy (max out at 10,000 - 100,000 users), why it is worth it for me to build even if I don't become a millionaire, stubborn minority, get other podcast apps on board, Brave and BAT model, potential integration with BAT through the SDK in the future, experiment with general-purpose cryptocurrencies versus application-specific ones (Podcrypt essentially says you don't need app-specific tokens, will Brave and BAT say the opposite, and they're both projects tackling very similar problems)

Alpha

  • The player is now out of sync with the playlist pausing...
  • When getting to the end of the playlist, make sure the audio player says pause
  • Podcast started over when it was last in the list
  • Adding to the playlist has a bug where the order is messed up
  • Allow hitting pause and turning it to play, it happens
  • Look into preload on audio element, could help fix playlist issues
  • State changes on progress updates ruins performance while the podcast is playing
  • Refresh description and other fields every time RSS feed is loaded...podnews Ethereum address doesn't seem to be loading
  • Put some kind of notification saying that a payment is processing, before the transaction hashes are set
  • Make sure everything can only happen once...subscribe once to a podcast, add an episode to a playlist once, connect episodes and podcasts once, etc
  • Once we use real Ether, we really can't be wiping people's data...allow the Redux store to be updated without clearing the state...figure out migrations, restoring the private and public key, etc. Make sure the store data structure is relatively robust and future proof
  • I will only listen to podcasts through Podcrypt until the MVP is released
  • Streaming podcasts
  • Wallet
  • Manual podcast listening through RSS feed
  • Episode overviews
  • Basic playlist
  • Payout on set interval, the user cannot change it (1 month)
  • Payout amount can be changed, we'll need a reasonable minimum
  • Percentages to payout cannot be changed
  • Entities to receive payouts can be turned on or off before the interval is over
  • Cannot continue listening to podcasts if your wallet balance is less than your
    disbursement amount
  • Explain security
  • Wallet has necessary warnings and disclosures
  • Initial Alpha release
    • URLs need to work when the user goes there directly
    • URLs are extremely messed up
    • Forward and backward navigation needs to be fixed, the pushstate and popstate stuff is a bit messed up
    • Persist things
    • Podcasts
      • Search
      • View podcast overview and episode overviews
      • "Subscribe" by adding to the homescreen essentially
      • Add episodes to the playlist from search or from the homescreen
    • Playlist
    • Player
    • Wallet
  • Until is reinstantiating the custom element every time...that's not ideal, and perhaps I should bring it up with lit-html
  • Fix the unexpected close tag error, we have to get xml back from these rss feeds
  • First release
    • Add podcasts to homescreen
    • Nice enough looking playlist with basic functionality (I think the basic functionality is done)
    • Nice enough looking podcast search
    • Wallet
      • Create account
      • Warnings
      • Keep track of time listened per podcast
      • Basic payout functionality
    • Paging for all search results
    • Fix rss feeds that return html
  • I need to find a unique identifier for each podcast, there is no guid that I am seeing at the podcast level, combine title and pub date maybe
    • Actually...I think the feedUrl is best...unfortunately it will change if a podcast changes its feedurl, but I think that's prety expected. I don't see any other way
  • Allow deleting from playlist
  • Allow reordering the playlist
  • Switch everything to IndexedDB, allow downloading
  • The top bar needs to be a bar, fixed, no content in it except what should be in the top bar
  • When moving playlist items up or down, make sure to move the currently playing episode as well
  • Make Android media notifications look nice: https://developer.mozilla.org/en-US/docs/Web/API/Media_Session_API
  • Figure out why the Android media notification is disappearing after a few minutes it seems...actually, now that it's installed to the homescreen with an app manifest, I wonder if the notification will stay
  • podcasts route seems to break sometimes
  • Why won't the artwork work on the android media notifications?
  • Allow moving forward and backward in playlist from media notification
  • Look into webapk for android
  • Starts and stops need to be robust...what if you never have a stop event? Right now, if there are multiple starts, all previous starts are ignored...lame, potentially
    • Perhaps when making a start timestamp, if the previous timestamp is not undefined or stop, insert one a stop timestamp...then, the list can heal itself
  • Look into how we are doing all of the containers...it needs to be perfect on all screen sizes
  • Ubuntu font!!!
  • Make sure all font sizes are perfectly responsive
  • Fade ins, spinners, slide ins everywhere. Make everything buttery-smooth
  • Make sure scrolling is smooth, it seems to jank a bit and stop, then allow you to scroll more on some of the lists
  • The menu needs to always be extended to the bottom of the screen, we need to redo the whole container system I think
  • Add a service worker
  • Get the install to home screen prompt to show up
  • If you put a feed url straight into the podcast search bar, skip the iTunes search and just grab the podcast
  • Replace hamburger element with icon
  • Add three dots to playlist items
  • Search for podcasts page needs to look nice
  • Search results should be a separate component and a separate url
  • Allow a podcast or a podcast episode to be linked to directly by url
  • Add episode searching
  • Make a row item component potentially...there seem to be similarities between all of our row items, extreme similarities, css, html structure, etc
  • Standardize z-indeces
  • Use the new technique from the main menu for loading each element...individually, each element should take care of their own loading I am thinking
  • Get RSSParser to be a module that runs without build tools (except bare specifiers)
  • Get web3 to be a module that runs without build tools (except bare specifiers)
    • web3-providers has some node dependencies that need to be dealt with, http and https in particular
  • Find an ETH API that does not require attribution or have onerous terms
  • Public nodes: https://medium.com/linkpool/release-of-public-ethereum-rpcs-f5dd57455d2e
  • Study how MetaMask handles private keys...the web3 docs say to never store the private key unencrypted in localStorage, which I was essentially going to do...I think I need to, not sure...I believe MetaMask uses your password to decrypt the private key and put it into memory...that sounds annoying for the user...I don't think the security risk is that high, we'll see I suppose
  • Add tabs for podcast and episode search
  • Add tabs to wallet, one tab for wallet itself, one tab for current payout, probably a tab for past payouts
  • Add intelligent gas
  • Add podcrypt to list of podcasts for payouts
  • Allow moving percentages up and down...maybe just toggling on and off for now
  • Put gas price into total payout amount???
  • Get amounts to be exact, use rounding correctly, convert between usd and eth correctly
  • Generate attribution on deploy...figure that out
  • Make the urls for podcast overview simpler, just path with queryString feedUrl should be good, then other people can create those links very easily
  • Privacy
    • Potentially explain that Netlify records IP addresses...make sure we are GDPR compliant
    • Explain that the APIs we use may log IP addresses, list each API
    • apple is setting a BUNCH of cookies...disclose all cookies potentially?
  • Pass as many lighthouse checks as possible
  • Get service workers to actually work
  • Use a current version of web3.js, preferably as an es module. I raised an issue on the repo: web3/web3.js#2475
  • Figure out finally how to type actions correctly...we want to be able to pass in any action, but have its type inferred correctly from the if statements
  • Consider moving all side-effects up to the very edge of the components...each function should just return objects and functions to be executed by the top level...what do you think of that? Sounds like monads
  • Find out if the Infura APIs can be used commercially, if so switch to using the default provider in ethers
  • Add types for ethers.js, switch to ethers.js es module
  • Optimize all requests, especially podcast search, pulling ethereum address and email from the feed...we're pulling a ton of those feeds when we do a search
  • Be more intelligent with the service worker, perhaps hit the network first and then update the cache...just try to get rid of caching issues if possible...also learn everything about service workers, since you don't know anything really and it's making things difficult
  • If payouts are getting failures and retrying with expontential backoff, an
    -d the payout interval check kicks in, it will call payout again, and we will have two instances of the payout function going concurrently...that isn't ideal necessarily, but is it okay? We do want the interval check to kick in if the user refreshes the app, but because we persist the redux state, that means the payout will still be ongoing even when it actually isn't...consider this
  • Make payments robust
    • I got this error on an automatic payment, when paying out to two podcasts: replacement fee too low
    • If a network request fails, it should be tried again???
    • Figure out nonces for real, right now I'm just letting exponential backoff take care of the issue, which is messy but should be robust. Follow these issues:
    • ethers-io/ethers.js#346
    • ethers-io/ethers.js#451
  • We need to be able to refresh podcasts and episodes...the titles and descriptions might become stale, since we set them once when subscribed to or added to a playlist, and we do not ever update them
  • Reach out to Exponent, since I believe Podcrypt is tackling many of the challenges they discussed
  • If there might be issues with using the podcast images from iTunes (perhaps they are promotional materials as described the search api terms), we can always just grab the image from the feed, which should not have anything to do with the iTunes promotional materials if I am not mistaken
  • Allow copying public key https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
  • Scroll up when moving between routes...but then you might not be able to go back to the same position you were at...figure that out
  • Put a buy eth button and a send eth button directly into the wallet, do not get in the user's way
  • Make sure the new playlist url thing works perfectly
    • When switching between routes
    • When the playlist progresses while you are on a different routes
    • If you were at the playlist, then go somewhere else, and the playlist progresses, and then you go back, the playlist will reset to the url that you were at...we do not want that
  • Type the returned state variable in reducer if statements
  • Zero knowledge seemed to be updating everything at double...it had a stop as its first timestamp event, I wonder if that was the issue
  • Perhaps create a persisted log for all payout information. I can verify the log after having it run for a few days to ensure that everything is working as expected
  • Write the log to a page
  • What if we just created a search result with the one podcast if you put an rss feed in? Then we wouldn't have to do the crazy back button checking to hop over the search results page for rss results
  • Instruct the user to backup the mnemonic phrase in case anything goes wrong with their funds
  • You need to be able to restore from mnemonic phrase, add that as a button with buy eth and receive eth
  • Make sure gas calculations work correctly on the main network...in fact, hook up the main network gas calculation code that you want to use, just use it on the test network, get rid of the fixed gas price
  • Add podcrypt to data for each transaction so that you can track transactions
  • Document all of the APIs that we are using in the credits
  • If there are any issues with the payout for a podcast, we need to notify the user somehow. For each podcast, show indicators of success or failure, perhaps we need a whole page to show what's going on
  • Watch out for sharing param names from the router...every time a route changes, all components may update if the query variable names are the same
  • Initial design system is in place, everything looks good enough, looks like a nice native app, UX is good, doesn't have to be beautiful
  • Just use one type of list everywhere, make all lists look like the playlist, it's looking pretty nice
  • Confirmation for payout now
  • When creating the wallet, start loading when you click create...go to a screen where the user is compelled to write down or otherwise store their mnemonic phrase, explain the consequences of not storing it somewhere
  • Adding an episode to the playlist should not change the current episode
  • The percentages to pay out get reset every time a previous payment has been sent...so we need to hold onto those percentages until the payment is completely processed...the podcasts need to calculate their proportions based on total time from last global payout, not last podcast payout
  • We have to choose the current interval wisely for payouts, decide when to use the global last payout date and when to use the per podcast last payout date
  • Skipping from episode to episode in the playlist by hitting play on the next episode does not do timestamps correctly
  • Manual testing
  • Change the Podcrypt title
  • Change wallet warnings
  • Change all ropsten links to main network
  • Current episode guid not being set when adding a podcast to the playlist for the first time!!!
  • Write a blog post
  • Update telegram
  • Reach out to all people waiting for main network launch

Write new condensed email to podcast producers

I've got one podcast producer onboard who has already published his Ethereum address, with one close behind I'm hoping. I think it would be a good idea to write a new condensed email, combining a short but sufficient description of the idea with a call to action which includes putting their ethereum address in the description of their podcast. I have enough positive feedback from round 1 of validation that most podcast producers like the idea. I don't need explicit feedback any more, I just need them to either add their address or not. This is the sale to them, if they actually do it they have bought in.

Implement fiat onramp

To further expand the TAM to non-crypto enthusiasts, we need to provide a fiat onramp. The simplest way to do that is to layer on a fiat onramp on top of the DApp, so everything still happens through crypto under the hood and in the interface, but users can buy ETH or DAI with their credit or debit cards...something like this should work: https://limepay.io/

Sprint 3

  • Put Podcrypt into the list
  • Hook up get eth to redux updates so that it can get the Ethereum address immediately
  • Fix service workers, figure everything out
  • On next push make sure that podcrypt.app in your browser loads correctly, the service worker cache seems to be messing it up
  • Link directly to an episode: playlist/feedUrl and episodeGuid...keep the url up to date in sync with the playlist...on load, check if the podcast and the episode are in the store, add them if they aren't, if the guid is not in the playlist add it, set the index correctly, set the current episode
  • Create a better non verified page
  • Add back buttons
  • Get rid of hamburger component
  • Figure out back buttons and playlist
  • If the wallet is empty, if the amount is not set, or your balance is too low for your payout, put up some kind of indication to the user
  • Red indicator somewhere when balance is less than payout amount! Only if wallet is created though
  • Add at least basic loading screens everywhere
  • Try setting the nonce back to 0
  • Make payments robust
    • I got this error on an automatic payment, when paying out to two podcasts: replacement fee too low
    • If a network request fails, it should be tried again???
    • Figure out nonces for real, right now I'm just letting exponential backoff take care of the issue, which is messy but should be robust. Follow these issues:
    • ethers-io/ethers.js#346
    • ethers-io/ethers.js#451
  • Parse Ethereum address from description for real, verified versus unverified, allow user to contact podcast creators if there is no address
    • When there is a payout or the user clicks on the verified or unverified button, we should update the email address and ethereum address of the show...or maybe whenever a show that they are subscribed to, whenever they view the overview for that show, the info should be reset, because we are pulling the feed anyway. That's sounds good too.
    • We need to pull the address out of the description often...perhaps an update address button in the podcast list...also, every time you do a payout, go grab and set the address. So the address is set once when the podcast is created, after every manual or automated payout, and if the user clicks update address from the wallet ui
  • Deal with errors in transactions...also, on-demand query limit seemed to be reached pretty quickly
  • Test manual payouts thoroughly
  • Make sure transaction hashes are working correcly on payout links...make transfers of 0 do not go through...that would only charge gas
  • Send a payment if the current date is greater than or equal to the next payout date, not just equal to. If the user doesn't use their app on that day, then the payment will never go through
  • Use web3.js umd build, I think that will actually work for now...someone already opened an issue to work with the native node modules and es modules in the browser
  • Get playlist on Android to work always
    • It seems like on 4G, something happens when episodes get completed. Sometimes this error gets thrown, it might be correlated: Uncaught (in promise) DOMException
  • Refresh balance after payout
  • Rounding, usd, eth, make the payments exactly good and correct
  • Allow copying public key https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
  • Tell web3.js about the browser builds...there is no build that will just run in a browser anymore...also, the browser fields in all of the package.json's, why do they point to the umd build?
  • Add basic service worker, get webapk to work on Android
  • Manual payout is sending 0 ether when a16z had 50% of a 5 dollar payout
  • Do not allow itunes search for undefined term, when the app loads it should not start searching all of the sudden
  • Make sure caching and registering and unregistering service workers works properly
  • Switching between episodes on the playlist now has issues, probably because of the new setTimeout in the player
    • It looks like service workers cannot load anything not loaded over https
    • Upgrade if possible, but if not...see if service workers can only intercept https fetch requests
    • I've got http upgrading to https, but if the endpoint is not available over https, it will fail. In this case, notify the user
  • Create a notifications system
  • Playing and pausing from the media notification has intermittent issues. Try playing and pausing from playlist, audio player, and then media notification to test
  • The length of a podcast during an interval seems longer than it should be sometimes...investigate starts and stops for those podcasts, we're probably missing some. We need to robustly handle missed starts and stops
  • New audio controls
    • Get rid of weird positioning on the fixed audio element area
    • Figure out custom audio playback
  • When creating a wallet, it seemed that my current time for the podcast I was listening to was wiped or something
  • The audio is randomly getting reset (the current playback position for the current episode) somehow...not sure why
  • How I Built This keeps refreshing the currentTime and starting over somehow...when I just leave it paused for a few minutes on my phone, it will restart...same with when I do a refresh, it doesn't start from the correct time. I noticed a new ad loaded each time, I wonder if there is some header that instructs Chrome to restart the audio every time
    ...it doesn't seem to be happening on other podcasts
  • You can't seem to go directly to urls if you are a first time user with no state
    • Because the initial state is messing that up...we need to set the state immediately on load for the route, which I thought I was doing
  • Type everything, I think we're far enough along that we will go quicker with types
  • I think I was having weird service worker issues again...make sure that the service worker cache and the service worker itself can be updated easily, I believe unregistering the service worker in my Chrome Android browser resolved the issue I was having...network requests just weren't going through
  • Make wallet ui slightly better, boxes and big numbers
  • Redo urls for podcast overview...show verified versus unverified in the podcast overview, allow people to link directly to podcasts, put that into the unverified email template

Downloads with service worker and cache storage

Helpful: https://googlechrome.github.io/samples/service-worker/prefetch-video/
Helpful: https://stackoverflow.com/questions/37612177/cannot-play-cached-audio-from-service-worker

So, see if we can cache the urls dynamically for certain audio files, the ones that the user asks for.

Now remember, I ran into some interesting issues with the service worker and media requests, and I don't remember exactly why. I think it had something to do with range requests. I believe the above resource will help with that

Technologies we're waiting on

  • Pay for gas in DAI
  • Buy DAI or ETH directly in app with credit or debit card
    • Waiting for Wyre to expand debit card purchases to all US states and other countries
    • Waiting for Wyre to allow credit card purchases
  • Mobile Safari background processing (playlist progression while the screen is off)
  • Mobile Safari IndexedDB high storage limit (might be high already, unsure)
  • Mobile Safari persistent storage (we can't have the DB wiped)
  • Browser or phone wallets so that Podcrypt doesn't have to store the private key
  • Mobile Safari prompt to add to homescreen
  • Mobile Safari background-sync, which might allow a better solution to ensuring payment requests go through than our homegrown exponential retry solution
  • Media notifications on Chrome for Android should not disappear unless dismissed by the user
  • Media notification customization on Mobile Safari
  • ENS widely used, wallets, easy to work with, etc
  • Crypto wallets built into browsers, phones, etc...mostly, it would be good if the browser had a wallet built-in
  • Universal Login: https://universallogin.io/
  • Better metatransactions
    • EIP-2280
    • MCD built-in cheques
    • Universal Login

Saturday February 23, 2019

  • When moving playlist items up or down, make sure to move the currently playing episode as well
  • The top bar needs to be a bar, fixed, no content in it except what should be in the top bar
  • Make Android media notifications look nice: https://developer.mozilla.org/en-US/docs/Web/API/Media_Session_API
  • Make sure keeping track of time is robust
    • What if there are multiple starts or stops in a row? I think that's what was happening to me before, multiple stops
  • Keep current episode when removing from playlist
  • Fix route containers to be aware of the top bar
  • Switch everything to IndexedDB
  • Begin wallet, mock everything about Ethereum, get payments to work with abstractions...abstract everything about the underlying payments, because we'll be integrating potentially many different cryptocurrencies...think about if it's worth it to do this now

Issues outside of our direct control

These are issues that we cannot fix on our own (at least we think so). We'll have to reach out to others to get them fixed:

  • Pausing and then playing, not sure if on wifi but definitely on cellular data, is intermittently successful. It seems that the first time I hit pause, everything pauses fine. When I hit play after that, it waits a long time or never plays. If I hit play again, it plays a bit of audio and then pauses. If I keep hitting play and pause then eventually I can get it to play. Also, often if I open the screen it immediately plays, seems like some background priority issue
  • The media notification just disappears sometimes when paused. I want it to stay forever unless the user dismisses it
  • When an episode completed and moved to a new episode in the background on Android, the notification just disappeared and nothing happened. When I opened the app everything had occurred correctly, it would have worked had the OS not closed the notification and did whatever it did

Sprint 2

  • Menu should always take up full height
  • Search for podcasts page needs to look nice
  • Add episode searching
  • Podcasts page needs to look nice
  • Search results should be a separate component and a separate url
  • Clicking out of menu should do nothing
  • Basic wallet
    • Debounce the coin market cap api requests
    • Begin wallet, mock everything about Ethereum, get payments to work with abstractions...abstract everything about the underlying payments, because we'll be integrating potentially many different cryptocurrencies...think about if it's worth it to do this now
    • Allow user to enter dollar target
    • Pull up the corresponding amount of ETH
    • Allow user to enter interval length (1-30 days)
    • Put Podcrypt into the list
    • Make the list look nice
    • Allow user to send money to wallet, show public key and such
    • Put in precautions? This can probably wait until real money is being used
    • Get payouts to work on Ropsten
  • Some podcasts, like Into the Ether, are not loading on mobile. I haven't checked on desktop. Feed loading is probably throwing an error
  • Make the urls for podcast overview simpler, just path with queryString feedUrl should be good, then other people can create those links very easily
  • Get playlist on Android to work always
  • Allow copying public key https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
  • Add open source software list in main menu
  • Add privacy list in main menu
  • Licensing, comply perfectly with all terms
  • Tell web3.js about the browser builds...there is no build that will just run in a browser anymore...also, the browser fields in all of the package.json's, why do they point to the umd build?
  • Add help link
  • Only grab podcast stats from current time period

Create landing page to validate with consumers

I think this could be extremely effective. My Twitter consumer validation is going very well. The next step is to get actual potential users to do something, and to start gathering email addresses or creating a Telegram group or some other type of group to start creating a following and a community. I think I want to start infiltrating crypto communities and marketing this app as a new dapp to see who would be interested in using the dapp. I want to get somewhere between 100-1000 people to join the Telegram group or give me their email addresses before continuing on to the MVP or a Kickstarter. Perhaps this doesn't need to be a landing page, but could just be an article. The call to action could be the email address, Telegram group, or a Google Form survey, though I'm feeling more and more confident that I might not need a survey and I generally know what people will say. Hopefully more data will continue pouring in from my outreach

Total Addressable Market

The strategy that I think is reasonable to pursue is slowly increasing our total addressable market over time. For the current scope of Podcrypt, I believe the Total Addressable Market consists of all avid podcast listeners. If we were to saturate the market, these are the only people that would be possible to use our platform. But, we are far from appealing to these people. At launch, we'll be addressing a subset of avid podcast listeners, those which are crypto or blockchain enthusiasts. Even amongst them, we'll only be addressing Ethereum users. Even amongst them, we'll only be addressing early adopters who are willing to switch to a less-featured podcast player. I believe at the bottom, we have a very targeted customer segment, and that will be good to launch into. As the prototypes or MVPs progress towards the end product, we should be conscious of how to continue expanding into new areas of our TAM.

  • Avid podcast listeners
    • Crypto/blockchain enthusiasts
      • Ethereum enthusiasts
        • Early adopters
      • DAI enthusiasts
      • Bitcoin enthusiasts

Look into adding the /podcasts route back in

For some reason, only the /podcasts route is returning raw html rendered to the browser...the / route works fine. Since they are essentially equivalent, I'll just get rid of the /podcasts route for now, but we might want it back in the future.

Performance

We have a number of performance issues that are popping up.

  • As the store gets bigger, things get slower
    • This seems to mostly be because of calculating the podcast times on every state change...consider how we can avoid this, or make that calculation much quicker. BigNumber I believe is causing some of that, but probably also the number of timestamps that we have to go through...consider getting rid of the timestamps, because they cause the store to grow very large over time (one of the biggest factors probably), and they are probably one of the biggest factors in how long it takes to calculate total time...
  • Remember to create migrations for all of the names and types that have changed in the store...we also need to delete all of the old episode timestamps
  • Downloads are really messed up...seems to be the URL.createObjectuRL...can I just use normal datauris??? The files might be way too big, we'll have to see
  • Try setting the mime type of the blob when creating the object url for safarai
  • Chrome on Android keeps crashing after first load...it used to crash every time I loaded Podcrypt, I thought because the blob of the downloaded audio was loading multiple times. I just fixed the multiple load, and deleted the audio file I was working with, but Chrome keeps crashing...I need to look into it more. Either way, I believe I should open an issue for Chromium/Blink, because the entire browser should not be crashing in these instances in my opinion...it's like a total crash. I load it up, start moving things around, and crash. If I wait a few seconds, everything seems fine
  • Silk Road episode 1 will not download anymore, neither episode 2
    • It looks like their servers are returning a 403 on download now
  • Switching between downloaded episodes should be instant...right now there is a lag where you can still hear the other episode
    • This might be the cause of the crashes after createObjectURL...see if we can optimize this further, make sure the revocation and creation are happening correctly and that there is only one objectURL in existence at one time. Apparently there is a chrome:://object-urls thing that you can use to check usage
  • Switching between episodes should maintain the start position of the other episode...sometimes it seems that the start position of the previous episode gets used as the start position of the next episode
  • I believe I have figured out part of the crashing problem...I wasn't actually deleting downloaded episodes, because I was addressing the key names incorrectly in the download code...but, the app should not be crashing while loading the first blob. It seems that while the first blob is loading, if I interact with the app by scrolling or something, the entire browser crashes
  • When downloading, we should only store the result if we have a good status...403 or other such error types should display an error to the user
  • Open bugs on Chromium, large createobjeturl's should be handled gracefully, or at least errored out gracefully...
  • Allow simultaneous downloads of multiple files, we'll probably have to chunk everything up and use range requests...also, background sync might be necessary to make sure downloads will always continue and finish even if the user puts the app in the background...this should work great on Android, hopefully iOS will catch up
  • We need to store the mime type of audio files in IndexedDB because of iOS. When creating the blob, we need to add the correct mime type
  • Update the blob iOS bug I filed a few days ago, I found a true fix
  • Open or follow the bug for storing blobs in IndexedDB in Safari for iOS. If we can do this in the future, we might be able to get rid of the arraybuffer and separate mime type thing
  • blob URLS created from window.URL.createObjectURL do not seem to be getting cleaned up properly. Use this: chrome://blob-internals/ to inspect
  • Switching between downloaded episodes is very messed up, two main issues: 1. There is a lag between episodes...we might not be able to easily avoid the lag, but we should at least hear silence and not have the previous episode continue playing. 2. The progress of the previous episode is used as the current position of the episode being switched to
    • It might help to get the custom element creation function to be properly asynchronous

2.0

  • Integrate with https://universallogin.io
    • This could simplify a lot of the things we need to solve...private key recovery, metatransactions without having to run our own server, fiat onramps that include credit cards, logging into multiple devices, not requiring the user to backup their seed phrase...right now we are kind of implementing this all on our own, but Universal Login could really smooth it all out
  • Dynamic custom playlists
  • Get the android notification arrows to much the global player arrows
  • Dynamic dropdown search results
  • Create a TheGraph Subgraph for Podcrypt
  • Consider a streaming download instead of partial content...this could provide even more granular control of the download process...not sure it matters though
  • Consider queueing up episode download requests...I'm not sure how many concurrent downloads we can handle right now. We might need to queue up downloads so that the app intelligently controls those resources. Right now we download 5mb chunks at a time, I think we should be able to handle quite a few concurrent downloads like that, just not sure
  • Get very large downloaded episodes to work properly on iOS and Android
  • Perks for listeners (exclusive content, early releases, etc for those who donate)
  • Follow Android playlist in the background on cellular data issues:https://bugs.chromium.org/p/chromium/issues/detail?id=884517&can=2&start=0&num=100&q=Media%20notification&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&groupby=&sort=
  • Add tabs to wallet, one tab for wallet itself, one tab for current payout, probably a tab for past payouts
  • Add all episodes from a certain point
  • Allow podcast and episode embeds...either an iframe or a custom element
  • Perfect background playback on all platforms
  • Featured podcasts
  • Allow users to sell their data
  • Crowdfunding
  • Subscriptions that download episodes automatically and send push notifications (we must wait for periodic background sync, background cron jobs, and push notifications. We could get this to work now on Android but would need server-side code...we could send a push notification to the browser of each user periodically, and in that handler check all of the subscriptions and do the work)
  • Once we have periodic background sync or cron jobs, we should potentially get rid of the setIntervals and do our payment and balance and other periodic updates from these APIs

Bitcoin fees

Check estimates here: https://www.buybitcoinworldwide.com/fee-calculator/

We might be able to do this. By setting an expected inclusion number of 24-48 blocks (within about 8 hours), and batching all payouts in one transaction, we might be able to keep the Bitcoin fees to a few cents per entire payout. I'd bet that anything under $1 per entire payout would be acceptable to the user. We could start off with a sensible default, and then let the user change the settings as they please.

Setting up Dokku

  • Use the scripts from the dokku website
  • do stuff
  • use the letsencrypt plugin
  • I'm tired

/credits

This is so strange. Loading podcrypt.app/credits loads index.html as plain text. The same thing happens at javascriptpractice.com/credits...it doesn't happen in local development, I wonder if it is a Zwitterion thing or a Netlify thing. It's very strange, probably reach out to Netlify and see if they have any ideas

Beta

  • How do I know that I'm ready to release the beta? Consider this: Podcrypt should be relatively feature-complete for the MVP by the end of alpha. Beta should be improving the existing features, fixing bugs, adding tests, etc. In fact, I think that all of the automated test stuff that I mention here, along with improving code refactoring, css, etc should be pushed off into the beta. I need to get the features out there for alpha. I need to get to beta as fast as possible. Improving those features is what the alpha should be for. Do not do anything that is not necessary for the MVP during alpha. Lock down the feature-set, implement the features, then push out the beta.
  • The slider disappears at the right and starts a little too far past the left
  • Protect against bad mnemonic phrases, ask the user to confirm (I don't ask the user to confirm, but I do make sure the phrase is twelve words)
  • Playlist went to the loading page on Rob mcnealy show for some reason when it was having a hard time loading...fixing the router prop changes will probably help fix that
  • Create a TheGraph Subgraph for Podcrypt
  • Get on all of the DApp tracking websites
  • Finish completely refactoring the wallet and all of its components with the new design style and css
  • For background playlist progression, try playing multiple audio elements at once, each element except for the main one will play silence. The silence will be as long as all of the audio element sources before it. Then we can progress in the background, because we will always be playing and never stop
  • Follow Android playlist in the background on cellular data issues:https://bugs.chromium.org/p/chromium/issues/detail?id=884517&can=2&start=0&num=100&q=Media%20notification&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&groupby=&sort=
  • Podcast downloads
  • Subscribe to podcasts
  • Offline capabilities (service workers), install to homescreen, PWA features
  • Interval can be changed
  • Powerful podcast search
  • Percentages to pay out can be changed
  • Value per unit of time can be changed
  • Use web.dev as a resource to audit everything
  • Automated tests, mostly for the time tracking and payments
  • Entities to receive payouts can be turned on or off before the interval is over
  • Explain security
  • Relatively beautiful UI
  • Looks good on desktop
  • Starts and stops need to be robust...what if you never have a stop event? Right now, if there are multiple starts, all previous starts are ignored...lame, potentially
  • Perhaps when making a start timestamp, if the previous timestamp is not undefined or stop, insert one a stop timestamp...then, the list can heal itself
  • Make sure all font sizes are perfectly responsive
  • Make sure scrolling is smooth, it seems to jank a bit and stop, then allow you to scroll more on some of the lists
  • Make a row item component potentially...there seem to be similarities between all of our row items, extreme similarities, css, html structure, etc
  • Standardize z-indeces
  • Use the new technique from the main menu for loading each element...individually, each element should take care of their own loading I am thinking
  • Debit card purchases with Wyre
  • Get RSSParser to be a module that runs without build tools (except bare specifiers)
  • Study how MetaMask handles private keys...the web3 docs say to never store the private key unencrypted in localStorage, which I was essentially going to do...I think I need to, not sure...I believe MetaMask uses your password to decrypt the private key and put it into memory...that sounds annoying for the user...I don't think the security risk is that high, we'll see I suppose
  • Add tabs to wallet, one tab for wallet itself, one tab for current payout, probably a tab for past payouts
  • Allow moving percentages up and down...maybe just toggling on and off for now
  • Privacy
  • Potentially explain that Netlify records IP addresses...make sure we are GDPR compliant
  • Explain that the APIs we use may log IP addresses, list each API
    apple is setting a BUNCH of cookies...disclose all cookies potentially?
  • Pass as many lighthouse checks as possible
  • Figure out finally how to type actions correctly...we want to be able to pass in any action, but have its type inferred correctly from the if statements
  • Consider moving all side-effects up to the very edge of the components...each function should just return objects and functions to be executed by the top level...what do you think of that? Sounds like monads
  • Add minifying to Zwitterion
  • Find out if the Infura APIs can be used commercially, if so switch to using the default provider in ethers
  • Add types for ethers.js, switch to ethers.js es module
  • Optimize all requests, especially podcast search, pulling ethereum address and email from the feed...we're pulling a ton of those feeds when we do a search
  • Be more intelligent with the service worker, perhaps hit the network first and then update the cache...just try to get rid of caching issues if possible...also learn everything about service workers, since you don't know anything really and it's making things difficult
  • If payouts are getting failures and retrying with expontential backoff, an
    -d the payout interval check kicks in, it will call payout again, and we will have two instances of the payout function going concurrently...that isn't ideal necessarily, but is it okay? We do want the interval check to kick in if the user refreshes the app, but because we persist the redux state, that means the payout will still be ongoing even when it actually isn't...consider this
  • Figure out nonces for real, right now I'm just letting exponential backoff take care of the issue, which is messy but should be robust. Follow these issues:
  • ethers-io/ethers.js#346
  • ethers-io/ethers.js#451
  • Scroll up when moving between routes...but then you might not be able to go back to the same position you were at...figure that out
  • Allow copying public key https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
  • If there might be issues with using the podcast images from iTunes (perhaps they are promotional materials as described the search api terms), we can always just grab the image from the feed, which should not have anything to do with the iTunes promotional materials if I am not mistaken
  • We need to be able to refresh podcasts and episodes...the titles and descriptions might become stale, since we set them once when subscribed to or added to a playlist, and we do not ever update them
  • Ask lit-plugin to look at interpolation within css styles, it is causing errors but shouldn't
  • Some feeds do not have an image, but the itunes result does...deal with that
  • Setting properties from an async custom element creation function doesn't seem to work...at least the router doesn't seem to set them
  • Decide how to abstract...custom elements or functions, they both seem to have pros and cons
  • Get playlist on Android to work always
  • It seems like on 4G, something happens when episodes get completed. Sometimes this error gets thrown, it might be correlated: Uncaught (in promise) DOMException
  • Create a notifications system
  • Allow moving forward and backward in playlist from media notification
  • Why won't the artwork work on the android media notifications?
  • I kind of like my hamburger menu though, it has rounded edges
    • Get rid of hamburger component
  • Add back buttons (I might not need this because iOS PWAs will soon have back swipe gestures, and I believe mobile Safari already has back buttons built in)
  • Should I be using BigNumber for everything, all calculations? It would be nice to just not worry about all of the rounding errors and get exactly accurate results, but it would also be nice to not to have an unnecessary dependency
  • We need to use BigNumber for everything
  • Order the wallet items by payout amount or percentage
  • Separate the concerns of sending actions and doing the calculations...it would be nice to keep the store dispatches at the top level inside of components...then again, if I ever want to share that functionality, I'd want to abstract it away into a module, which I am already doing
  • The router should really have the container code, not the components themselves...they should be embeddable anywhere
  • test double audio element to get perfect Android background playlist progression
  • Clean up the html on the episode overviews
  • Allow playing episodes from the podcast or episode overviews
  • Ubuntu font!!!
  • Add three dots to playlist items
  • Replace hamburger element with icon
  • Standardize all css, get rid of all inline styles
  • Automated tests...we should get pretty close to formal verification
  • Make it look good on desktop
  • Unsubscribe from a podcast...remove it and all of its episodes and data...make sure to add a confirmation...perhaps look into that one confirmation web component, or just be simple and use the native confirmation dialog for now
  • Use a horizontal three dots...remove episode from playlist, get link to episode in playlist
  • A podcast time should never show 60 seconds, only 59 seconds...something off by 1 in the flooring modding and rounding probably
  • When should we update persisted podcast and episode information? The titles descriptions etc may become stale
    • Perhaps whenever a podcast overview is viewed, update the information that could have gone stale...the same with an episode
    • If you click subscribe, it should probably do it again as well and refresh the values
  • Add a notification system, after clicking subscribe or add to playlist, notify the user
  • Optimize feed loading...I load the feed every time from the podcast overview and episode overview so that they can be url addressable without any other information, but it makes things slow because of all of the network round trips. Perhaps figure out some kind of intelligent caching
  • Route with the same parameters as other routes will get triggered...right now the episode overview page is loading even on the playlist page
  • Get rid of the playlist-specific code in the router
  • Adding to the playlist has a bug where the order is messed up
  • Podcast started over when it was last in the list
  • Figure out a sane way to type actions
  • Make an even better logging system that logs everything from the beginning, and will allow users to send me the logs without compromising personal information to help solve issues
  • Zero knowledge seemed to be updating everything at double...it had a stop as its first timestamp event, I wonder if that was the issue
  • The log needs to be much more efficient, printing the state on each state change uses a LOT of text once you have a lot of info in there
  • After each payout condense the timestamps down into a duration
  • Allow the user to restore their wallet from mnemonic phrase...right now we instruct them to store it somewhere safe, but we do not allow them to restore their wallet with it
  • Add a little refresh button to the balance
  • Make sure we can rely on the ETH Gas Station API: https://github.com/ethgasstation/ethgasstation-backend/issues/5
  • Consider creating a TheGraph subgraph or whatever to search Podcrypt transactions, which will be marked by data that says "podcrypt.app"
  • If there are any issues with the payout for a podcast, we need to notify the user somehow. For each podcast, show indicators of success or failure, perhaps we need a whole page to show what's going on
  • Watch out for sharing param names from the router...every time a route changes, all components may update if the query variable names are the same
  • Make the menu scrollable, add icons to the menu items?
  • Box shadows on lists are not quite perfect, the left side is still there technically, and the bottom does not extend all the way to the right
  • Instead of depending on the currentRoute to do logic in each component (like only checking the ethereum account balance whenthe currentRoute is /wallet), set a visible or viewed or currentcomponent property from the router
  • Only have the loading thing do the transition when disappearing, not when appearing. It should appear immediately
  • Make sure the app is scaling well with many podcasts, episodes, and playlist items
    • We should be careful with calculations that run on any state change, like the wallet does...put in some basic change detection and we should be good
  • The seed phrase page should not say loading all the time...use asyncreplace instead of until, that might work
  • The player gets in the way of the ui when you click on the keyboard to enter interval and stuff...the player should either disappear or needs to be part of the OS's calculation for what is viewable
  • Because payouts take multiple minutes, it would be nice to show an indicator somewhere if a payout is ongoing, that's what we could use the payout ongoing state property for
  • Wouldn't it potentially be better to always load player playing based off of whether or not any episodes are playing? Then we do not have to have weird checks for each type of action
  • Search results should be addressable, right now if you refresh on the search results page it just displays index.html
  • ENS addresses, seems like podcast owners do not like putting the full Ethereum address into their descriptions
  • Do not pay out to Podcrypt multiple times...just once per interval, no matter how many times payout now has been clicked, I think I got more payments from myself than I should have
  • Fix podcrypt.eth resolver...it got messed up and set to 0x0x somehow...
  • Make it work completely offline
  • Fix nonces for payouts. Before this feature is officially supported, just implement it yourself: https://github.com/ethers-io/ethers.js/issues/435#issuecomment-467284296
  • Split up the reducer into multiple reducers
  • Add podcast image to notification
  • Make the notification thing better looking
  • Toasts when important things happen
  • Figure out a better way to include the ubuntu font, comply with the terms of the license, and attribute with our automatic attribution tool
  • How I Built this does not load, something seems wrong with passing the feedurl to the proxy, it has a query string in it
  • All of the lists should be abstracted into one component if possible
  • Get the desktop app to look good
  • We need to fix components so that they do not react to other components url changes...I've already done this for the playlist component
  • What to do if transactions fail? Into the Ether failed...I think the gas for their contract is too high...who's problem should that be? I want to pay as little gas as possible, it will be difficult if people have contract addresses that require more gas
  • Scroll to the top when switching certain views
  • Z-indexing on the new lists is off, at least for the podcast list
  • Make the menu hit box bigger
  • Consider keeping the search results input with the search results
  • Improve payout tests...add tests for transaction amounts and balances before and after
  • Do not allow the user to scroll the loading screen
  • Follow this bug, make sure we don't have easy crashes with downloaded episodes on Chrome for Android: https://bugs.chromium.org/p/chromium/issues/detail?id=967551&q=&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified
  • Add duration information on podcast episodes...show the total duration, and how much the user has listened to
  • Do not put the warnings up on the wallet immediately...if they want to receive eth in any way, that's where we should put the warnings...create the seed wallet and private key and seed phrase automatically for them, then show it to them there
  • Only allow certain podcast and episode dropdown options if they make sense...for example, if you have not subscribed to a podcast, do not show the option of deleting the podcast
  • Make sure to be using dompurify correctly: https://github.com/cure53/DOMPurify/issues/344
  • Add currently playing title, and potentially other useful information to the top bar
  • Redo migrations...they are a mess. We need to have types for every single transition, so 32->33 needs its own types...I think that will solve most of the issues
  • One of my manual payouts seemed to pay one of the podcasts way too much...not sure why, but into the Ether got a $9 payout, when Podcrypt get $1, another podcast got $5, and another $.06...it was way too much
  • Look into the Google Doc that Podnews shared with you, make sure your episode descriptions are very nice
  • Consider rethinking the podcasts search page thing...put the search bar directly in the center of the page, just like the Google homepage. When the user clicks enter, slide the search bar up and show the results right there
  • Create a button widget for podcasts to embed a "Play on Podcrypt" thing. Look at examples of other buttons that do this. Provide this from within Podcrypt
  • Rearrange icons on rows, make the 3 dots menu huge and on the left
  • Downloading, playing, and adding to playlist should probably all be present...make the ... menu bigger
  • fix podcrypt.eth resolver...the resolver contract address that I deployed is incorrect for some reason...I need to set it to the correct one (look at lastmjs.eth, that one was done correctly). After I setup the resolver, I can set the address for the resolver to resolve to
  • Show the ENSName and the ethereumAddress to the user when the click on the verified button
  • Add About button to the main page when the list of podcasts is empty. Make sure the about page is as simple and explanatory as possible
  • Add podcasts to the main page, redo the search results, combine it into one page...shomehow
  • Create notification system
  • Create modal system, get rid of all alerts and confirms and selects
  • disable touch events on the main loading screen
  • Should all rows be the same size?
  • Way too many NaNs on the wallet
  • iOS backtracking before 0 the time gets all messed up
  • The progress event off of the audio element seems to be really slowing down scrolling on iOS
  • The search bar is not centered on iOS
  • The number inputs on iOS do not expand much, the width is too small. For example, 1000 shows as 10
  • Generate the wallet immediately. In the about page, give podcast owners their Ethereum address to put into their description...perfect easy onboarding. We will then have to explain how to cash out through Coinbase or somewhere else. Maybe Wyre will have some kind of easy cash out solution eventually. Or hopefully Stripe or Fidelity or PayPal will just add Ethereum somehow
  • Backing up the state to a json file stopped partway for me...
  • Make sure the confirmation prompt still shows up on iOS devices

Chromium and WebKit issues to follow

To get the absolute best experience possible on Android and iOS devices, we'll need some browser features fixed by the Chromium and WebKit teams. Here are some of those issues:

Sprint 9

  • Test blobs in the store again...it might have been a private browsing issue...
  • If blobs still can't be used by iOS, then only store arraybuffers for iOS...it seems to be slowing down the load on Android a lot
  • Test downloads at the Apple Store and then remove the experimental thing
  • Create a notifications system
  • Create a modal system
  • Replace episode select system with modal system
  • Downloads on iOS
    • Something has gone terribly wrong with the state of the current episode
    • Progressing playlist does not work even in the foreground
    • You have to toggle the play/pause button 2-3 times before an episode will play
    • Make sure the entire playlist works well on iOS, downloaded or not. Seems some of these issues aren't unique to downloaded episodes
    • Apparently blobs can't be saved in indexeddb in ios 12.4 anymore...consider switching to arraybuffers again
  • Wyre Widget
  • Wallet should be created immediately, warnings when you try to receive funds
    • Working on a scrollable modal for lots of content
    • Block all of the important buttons
    • We should really refactor the entire wallet and make it much more like the Sustainus wallet
    • Generate the wallet immediately. In the about page, give podcast owners their Ethereum address to put into their description...perfect easy onboarding. We will then have to explain how to cash out through Coinbase or somewhere else. Maybe Wyre will have some kind of easy cash out solution eventually. Or hopefully Stripe or Fidelity or PayPal will just add Ethereum somehow
  • Revamp the homepage...display podcasts, add about link, stuff like that...make it fuller many people have complained about this
    • Add About button to the main page when the list of podcasts is empty. Make sure the about page is as simple and explanatory as possible
    • Combine the search results page with the homepage
    • Consider keeping the search results input with the search results
    • Consider rethinking the podcasts search page thing...put the search bar directly in the center of the page, just like the Google homepage. When the user clicks enter, slide the search bar up and show the results right there
    • The homepage now loads like 20MB of data, we really need to fix that
  • Play and pause and seek listeners for the iOS/iPadOS lock screen player
  • Refactor payments...we CANNOT HAVE DOUBLE PAYMENTS
    • Refactor the entire wallet, use what you built and learned from Sustainus
    • Get rid of functional-element
    • See if you can refactor to the way Sustainus is doing things
    • Use an ephemeral state to stop payouts from occurying when they are already occuring
  • iOS issues
    • Way too many NaNs on the wallet
    • iOS backtracking before 0 the time gets all messed up
    • The number inputs on iOS do not expand much, the width is too small. For example, 1000 shows as 10
  • Extensive manual testing of the wallet and payouts
  • Redo the warnings for beta
  • Change all alpha wording to beta wording
  • Change receive ETH to popup, make it easy to copy the address
  • Figure out why payments to Keyword: Crypto aren't working
  • Copying to clipboard doesn't work on iOS
  • Write blog post
    • Convert blog posts
  • Block embargoed countries
  • Only search when the user clicks on a tab explicitly...that should just get rid of a lot of issues, and we should be able to show more results
  • On the search results tab, point them to the search bar above, use the same wording as the main podcasts tab
  • Update the about section, make it simpler, put in hyperlinks to specific areas in the app
  • Get the playlist to have the loaded thing
  • Figure out how to get the scroll position of the element to persist using the lit-html cache directive: lit/lit#1022
    • If they don't have a good solution, consider storing the scroll position in the component state or in Redux somehow
  • We need the loading screen when switching between routes

Potential solution for blob crashes and issues

So, there are a few issues with blob storage right now...sometimes when downloading a file, the file itself seems to be too large to be saved. Also, some large files that are successfully saved cause Chrome on Android to crash when being turned into a Blob URL. Also, loading these files seems to take a while sometimes when setting the source for the first time...a possible solution to all of these issues is to chunk up the audio files. So, when downloading a file, we could chunk it up into 10mb pieces or something, and save them. When loading them to create an objecturl, we could load just one chunk at a time. We'll have to mess with the audio lengths because the audio element won't be able to help us as much, but hopefully it will be doable. We'll see what the Chrome engineers say here: https://bugs.chromium.org/p/chromium/issues/detail?id=967551#c25

I'm just afraid they won't be able to offer much help, but we'll see.

Android and iOS potential issues

  • Android
    • Sometimes the media notification disappears when you are actively using other apps. When the screen is off and the notification was already there, it seems to stay
  • iOS
    • What is the storage limit on IndexedDB? This will affect the ability to download episodes
    • Is the storage in IndexedDB persistent? Is it going to be susceptible to wiping at any time? Very important, especially for private key storage
    • Can I customize the media player notification?
    • Can I move from song to song in the playlist while the app is in the background (screen is off)?
    • Issues we will run into on iOS: https://medium.com/prototyped/what-we-learned-about-pwas-and-audio-playback-10a01c6aecbd

Setting up an EC2 instance

  • Create the instance, choose the latest version of Ubuntu
  • Download the pem file to a secure place
  • Change the permissions on the file
    • chmod 600 my-private-key.pem
  • Add http and https access to the inbound security rules, ports 443 and 80
  • ssh into the instance
    • ssh -i my-private-key.pem ubuntu@my-ip-address
  • Update the latest Ubuntu package updates
    • sudo apt-get update
  • Install the latest Ubuntu package updates
    • sudo apt-get upgrade
  • Install the latest Ubuntu OS updates
    • sudo apt-get dist-upgrade
  • Cleanup
    • sudo apt-get autoremove
    • sudo apt-get autoclean
  • Reboot
    • sudo reboot
  • Remove SSH access from inbound security rules

Sprint 4

  • payment pending indicators on each podcast
  • Add episode searching
    • Add tabs for podcast and episode search
    • Add intelligent gas
  • If the wallet is empty, if the amount is not set, or your balance is too low for your payout, put up some kind of indication to the user
  • Red indicator somewhere when balance is less than payout amount! Only if wallet is created though
  • Change get eth buttons to buy eth and receive eth
  • Figure out why images look weird in the wallet
  • Episode overviews
    • Play from episode overview
  • Image in episode overview
  • Image in podcast overview
  • All WEI values should be stored using toFixed(0) to round
  • Use big numbers everywhere
  • test double audio element to get perfect Android background playlist progression
  • On 3/11/19 a payout was sent, but the next payout date globally was set for the same day
  • 3 choices for proxy, raw first with no proxy, then two proxies
  • Look into BigNumber, use numbers properly, follow up on ethers.js issues about this
  • Make sure the payout target can have decimals
  • Add at least basic loading screens everywhere
  • Manual podcast listening through RSS feed...just go straight to the podcast overview if the search term is a url
  • Ubuntu font!!!
  • Fade ins, spinners, slide ins everywhere. Make everything buttery-smooth
  • The menu needs to always be extended to the bottom of the screen, we need to redo the whole container system I think
  • Dates and milliseconds and seconds and days can use normal numbers, we are always adding with whole number in milliseconds so we should be good. For any currency values use bignumbers...
  • Add three dots to playlist items
  • Make sure navigation works perfectly for rss feeds directly in search results
  • Replace hamburger element with icon
  • If you put a feed url straight into the podcast search bar, skip the iTunes search and just grab the podcast
  • Playlist progression is really messed up
  • Moving forward to the playlist is also messed up, popstate listens to forward and backward navigation
  • Make sure navigation works perfectly in the playlist
    • Going back when the playlist has progressed does not do what is desired...ignore all of the changes to the url if going back from the playlist
  • Create an error log that is persisted
    • Perhaps create a persisted log for all payout information. I can verify the log after having it run for a few days to ensure that everything is working as expected
  • Pulling the feed for every search result is really taxing on the proxy servers. Potential solutions:
    • Run my own proxy server
    • Pull the image from iTunes, not every feed has an image
    • Page itunes results
    • Do not pull the feed for search results, do not show verified/unverified status in search results
  • Make sure to update the podcasts list every time the payout amount changes
  • Add podcast title to playlist items
  • When an episode completes, make sure there is a start timestamp for the next episode
    • Time does not seem to be being kept while during progression of the playlist
    • Time is being kept at double speed or something, if I play for 1 or 2 seconds it jumps like 5 or 6 seconds

Summer Sprint - Donald

Sprint 7

  • Downloading, playing, and adding to playlist should probably all be present...make the ... menu bigger
  • Make sure that the episode options work everywhere, sometimes when adding an episode not enough information is passed and everything gets messed up
  • Add the notification buttons back, so pausing and stuff works again
  • Use estimateGas to estimate gas for the transaction...test it on the intotheether address. Since it is a contract, it is requiring more than the 21000 gas required for simple funds transfers
  • The player needs to be redesigned again...it needs to be crisp and perfect. Switching between episodes is still not perfect...consider incorporating everything into Redux...there are so many asynchronous processes going on that it's hard to coordinate everything
  • Joe Rogan Experience #1309 throws a null error when downloading
  • Sometimes when ending an episode, the episode starts over and is not marked as listened for some reasons (this happens relatively often, still happening)
  • Add the ability to mark an episode not listened to
  • Downloading Hardcore History episodes is failing with a null error on Android and iOS...it seems to fetch the file just fine, but the IndexedDB storage fails
  • Watch this bug to see if we can salvage the audio element for playing downloaded files on iOS: https://bugs.webkit.org/show_bug.cgi?id=198015
  • Consider switching to the web audio API...it seems we will have even more flexibility if we need it down the road, and we might as we start adding advanced features later on. First determine if we can play audio from a blob using the web audio API. Then, make sure that we can still have the native media notifications on iOS and Android. If all goes well, consider making a custom element for this functionality...consider making it amazing and open sourcing it stand-alone
  • Study the web audio API deeply...I believe it may provide solutions to downloading and playing audio on iOS, and perhaps will help with some of the media notification issues on Chrome
  • URL.revokeObjectURL() to garbage collect object urls...it makes sense why the app was crashing so much when switching between downloaded episodes
  • Remove the set payout in progress action dispatch in the pc-wallet constructing thing
  • Podcast downloads
    • The download ui does not work for some episode rows
    • If you download an episode and immediately try to play it, it will break. I believe it still tries to use the episode.src directly because it has already been set
    • Make sure downloadState is set correctly everywhere, especially when adding an episode to the playlist, right now it will be overriden
    • Add the download option to all episode rows
    • Show download indicator showing download progress
    • Have an indicator if an episode is downloaded or not
    • Allow the user to delete an episode
  • Add cursor pointer everywhere needed on desktop
  • The playlist episode url thing broke (I think I'm going to just get rid of that feature. Perhaps I can add it again in the future. A link to the episode description should be sufficient)
  • Update podcast ethereum address and ens name correctly in the wallet and everywhere...make sure it stays up to date correctly...for example, in the wallet, the address to display is pulled from the statically saved podcast description
  • fix podcrypt.eth resolver...the resolver contract address that I deployed is incorrect for some reason...I need to set it to the correct one (look at lastmjs.eth, that one was done correctly). After I setup the resolver, I can set the address for the resolver to resolve to
  • Fix podcrypt.eth resolver...it got messed up and set to 0x0x somehow...
  • Show the ENSName and the ethereumAddress to the user when the click on the verified button
  • Add copy link address options for podcasts and episodes
  • How I built this is broken
  • What bitcoin did is broken
  • Into the Ether is broken...their contract is taking up too much gas...should we increase the gaslimit? I guess so...
  • Add About button to the main page when the list of podcasts is empty. Make sure the about page is as simple and explanatory as possible
  • Open a bunch of bugs with Chromium for the notifications and potentially for CORS issues with mp3 files...why is cors enabled for mobile but not for desktop?
  • The z-indeces for the episode rows in the playlist and the player are off, the episode row is above the player in the playlist
  • Should all rows be the same size?
  • Loading the entire blob to play is causing memory issues, the Brave tab kept crashing when I was switching between episodes
  • When switching between episodes that had been downloaded, the time seemed to stay at what the previous episode was at...I'm pretty sure this was because of the enormous amount of memory the blob was taking up...so, we should load only parts of the arraybuffer that has been stored in the db...but, then we'll have to in-the-background switch out the source. iOS will most likely give us issues with this
  • Clean up numbers and strings, get rid of bignumber in as many places as possible, only use it for eth calculations
  • Type all actions
  • Time tracking is good but not perfect. When switching between episodes, the times start to get off by a bit
  • Switch to storing blobs for iOS if this bug pans out: https://bugs.webkit.org/show_bug.cgi?id=198278
    • It looks like the issue has been resolved in at earliest iOS 12.2...decide if it's worth breaking all previous versions of iOS. I think it might be, since this app is being developed using the latest and greatest. By 1.0 hopefully most people will have a compatible device. Not sure though
    • If we don't decide to switch to blobs, then we need to deal with the mimetype when creating the blob manually: We need to store the mime type of audio files in IndexedDB because of iOS. When creating the blob, we need to add the correct mime type. I am hard-coding the mime type to audio/mpeg when creating blobs right now, which should work for mp3 files but perhaps not for ogg or other audio formats.
  • Make sure the +10 -10 buttons are working, it seemed to perhaps not be...I skipped forward and thought I heard the same thing
  • Fix the slider being too far to the right
  • I get 404s for some episodes when trying to download
  • Make transition between downloaded episodes smooth...the loadeddata play seems to perhaps be messing with things when switching between downloaded episodes
  • Payments to Podcrypt duplicate many times over
  • When processing payments, what happens if an episode's rss feed can never be retrieved? I think then that the payment will fail over and over again
  • The downloading loading ui stopped working, probably because of the loading code I disabled
  • Times for episodes that don't have payouts during an interval do not get reset at the end of the interval I believe
  • Figure out chunking episodes...I believe that is the way to do it. This will get around a few issues that we've been having...chunk downloads, chunk storage, chunk playing. This should allow us to have many simultaneous downloads with files of any size (as long as total storage does not exceed the domain limit), and we should be able to load and play any file of any size that was stored.
  • Make sure that the app remembers the last route every single time it loads...sometimes it will reset you to the homepage after a restart, perhaps every time actually
  • Seeking forward and backward does not work when the player is paused...it does work, but the time does not update immediately
  • Make sure that the transition from streaming to downloading is smooth and works...if you are streaming an episode and then click download, it should transition perfectly
  • Render the episode overviews as html
  • Add a backup of all podcasts data...I'm getting nervous
  • Allow disabling podcasts...Think of the best way to do it, I want to still show the user if possible how much money the podcast is missing out on...not sure how to do that
  • Help out Speaking of Crypto, I think the feed is slightly messed up
  • Fix episode overviews, set the episode description from the content...
  • Figure out why episodes stored in the state have an undefined description
  • Make Podcrypt look good on Desktop...I'm in the middle of refactoring. I've just added in the test for desktop versus mobile screens, and now I'm changing the appropriate css in relation to that global property in the store. Also, while doing this refactor I should make sure that the rest of the app is responsive on all screen sizes in the Chrome thingy, and I should test it on real iOS devices. On some iOS devices Podcrypt isn't looking too sharp
    • Fix podcast rows and episode rows (look good, uniform styling, cursor pointer)
    • Fix the menu on desktop
    • Fix the height thing on the main containers
  • I do not think that the playback rate is actually working
  • Rearrange icons on rows, make the 3 dots menu huge and on the left
  • Skipping forward or backward while paused is updating the times for the podcast...it should not do that
  • To get the duration and to be able to seek anywhere, we should load each chunk one at a time, decide its frame headers, calculate the duration of each frame based on length and nitrate, combine that to get the total duration of the chunk, then save the start and end time for that chunk with the chunk index ...do this for all chunks, and then we should have able to map times to chunks to load them on demand. We'll also have the total duration and should be able to calculate the current time... it's all coming together
  • Rename the download index stuff to chunk index
  • Way too many NaNs on the wallet
  • iOS Safari is blocking alerts...looks like we need modals/notification/confirmation much sooner
  • iOS backtracking before 0 the time gets all messed up
  • The progress event off of the audio element seems to be really slowing down scrolling on iOS
  • The search bar is not centered on iOS
  • The number inputs on iOS do not expand much, the width is too small. For example, 1000 shows as 10
  • iOS PWA bug...when adding to homescreen, localstorage is not copied over
  • The audio switching in the background between elements seems to potentially have problems on iOS...one time it died, and the audio context in the lock screen went away and the audio stopped playing. One time, with the screen on but locked, the audio kept repeating, as if it kept going back to the same spot over and over when one audio element ended
    • It seems to keep repeating
    • I think I should make a test page where I can test everything, all chunking and going back and forth between episodes. Then I can take that and test it quickly on many different devices
  • So it looks like Media Source Extensions is the way to go...instead of implementing the double audio element switching thing that I've got going on, switch to using Media Source Extensions. Hopefully it will handle memory better than URL.createObjectURL was directly with blobs. The problem is, it is not yet supported on iOS...so, hopefully URL.createObjectURL works better on iOS than it does on Android. I could just do that as a fallback if media extensions aren't present in a browser. This should solve the problem of current progress and total duration, but I'm not quite sure if the problem of switching tracks is solved yet. I might be able to add and remove buffers to do it though
  • The media source extensions seem to be working...I don't think the browser is crashing. But, I need to work with loading and such before playing, the loading does not seem to be working very well
    • Seeking and sliding seems broken
    • Sliding is coming along, just battling with how to modify the source buffer attached to the mediasource in real-time...I'm getting errors every way I try
  • Do not forget to do a bunch of migration work
  • Block everything that has to do with mediasource if on an ios device...or just check for mediasource itself, graceful upgrade then nothing has to really change once it is supported
  • As part of moving from beta to 1.0, I believe we need to refactor and make very solid the pc-player...perhaps use a local redux store...that's probably best actually, there is so much going on that I feel it is an application in and of itself, complex locking and such
  • Skipping forward and backward seems to work very well...sliding seems to have some locking issues still...sometimes it gets stuck when going back, but I think it's okay for beta
  • We might need to be revoking the object urls...I just had chrome crash after switching between episodes multiple times
  • mp4 files seem to be giving mse issues...mess around and see what you can do, try to get durations and playback for mp4 segments by blobbing, audio element, etc...if impossible, perhaps we can fallback to a full objectURL for any unsupported MSE filetypes and browsers. It won't be perfect, but we can do our best. Also, test manually MSE with lots of mp3 files. Let's find out if MSE is even suitable for for file types that it does support. I should also go gather the issues that I'm following on the media-source w3c repo, I've commented on or subscribed to some potentially relevant conversations. The all-around best solution still evades me. At all costs we want to avoid having to load the entire audio file into memory, since some of the files can be very large...but what if it's actually not an issue? Perhaps my phone is just kind of old, and in 1-2 years all phones will be able to support really large files being loaded into memory. Perhaps do some testing of objectURLs on other Android phones. If it doesn't crash them, then maybe it's alright? But then we still have the issue of switching tracks while in the background, I'm not sure how that would play out. I don't believe the double audio element thing is a good idea, because the transition was noticeable sometimes audibly, and it even caused the media notification to disappear and then reappear, not good. MSE still seems most elegant once iOS is supported and if mp4 files will ever be supported, both of which I'm not sure on. iOS should be supported soonish, ipadOS 13 will support MSE, so you'd think iOS would follow. But it's already been years, so I'm not sure I can count on it
  • New plan I'm considering, push off downloads until after 1.0...I can keep tabs on the relevant technologies and then integrate them once everything else is in place. So, downloads is not an MVP feature right now. I think this is correct. I've sunk a lot of time into trying to figure out downloads, and I've hit a wall in the technology. I can make a super polished experience everywhere else, with tests and integrations of DAI and have a solid foundation, hopefully with users and revenue. Then, when the technology is there, I can add downloads again. Shame really, I like listening to downloaded content...perhaps I'll just have to get used to buying more data
  • Generate the wallet immediately. In the about page, give podcast owners their Ethereum address to put into their description...perfect easy onboarding. We will then have to explain how to cash out through Coinbase or somewhere else. Maybe Wyre will have some kind of easy cash out solution eventually. Or hopefully Stripe or Fidelity or PayPal will just add Ethereum somehow
  • Let's talk ETC #88 just doesn't seem to be working for some reason
  • The new way to download seems to be working well on desktop and Android, though some episodes do not download properly for some reason...they are probably returning some kind of 404 or something that I am not handling properly
  • Chunk downloads again, make sure to serve range requests properly from the service worker fetch handler. We'll need to potentially grab up to two chunks from IndexedDB to serve up a range request correctly
  • When deleting a podcast, remove all downloads as well
  • Consider a streaming download instead of partial content
  • Backing up the state to a json file stopped partway for me...
  • Podnews cannot be downloaded
  • Make sure the confirmation prompt still shows up on iOS devices
  • Peacefully transition from a streaming episode to a downloaded episode

Write blog post to validate with consumers

Write a blog post introducing the idea. If I really do need the podcast hosting companies to be on board, call them to action in the blog post. Also call podcast owners to action, asking them to get the key into their feed at whatever cost, including requesting the feature from their hosting company. Reach out to those who explicitly want reaching out to. Reach out to all of the podcast hosting companies again with the blog post and spec. Consider putting a Google form in the post to get feedback from consumers. Ask them the pertinent questions to understand if this would even be a good idea. Make the results public. Publish to hacker news and to Twitter and to Facebook and to some telegram groups maybe...oh yes, to hackernoon.

1.0

  • High priority
    • Wallet should work offline, balance should not show Loading... or NaN if offline, but the last known balance
    • What do we need to do to educate users on Podcrypt on first load? Do they know what Podcrypt is? Will they understand how donations work?
    • Add a public roadmap to the About page
    • Improve the Podcrypt wallet like the Sustainus wallet...consider combining them, though I'm not sure the future of Sustainus in light of the new npm funding thing coming out hopefully by the end of September
    • Get on all of the DApp tracking websites
    • Create a TheGraph Subgraph for Podcrypt (Join the Hackathon on September 16th)
    • Debit card purchases with Wyre
    • Integrate DAI
    • Integrate Bitcoin
    • Refactor the wallet to take all of the good things from Sustainus
    • Payouts must be perfect, with retries and background sync and everything!
    • Create a system that can handle many -> many relationship between a user's wallet and podcasts (the cryptocurrencies accepted between them)
    • Robust automated tests for payments
    • Full wallet with send and receive
    • Tip individual podcasts
    • Add weights to podcasts
    • Consider allowing the user to change the Podcrypt percentage
    • When we add the ability to send money to someone, why not put that in a modal?
    • Play and pause and seek listeners for the iOS/iPadOS lock screen player
    • Value per unit of time can be changed
    • Percentages to pay out can be changed
    • One-off donations/tips
    • If there are any issues with the payout for a podcast, we need to notify the user somehow. For each podcast, show indicators of success or failure, perhaps we need a whole page to show what's going on
  • Medium priority
    • Fix the loading indicator component...it's kind of weird, and Chrome pushed an update that seemed to break it. I couldn't scroll anywhere
    • Look into the Google Doc that Podnews shared with you, make sure your episode descriptions are very nice
      • We need to figure out how to handle content:encoded and markdown
    • Redo the podcast and episode rows
      • Rearrange icons on rows, make the 3 dots menu huge and on the left
      • Downloading, playing, and adding to playlist should probably all be present...make the ... menu bigger
      • Should all rows be the same size?
      • Add downloaded size to the episode rows
      • Duration of episode
    • Create a notifications system
    • Drag the playlist instead of arrows
    • Drag and drop playlist ordering, some with podcasts
    • Cloud backups
    • Transfer account information peer-to-peer to another device
    • Allow everything to be restored from the seed phrase, move the seed phrase recovery out of the wallet and into the backup and restore section
    • Sometimes when ending an episode, the episode starts over and is not marked as listened for some reasons (this happens relatively often, still happening)
    • Update podcast ethereum address and ens name correctly in the wallet and everywhere...make sure it stays up to date correctly...for example, in the wallet, the address to display is pulled from the statically saved podcast description
    • Make sure that the app remembers the last route every single time it loads...sometimes it will reset you to the homepage after a restart, perhaps every time actually
    • Explain security
    • Implement extremely high security
      • CSP
      • Pass all automated audit tools
      • Checkin all dependencies, no dynamic installation of node_modules
    • Only allow certain podcast and episode dropdown options if they make sense...for example, if you have not subscribed to a podcast, do not show the option of deleting the podcast
  • Low priority
    • FireFox download backup file not working, cuts off short
    • Media notification listener not working
    • Clean up numbers and strings, get rid of bignumber in as many places as possible, only use it for eth calculations
    • Use web.dev as a resource to audit everything
    • Get RSSParser to be a module that runs without build tools (except bare specifiers)
    • Study how MetaMask handles private keys...the web3 docs say to never store the private key unencrypted in localStorage, which I was essentially going to do...I think I need to, not sure...I believe MetaMask uses your password to decrypt the private key and put it into memory...that sounds annoying for the user...I don't think the security risk is that high, we'll see I suppose
    • Implement the nonce manager for managing nonces once ethers.js v5 comes out
    • Figure out service workers, get everything to work offline always, as much as possible
    • Pass as many lighthouse checks as possible
    • More powerful subscriptions (automatic downloads? Notifications when new episodes come in?)
    • Refactor to plain HTMLElement classes, get rid of functional element
    • Add minifying to Zwitterion
    • Add types for ethers.js, switch to ethers.js es module
    • Be more intelligent with the service worker, perhaps hit the network first and then update the cache...just try to get rid of caching issues if possible...also learn everything about service workers, since you don't know anything really and it's making things difficult
    • Think about replacing my custom nonce solution with the nonce manager: Fix nonces for payouts. Before this feature is officially supported, just implement it yourself: ethers-io/ethers.js#435 (comment)
    • Peacefully transition from a streaming episode to a downloaded episode
    • Very large episodes (Joe Rogan #1309 which is over 2 hours, probably the dan carlin episodes) give us a little bit of trouble. The load and play well, but things seems a bit slow, and when you hit pause the player play/pause button sometimes does not switch correctly)
    • Speed up downloads maybe (one person has complained that they are really slow)
    • Scroll up when moving between routes...but then you might not be able to go back to the same position you were at...figure that out
    • We need to be able to refresh podcasts and episodes...the titles and descriptions might become stale, since we set them once when subscribed to or added to a playlist, and we do not ever update them
    • Ask lit-plugin to look at interpolation within css styles, it is causing errors but shouldn't
    • Order the wallet items by payout amount or percentage
    • Dynamic imports and service worker caching for all elements
    • Separate the concerns of sending actions and doing the calculations...it would be nice to keep the store dispatches at the top level inside of components...then again, if I ever want to share that functionality, I'd want to abstract it away into a module, which I am already doing
    • The router should really have the container code, not the components themselves...they should be embeddable anywhere
    • Clean up the html on the episode overviews
    • Show indication of episode progress on episode rows
    • Add a public roadmap to the About page
    • Sometimes downloaded episodes will start pausing every few seconds...and I have to refresh a few times to get it to stop
    • Perfect background playlist progression...try using the service worker and having one episode loaded only
    • Allow the donate with Podcrypt button to say Listen With Podcrypt or maybe something else
    • Background sync downloads and all requests that need to go through no matter what
    • Deal with strings and numbers like Sustainus does it
    • Don't set things to loading in the wallet when updating every 30 seconds
    • We need to figure out something for testing for ENS...the ENS names have to be registered on the test network as well, so we should probably grab the real address from Ethereum main network and then use that on the test network
    • Look into Netlify's built-in proxying...we might be able to do that instead of running out own proxy
    • Make sure the marquee is working correctly on all screen sizes, I'm hoping the Chrome simulator thing was just wrong...make sure the text goes all the way out one side and all the way into the other
      • The scrolling disappearance and reappearance is not consistent across mobile and desktop
      • Do not freeze the main thread, the marquee lags
      • Only scroll if the text is too big
    • The search bar is not centered on iOS
    • Show the ENSName and the ethereumAddress to the user when the click on the verified button
    • Look into persistent data: navigator.storage.persist()
    • Make sure to check that we handle the quota exceeded error gracefully...tell the users what to do
    • Refactor pc-podcast-search-results completely...
    • Add the tabindex to the global state so that it is persisted on refreshes
    • Consider dynamically adding the search results page...and consider not naming the tab search results, but naming it the search term (this can probably wait until 1.0 or 2.0)
    • Rethink some of the pages that we have going on and see if they can just be modals
    • We might want to encapsulate the modal system...both of the modals for the podcast and episode rows are very similar
    • Get the service worker to work immediately on all devices, without requiring a page reload. Claim all clients might be what the api is called
    • iOS 13 should fix the downloading json file...which kind of works but kind of doesn't...the download attribute apparently doesn't actually work, so a new tab is opened with the file contents instead
    • Use background fetch and sync appropriately (especially for episode downloads)
    • Some servers do not expose range headers...the Access-Control-Expose-Headers header in the response from the server may not have a range header...this I believe was causing the drops when streaming that I was experiencing from a Wyre Talks episode. In these cases...we might want to detect that and then stream from our proxy server. I really don't want to start streaming from the proxy server if we don't have to, but it might be the best thing to do in these cases
    • Add duration information on podcast episodes...show the total duration, and how much the user has listened to
    • Make sure to be using dompurify correctly: cure53/DOMPurify#344
    • Redo migrations...they are a mess. We need to have types for every single
      transition, so 32->33 needs its own types...I think that will solve most of the issues
    • Figure out a better way to include the ubuntu font, comply with the terms of the license, and attribute with our automatic attribution tool
    • We need to fix components so that they do not react to other components url changes...I've already done this for the playlist component
    • Scroll to the top when switching certain views
    • Make the menu hit box bigger
    • The player gets in the way of the ui when you click on the keyboard to enter interval and stuff...the player should either disappear or needs to be part of the OS's calculation for what is viewable
    • Wouldn't it potentially be better to always load player playing based off of whether or not any episodes are playing? Then we do not have to have weird checks for each type of action
    • Watch out for sharing param names from the router...every time a route changes, all components may update if the query variable names are the same
    • Instead of depending on the currentRoute to do logic in each component (like only checking the ethereum account balance whenthe currentRoute is /wallet), set a visible or viewed or currentcomponent property from the router
    • Dynamic imports and service worker caching for all elements
    • Standardize all css, get rid of all inline styles
    • When should we update persisted podcast and episode information? The titles descriptions etc may become stale
    • Perhaps whenever a podcast overview is viewed, update the information that could have gone stale...the same with an episode
      • If you click subscribe, it should probably do it again as well and refresh the values
    • http://webpagetest.org
    • Write whitepaper
    • We might want to just use the ratechange event on the audio element to listen for playback rate changes instead of manually listening from the select
    • Change the playback rate select to a custom thing...and allow the user to set their own custom playback rate
  • Get backups to work on iOS, file download just doesn't work for some reason
  • Figure out why downloaded episodes stop randomly (this might be fixed already)...the request to the service worker seems to be cancelled by the loadeddata event hitting play on the audio element
  • Get very large downloaded episodes to work properly on iOS and Android
  • From No Crypto to Know Crypto, downloaded episodes stopped playing at various points...the media notification disappears and the sound stops, episodes 89 and 95
  • Do not send transactions one by one. Get rid of the main for loop. Gather statically all of the information necessary to do a payout, including the nonces needed, then execute them consecutively all at once...this may help the double transaction issues. Also, consider building an interface that abstracts away coin and blockchain if possible
  • Follow Android playlist in the background on cellular data issues:https://bugs.chromium.org/p/chromium/issues/detail?id=884517&can=2&start=0&num=100&q=Media%20notification&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&groupby=&sort=
  • For background playlist progression, try playing multiple audio elements at once, each element except for the main one will play silence. The silence will be as long as all of the audio element sources before it. Then we can progress in the background, because we will always be playing and never stop
  • Entities to receive payouts can be turned on or off before the interval is over
  • Explain security
  • Add tabs to wallet, one tab for wallet itself, one tab for current payout, probably a tab for past payouts
  • test double audio element to get perfect Android background playlist progression
  • Add all episodes from a certain point
  • Allow podcast and episode embeds...either an iframe or a custom element
  • Create a "listen to on Podrypt" or something element that you can share, pull request to Into the Ether
  • Switch to storing all audio files as blobs in IndexedDB, instead of arraybuffers. We should be able to do this once the feature is supported in WebKit on iOS. Follow this bug: https://bugs.webkit.org/show_bug.cgi?id=198278
  • Allow simultaneous downloads of multiple files, we'll probably have to chunk everything up and use range requests...also, background sync might be necessary to make sure downloads will always continue and finish even if the user puts the app in the background...this should work great on Android, hopefully iOS will catch up
  • Optimize all requests, especially podcast search, pulling ethereum address and email from the feed...we're pulling a ton of those feeds when we do a search
  • All double-spending issues must be accounted for! I'm not sure why that has happened to me multiple times
  • Automated tests, mostly for the time tracking and payments
  • If payouts are getting failures and retrying with expontential backoff, an
    -d the payout interval check kicks in, it will call payout again, and we will have two instances of the payout function going concurrently...that isn't ideal necessarily, but is it okay? We do want the interval check to kick in if the user refreshes the app, but because we persist the redux state, that means the payout will still be ongoing even when it actually isn't...consider this
  • Add a little refresh button to the balance
  • Make Podcrypt a viable crypto wallet...add the ability to send funds
  • Add Wyre widget
  • The seed phrase page should not say loading all the time...use asyncreplace instead of until, that might work
  • Search results should be addressable, right now if you refresh on the search results page it just displays index.html
  • Fix podcrypt.eth resolver...it got messed up and set to 0x0x somehow...
  • Improve payout tests...add tests for transaction amounts and balances before and after
  • fix podcrypt.eth resolver...the resolver contract address that I deployed is incorrect for some reason...I need to set it to the correct one (look at lastmjs.eth, that one was done correctly). After I setup the resolver, I can set the address for the resolver to resolve to
  • Arbitrary cryptocurrencies framework
  • Switch to blobs for downloads, I think it might be faster to first load into the audio element
  • Should we just put the Ethereum receive address page thing in a modal?
  • Turn all of the alerts and confirms and menus into custom elements...it's getting a bit messy in there
  • Instead of saying no results tell the user to search for podcasts above, just like the my podcasts tab
  • Loading for each tab individually...try not to block if possible
  • In the about page, give podcast owners their Ethereum address to put into their description...perfect easy onboarding. We will then have to explain how to cash out through Coinbase or somewhere else. Maybe Wyre will have some kind of easy cash out solution eventually. Or hopefully Stripe or Fidelity or PayPal will just add Ethereum somehow
  • Once payments are stable, I think the next biggest feature to implement is DAI...we need the marketing and hype that could come from that integration
  • The number inputs on iOS do not expand much, the width is too small. For example, 1000 shows as 10

Downloading audio issues

The most robust solution that I believe will work is downloading audio in chunks and storing them in IndexedDB, then using Media Source Extensions that continuously grab chunks and add or remove them from the buffer. I currently have an implementation of this working. The drawback is that MSE is not supported on iOS Safari...I believe it will be supported on iPadOS 13. But, there are still some drawbacks. For example, mp4 files that are not already setup to be playable in chunks will not play in chunks with MSE. So, we need a way to convert all files to a common format. It would be nice to do this on the client device. I've been experimenting with ways of doing this. MediaRecorder is not supported on iOS Safari...hopefully it will be. OfflineAudioContext seems perfect because you can render a source as quickly as possible into an AudioBuffer...but it does not support audio elements as sources. The reason I want an audio element as a source is because it takes care of partial content perfectly. If we could just get the audio out of the audio element somehow, that seems ideal. It is already doing the hard work of CORS and chunking the audio. But, the OfflineAudioContext does not support this. So, this path seems relatively promising, but the APIs are not supported across all platforms (mostly iOS Safari), so it's not ideal currently. Maybe in 6-12 months.

Plan validation with consumers

If I can get some podcast creators onboard. Perhaps create the form and ask the podcast creators to share it with their audience. Actually, after writing the blog post, call the podcast producers to action to share it with their audience

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.