Ask HN: What was an interesting project you started and finished over a weekend?
What have been those small, satisfying projects you started on a Friday evening, and by Sunday, you had something cool or useful (or both!) to show for your efforts?
Was it a simple app that solved a daily annoyance, some fun IoT experiment, or some non-tech hack that made your life easier?
241 comments
[ 2.3 ms ] story [ 264 ms ] thread* MP3 player apps from the app store suck. Most of them want up charge on everything or expect to stream music from some external source. I only found one that allowed accessing files by directory, as opposed to manually picking files one by one. WTF, I have over 4000 files.
* I tried writing a dynamic play list in HTML format using the input type files with the webkitdirectory attribute. Despite webkit in the name its not allowed in iOS.
* I couldn't just create a play list file and access it from SMB share. IPhone does support SMB file shares with a file preview feature, but that file preview feature does not execute JavaScript.
So instead I am running an SMB server which contains my media files, a web server which contains a symlink to the media files, and a pihole DNS server to create vanity local domains. The least level of restriction occurs when running in a web browser, under a domain accessed via DNS, with a prior formulated list of music. That domain can be a vanity domain name as the browser cannot tell the difference. That way the file list and html file are relative to each other under the same domain (which passes the audioContext security check in the browser), not downloaded to the phone, and still playable without Apple phone restrictions.
The app checks if your vpn is active, and tells you your public ip and geo location on a map (also deployed a small service on fly.io to ping/detect this).
Using copilot/chatgtp it was a doddle.
Of course Apple refused to put it in the App Store because it doesn’t have enough features. Even though adding unnecessary bloat to the app would be against their own design philosophy.
https://svelte.dev/repl/5a7f676868044bbba2ff3c7a64062066?ver...
On mobile you’ll need to kit the “output” button
I am not sure if I have the code anymore. I do vaguely remember that I have the executable somewhere. It was made with Unity3D and took around 40 hours
[1] https://m.youtube.com/watch?v=qTIZ-_UFXqQ&t=1s
We use Buildkite, so I changed their agent to run as lambda function, and used their eventbridge integration to trigger the lambdas. We saved about 15% of our CI costs by not using our 32 core build machines to call ecs wait-services, and freed up said machines to be able to run more often.
This test data formed the backbone of that company for the better part of a decade as it clearly showed when our product was running the temperature at the ceiling (across the whole room) reduced by 2degC and at the mid point of the room (head when sat in a sofa height) it rose by 2degC.
Our product acted as a destratifier and the test rig to prove it took me from Friday evening to Sunday night to make as I was working elsewhere at the time.
I'm curious if a very low resolution thermal imager such as Grideye could act in a similar fashion if you scanned the room using servos (https://www.adafruit.com/product/3538 is an example of a breakout board). Not sure of the accuracy though of such sensors for measuring temperature.
Edit: Just noticed they have "an accuracy of +- 2.5°C" so not good enough I guess, whereas ds18b20 claims 0.5C.
Yes that's the one. I couldn't remember/be bothered to check
Thermal camera would only work if there was a surface to get the temperature of, we needed to know the temperature of the air in the middle of the room rather than the walls etc.
We did think about hanging ping pong balls on string like the sensors I hung but then yes, accuracy becomes an issue compared to the ds18b20.
Also this was in 2011 so I don't think we had the same variety of embedded device compatible stuff available and a proper thermal camera was out of our budget.
Fun side note, I brought the test rig back to life a few months ago for fun, found the OneWire lib code I wrote, copied into the Arduino project (mBed was long gone) and it worked with about 2 minutes of tweaking. That's 13 year old code up and running like no time had passed ... I can't even imagine the pain of bringing back a 13 year old web project!
It's for controlling DMX colored lights over network. It takes UDP packets (and later Websocket messages) and turns them into DMX protocol packets which get sent over USB serial adapter to the DMX wire. It's a rewrite of a previous node.js version which had bitrotted.
I think I made the MVP in about 7 hours during one saturday afternoon. Finishing it up took a few weeks more of evenings.
https://www.davesnider.com/posts/bookmarks
My team runs with: https://sprintcalendar.com/3-week-sprints/start-2020-12-03/r...
I've only tweaked it a bit since then, after sharing it and getting some feedback from others who found it useful.
This weekend I went looking for calendar widgets and after trying approximately 5 I couldn't find any where the UI felt intuitive.
I made my own instead. Maybe I'll strip out the internal stuff and share it and it can be yet another unintuitive calendar widget for the next person.
So, if you were in NYC in January and wanted to find out the closest location that was at least 72 degrees, it would spit out locations that met that criteria.
(There was also a companion app, "Take Me Cooler," that did the reverse.)
Required a one-time download of ZIP/coordinate data and daily downloads from a weather API. Figured out how to calculate the distances, and most of the rest was just stitching it all together.
The reason it only gives you one random thing a day is cause I didn’t wanna try “re-roll” the pattern I was gonna practice to give me something easier.
https://www.pickoneatrandom.com/
Started in quotes because my contribution was combining an existing project that was about to fail due to capacity issues with the infinite botnet of AWS spot instances and the power of Hacker News.
It's more than a decade ago now, but I think it's a good example of a project with a simple goal that enabled people to get involved and feel like they were doing something useful.
1: http://rossduggan.ie/blog/code/archiveteam-yahoo-messages-fo...
Ludum Dare was particularly good fun in its early years (early-mid 2000s), when it was a fairly small community, when people were coding from-scratch, before Unity became an option and the event grew into something a lot bigger.
Game jam coding is different to 'real' game dev, as the time pressure encurages you to just hack away freely and creatively, not spend too much time thinking about building reusable systems or tools, and you can discard the codebase at the end of the weekend.
These days, small functional 3D printing projects can be quite satisfying. Going from a sketch to a simple CAD model to a first draft print, iterating the design a couple of times, and ending up with a simple-but-useful physical object, learning a bit more Fusion 360 in the process.
I remember the big SPA rework of the website that seemed like overkill. Then a couple people bitched me out for preparing base code, so I stopped. How dare I try to get myself halfway to where the unity devs started, I guess.
One thing I was fairly proud of was how scrappy the script was - I wrote it in typescript for the familiarity with the sqlite driver, but I used find and curl to actually do the crawling and API submission.
Is it hard to do that in pure typescript/node? No, but I was in a "how can I validate if this is even an interesting thing to be doing mode" and execing out to these tools was a way to get there slightly faster.
I've found that this attitude has been a great way to make weekend projects more fun and feel less like work.
Getting to some kind of tangible value sooner has also made easier to not lose interest halfway through and has been yielding me more semi-complete weekend projects (the word semi is doing a lot of work here tbf, but it's all relative)
I have a Brother printer that has two printer trays, one manual tray (that takes variable sized paper) and a A4 tray. However, when printing from iOS, it doesn't have the full print preset dialog and it is impossible to print from the manual tray, nor is there a way to tell it I want print A6. Of course I insist being able to print A6 whenever, wherever I want with AirPrint and accept no substitute.
So I started with the Bonjour printing spec (https://developer.apple.com/bonjour/printing-specification/b...), and dns-sd on macbook to figure out how AirPrint actually discovers printer and what makes it tick. The entire thing is built on mDNS which is basically DNS instead of using a DNS resolver, it sends the query via multicast DNS. If someone on the network wants to find an AirPrint printer, then it queries via mDNS _ipp._tcp.
e.g. $ dns-sd -Z _ipp._tcp With shows the PTR, SRV and TXT records. The TXT records are based on the Bonjour Printing Spec which list out which fields so it knows the type of the printer and driver to use and it uses the SRV port to find the ipp port so it can contact the printer.
Further investigation using rvictl (iOS packet sniffing) showed the IPP traffic, which is really http API. It is via this API that iOS determines what paper is supported from what tray.
The path is then clear: create my own mDNS service that returns a printer on my own port, this IPP port acts as a reverse proxy to the real printer's IPP port, but it modifies the "media-col-ready" attribute to make iOS think A6 is loaded into the manual try.
It was extremely painful, but it was done.
There were many pitfalls along the way:
* iOS expecting the mDNS to resolve in a certain way, which Hashicorp's library didn't support, this necessitated forking the library and fixing the resolver.
* iOS expecting not only _ipp._tcp but also requiring _universal._sub. (https://support.apple.com/en-us/guide/deployment/dep3b4cf515...) in mDNS, which further complicated the implementation and took time to figure out how it worked. Needed to test with `dns-sd -Z _ipp._tcp,universal`
* iOS detecting the printer via mDNS but when clicking on it, it says it's not available. It is because it insists that ipp has to be on port 631, and refuses to accept (unlike MacOS) ipp on any other port
(I've run up against that elsewhere, and couldn't get over the hump for iOS.)
In short, it's a minimal Heroku clone that started out as ~500 lines of Python run by a custom SSH config.
It has paid for itself several times over, and is still something I use daily (it runs all my little API endpoints, Node-RED instances, Python services, you name it.
It's a small quality of life improvement but I wonder why this does not exist out of the box.
I could probably make it a bit easier to set up, but it would then require another weekend. :))
It lets you search for parts of British place names, and will plot the places that match on an interactive map, so you can search for places that start with 'great' or end with 'burgh' or contain 'sea' (or you can use regexes for more complex stuff). People have found some cool patterns with it.
It’s not "finished" because I still have tons of ideas for improvements, and still want to make a blog post explaining how and why I did it, and show the results in an interactive page (and also share the database with everyone).