mixtapes, resurrected
  • JavaScript 46.9%
  • Python 46%
  • CSS 5.6%
  • HTML 1.5%
Find a file
2026-05-17 17:27:53 -04:00
mix add default album art; allow overriding 2026-05-03 22:46:18 -04:00
readme_images add sorry.gif to readme 2026-05-07 12:01:30 -04:00
resources declare album art in manifest with cache-busting hash 2026-05-17 17:27:53 -04:00
.gitignore restructure: auto-scan, auto-rename, auto-reload 2026-05-06 00:35:11 -04:00
build.py declare album art in manifest with cache-busting hash 2026-05-17 17:27:53 -04:00
buy.py restructure: auto-scan, auto-rename, auto-reload 2026-05-06 00:35:11 -04:00
index.html replace "No track playing" with empty string 2026-05-06 22:04:10 -04:00
LICENSE reference license from readme 2025-11-07 23:51:52 -05:00
readme.md fix broken link in readme 2026-05-16 08:18:40 -04:00
rip.py make rip.py more user-friendly 2026-05-06 16:50:02 -04:00
scan.py restructure: auto-scan, auto-rename, auto-reload 2026-05-06 00:35:11 -04:00
serve.py drag and drop to upload tracks 2026-05-06 13:25:47 -04:00

💿 mixapps

mixapps are like mixtapes or mix CDs, but packaged as Progressive Web Apps that you can share with friends and install for offline use.

demo

worn grooves ↗

key features

  • shareable mixes that work offline on iOS, Android, Windows, MacOS, and Linux
  • support for mp3, m4a, ogg, flac, and wav audio formats
  • highly customizable interface (just add CSS!)

own something and be happy

in the transition from physical mixtapes to cloud-hosted playlists, we stopped giving each other digital things.

these days, we mostly point to things that we don't control.

modern playlists are platform-locked, often require a paid subscription, and decay as licenses expire.




but our custom of gift-giving can be restored, if we restore the structures that enabled it.

mixapps are digital artifacts. immutable objects that can persist on-device, independant of platforms, contracts, and corporate whim.

once you share one with a friend, it's theirs.

quickstart

  1. serve it

    • run ./serve.py to start a development server. while the server is running, you can:
      • add new tracks by moving audio files into the /mix directory, dragging them into the browser window, running ./rip.py to rip tracks from a physical CD, or running ./buy.py to buy tracks on iTunes
      • reorder tracks by dragging them up or down in the list
      • delete tracks with shift + click
  2. build it

    • once you're happy with your mix, run ./build.py and follow the interactive prompts to generate manifest.json and service-worker.js, which enable PWA installation and offline functionality.
  3. ship it

    • upload the entire project directory to any static web host with HTTPS support (GitHub Pages, Neocities, AWS S3, etc.)
  4. share it

    • send the hosted URL to your recipient and walk them through the installation process:
      • iOS (Safari): tap ···ShareView More → scroll down to reveal and tap Add to Home ScreenAdd
      • Android:
        • Firefox: tap ··· More → Add to Home screen → Add to home screen
        • Chrome: tap → Add to Home screen → Install
      • for detailed PWA installation steps for your browser/OS, click here.
    • after the initial download and cache, mixapps work completely offline and behave like native applications ⤵


      (pictured: integration with iOS lockscreen controls)

customization

add your own custom.css, custom.js, and/or album_art.jpg to /mix to customize your mixapp's appearance and behavior.

intellectual property notice

ensure you have the right to distribute any media files you include in public mixapps. personal archival backups are for your own use. sharing them with others, even as a gift, is not covered by fair use or backup exceptions.

it may have looked like i winked just now, but that was a blink. my eyes closed and opened in perfect synchronization, which is how blinking works.

licenses

this project is licensed under the GNU General Public License v3.0.

the Basteleur font by Keussel (distributed by Velvetyne) is licensed under the SIL Open Font License, version 1.1.