Jordan Eldredge
jordaneldredge.com · Personal blog · on HN since 2014
Jordan Eldredge writes about his Winamp-related web projects, including a browser Winamp clone, skin rendering, and WebAssembly visualizers.
What HN saysCommenters praise his Winamp projects and link his writeups, along with his post on the risks of curl-pipe-sh install scripts.
22HN people shared it
12linked it in comments
23stories submitted
1.5Kstory points
4 months agolast shared
2014people per year2026
Most-shared posts
- 1Winamp 2 in HTML55 people · 531 points · first shared 2014 · 109 comments on HN
- 2One way curl pipe sh install scripts can be dangerous5 people · first shared 2015
- 3We made our music visualizer 73% faster by compiling to WASM in the browser2 people · 31 points · first shared 2021 · 3 comments on HN
- 4Rendering Animated .ani Cursors in the Browser2 people · 5 points · first shared 2021 · 1 comments on HN
- 5From Opera to Tech2 people · 2 points · first shared 2024 · discussion on HN
- 6Projects2 people · first shared 2014
- 7Investigating corrupt Winamp skins1 people · 615 points · first shared 2024 · 145 comments on HN
- 8Rendering "modern" Winamp skins in the browser1 people · 119 points · first shared 2024 · 43 comments on HN
- 9Grats: A More Pleasant Way to Build TypeScript GraphQL Servers1 people · 75 points · first shared 2024 · 77 comments on HN
- 10In React {Transitions} = F(state)1 people · 39 points · first shared 2025 · 54 comments on HN
- 11A nice way to render Markdown in React apps1 people · 19 points · first shared 2024 · 6 comments on HN
- 12Gzip hates your DRY code1 people · 4 points · first shared 2021 · discussion on HN
- 13You're underusing Underscore1 people · 2 points · first shared 2016 · discussion on HN
- 14React's useTransition and state update reordering1 people · 2 points · first shared 2025 · discussion on HN
- 15Mainlining Nostalgia: Making the Winamp Skin Museum1 people · 2 points · first shared 2020 · discussion on HN
What HN people wrote when they linked it
captbaritone · 2026-07-02
Author of the Museum here. Agreed! That was true for "classic" Winamp skins which are what is shown here. I also took a stab at "modern" Winamp skins which were fully dynamic and scriptable and wasn't quite able to bring that to the browser. I did a writeup of that work here: https://jordaneldredge.com/webamp-modern/
yoz · 2024-07-25
Jordan Eldredge, the author, has done some amazing WinAmp-related projects over the years, including WebAmp (a web-based, from-scratch reimplementation of much of WinAmp) and a WASM engine for WinAmp-style music visualisation.
His project page: https://jordaneldredge.com/projects/
peutetre · 2024-11-22
> Can someone explain to me why people are excited about WebGPU and WASM and similar technologies?
WebAssembly brings all languages to the browser. Why shouldn't I be able to use C#, Rust, Go, Dart, Python, or whatever else in browser?
WebAssembly brings better performance. That's what Webamp found: https://jordaneldredge.com/blog/speeding-up-winamps-music-visualizer-w…
And what Amazon found: https://www.amazon.science/blog/how-prime-video-updates-its-app-for-mo…
And what Google found: https://web.dev/case-studies/google-sheets-wasmgc
Why make things perform worse when they can perform better?
Why shouldn't I be able to make an application that compiles to the Windows, macOS, and Linux desktops and also to the browser? This one does: https://bandysc.github.io/AvaloniaVisualBasic6/
timdiggerm · 2018-02-08
Did you visit the app (https://jordaneldredge.com/projects/winamp2-js/) and press play?
shakna · 2018-01-14
A URL and an IP are not equal.
Building a script that acts differently for a web browser, a normal download, and curl, is trivial, and I've seen it happen. Here's a proof-of-concept[0] someone else wrote.
Manually downloading is safer, at least you can review, curling straight into a shell is inherently unsafe.
The better option is still a package manager, but curling straight to a shell is very unsafe.
[0] https://jordaneldredge.com/blog/one-way-curl-pipe-sh-install-scripts-c…
stable-point · 2017-01-15
Opening it in a text editor is not sufficient. With clever use of 'sleep' you can even have the server return a malicious payload only if it thinks its getting immediately piped to sh[0].
If you're opening it in a browser to check, you've also got to worry that the server may be looking at curl's user agent to decide whether to serve up a malicious payload[1].
[0] https://www.idontplaydarts.com/2016/04/detecting-curl-pipe-bash-server…
[1] https://jordaneldredge.com/blog/one-way-curl-pipe-sh-install-scripts-c…
sac2171 · 2016-06-22
That doesn't always work, and is still quite dangerous in the (abstract), usually your other programmers are friendly, but you should definitely be careful about it.
Proof of concept: https://jordaneldredge.com/blog/one-way-curl-pipe-sh-install-scripts-c…
blueblob · 2015-07-20
There are lots of reasons you should not do this, and many blogs with different explanations.
https://jordaneldredge.com/blog/one-way-curl-pipe-sh-install-scripts-c…
http://output.chrissnell.com/post/69023793377/stop-piping-curl-1-to-sh…
carlesfe · 2014-11-06
That looks very cool, but I'd appreciate a bit of context. Maybe it's a work in progress?
Edit: Maybe it's a WIP, it's not linked from the author's project page http://jordaneldredge.com/projects/
I found a Github link deep at the bottom of the page: https://github.com/captbaritone/winamp2-js
sundarurfriend · 2018-02-09
For those who don't want to navigate Twitter for whatever reason (tracking, slows down your browser, bad UI, etc.), here's the content from the thread (the images and videos are still Twitter-hosted, by the way):
-----------------------------------
It's done! Winamp2-js (https://jordaneldredge.com/projects/winamp2-js/) finally supports all three windows!
To celebrate, here's a list of some of the cool things it can do: (thread)
https://pbs.twimg.com/media/DVcfDHBVQAAp3Tm?format=png
* Load any classic Winamp skin just by dragging it onto the main window. (Shoutout to @stuk for JSZip which lets us decompress .wsz files in the browser. (link: https://stuk.github.io/jszip/)
https://video.twimg.com/ext_tw_video/961271636983820288/pu/vid/990x720…
* Drag local audio files into the playlist to queue them up.
https://video.twimg.com/ext_tw_video/961271712238063621/pu/vid/994x720…
* Visualize your music with the bar or line visualizer.
https://video.twimg.com/ext_tw_video/961271795725709314/pu/vid/534x360…
* Adjust the fully functional EQ to pump up the bass.
(Shoutout to @epistemex for cardinal-spline-js (link: https://github.com/epistemex/cardinal-spline-js))
https://video.twimg.com/ext_tw_video/961271880035389441/pu/vid/630x640…
* Import/export Winamp's own binary EQ settings files. …
mzware · 2018-02-09
I'm using Chrome by the way.
#1 - TypeError: Object.entries is not a function(…)
e.(anonymous function) @ winamp.js:38
#2 - winamp.js:49 Uncaught (in promise) TypeError: Object.entries is not a function
at _ (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:49:1517…
at Ct.beginWork (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:3171…
at i (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4432…
at a (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4464…
at s (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4488…
at E (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4842…
at b (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4816…
at h (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4729…
at p (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4668…
at Object.Nt.updateContainer (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:5094…
at https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:6238…
at Object.Rt.unbatchedUpdates (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:4969…
at gn (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:19:6234…
at uo.render (https://jordaneldredge.com/projects/winamp2-js/built/winamp.js:27:2906…
at e.<anonymous>…