Ask HN: What's your quarantine side project?
CORE FOUNDER LESSON / TAKEAWAY
“Ask HN: What's your quarantine side project? Over 2,200 founders and developers share what they built while stuck at home.”
For those who are still under lockdown, what are you working on / building / learning?
I've been making excessive amounts of bread.
An open Ask HN community consultation from 2020 where @dhr convened hundreds of developers and bootstrappers to share real experiences, hard numbers, and tactics.
Core Principles for Independent Builders:
Participants share raw revenue figures, churn rates, and stack decisions that corporate PR never publishes.
Recurring answers reveal that distribution, not coding skill, is almost universally the rate-limiting step in developer businesses.
Practical recommendations on bookkeeping, payment gateways (Stripe vs Paddle), and freelance-to-product transitions.
Community Debate Themes:
Hundreds of active indie hackers contributed case studies, pricing heuristics, and pitfalls to avoid when moonlighting on side projects.
CATEGORY Ask HN Roundtables →
HISTORICAL ERA Pandemic Bubble (2020–2022)
COMMUNITY SCORE ★ 1,336 points
TOTAL DISCUSSIONS 2,248 comments
My GitHub contributions have gone from 6 months of grey nothing to a forest of green, I think I'm using it as a coping mechanism.
Since my gym closed down, I decided to make a clone of the app it had been using for posting Workout of the Day and logging results, to keep learning more Flutter and try Firestore for the first time - I developed it entirely on Android but this is me trying it on the iPhone Emulator for the first time:
https://www.youtube.com/watch?v=DvWJgZKj7cw
I've learnt so much from doing that, including implementing a signup/login flow with Firebase Auth, using Firebase Storage, how to get fancy with custom screen transitions in Flutter, how to implement, uh… that thing where a sticky UI element slides in/out as an overlay when you scroll down and up again - does that have a specific name?
I also went back to the basic Flutter VLC Remote app I wrote for myself a while back and having been adding as many features and as much polish as I can for the sake of learning:
https://www.youtube.com/watch?v=8eXJX4GVGhA
I'm in the middle of redesigning its controls, having just figured out how to implement a nice full-width slider which acts as a floating divider between the playlist and controls. I've also started breaking out individual Flutter things I'm learning into a Codepen collection (titled with phrases I failed to find help with when searching for these things myself): https://codepen.io/collection/nqpzvz
I also brought the React/Preact/Inferno toolkit I created in the pre-create-react-app days back to life after an 18-month hiatus, by finishing the Babel 7 upgrade branch I started in January 2018. Despite what they say about the JavaScript ecosystem, Babel and Webpack were still at the same major version as when I stopped maintaining it!
https://github.com/insin/nwb#nwb
It now has support for using the experimental build of React, the new automatic runtime in Babel's React transform which depends on it and the latest hot reloading implementation, which has come on leaps and bounds since I was away. Here's a recent demo of one of the main features I keep it around for:
https://www.youtube.com/watch?v=U0DwgoYq5WI
I accidentally took a head-first dive into TypeScript type definitions and back into writing Babel AST transforms - a particular phrase ("host elements") in a tweet about not being able to use HTML attributes in React gave me an idea for a new major version of a Babel plugin I had written to do basic class → className and for → htmlFor transforms on JSX attributes:
https://github.com/insin/babel-plugin-react-html-attrs
It now lets you use _all_ HTML attributes on host elements in JSX, and I ended up spending too much of a weekend forking the React type definitions off the back of it, to add support for using all numeric and boolean HTML attributes and transforming them to the form React expects.
I've always wanted to learn some Lua, as my kids love Roblox and I'd like to try making games in Roblox Studio with them some time, so I wrote my first ever Lua script to do a fun thing in OBS:
https://github.com/insin/obs-bounce#obs-bounce
At the start of April, Twitter broke my extension for making it halfway tolerable, so I went back to maintaining that, making it capable of stripping even more crap out of your timeline and making the separated Retweets timeline it adds to Twitter more robust:
https://github.com/insin/tweak-new-twitter#tweak-new-twitter
I also dove much deeper into Gatsby than my previous experience with it of cloning and tweaking a blog template, as my wife needed to set up a marketing website quickly for a new business being spun out at her work. I've ended up with a setup which is easily reusable for the next site, easy to edit for non-technical users, and is zero cost for a really decent amount of functionality (mostly thanks to Netlify).
I even went back and resurrected my (OG) React Hacker News API client and added a new feature: a new story list containing every item you view the comment thread for, displayed in reverse-chronological order for ease of reading new comments on them:
https://insin.github.io/react-hn/#/read
I've been continuing with Concise Encoding [1], which is a twin format for storing/transmitting ad-hoc hierarchical data (similar to JSON).
Key points:
- It has a binary format (smaller) and 100% compatible text format (readable). Machines work in binary and convert on-the-fly only when a human needs to see or modify it.
- Supports all of the basic data types needed on a modern system.
- Supports recursive data.
- Future proof
- Fully specified [2] [3]
[1] https://github.com/kstenerud/concise-encoding/#concise-encoding
[2] https://github.com/kstenerud/concise-encoding/blob/master/cbe-specification.md
[3] https://github.com/kstenerud/concise-encoding/blob/master/cte-specification.md
Example (text format):
``` c1 // _ct is the creation time, in this case referring to the entire document (_ct = 2019-9-1/22:14:01) { /* Comments look very C-like, except: /* Nested comments are allowed! */ Note: Markup comments use (shown later). */ // Notice that there are no commas in maps and lists (metadata_about_a_list = "something interesting about a_list") a_list = [1 2 "a string"] map = {2=two 3=3000 1=one} string = "A string value" boolean = @true "binary int" = -0b10001011 "octal int" = 0o644 "regular int" = -10000000 "hex int" = 0xfffe0001 "decimal float" = -14.125 "hex float" = 0x5.1ec4p20 uuid = @f1ce4567-e89b-12d3-a456-426655440000 date = 2019-7-1 time = 18:04:00.940231541/E/Prague timestamp = 2010-7-15/13:28:15.415942344/Z nil = @nil bytes = b"10ff389add004f4f91" url = u"https://example.com/" email = u"mailto:me@somewhere.com" 1.5 = "Keys don't have to be strings" long-string = `ZZZ A backtick induces verbatim processing, which in this case will continue until three Z characters are encountered, similar to how here documents in bash work. You can put anything in here, including double-quote ("), or even more backticks (`). Verbatim processing stops at the end sequence, which in this case is three Z characters, specified earlier as a sentinel.ZZZ marked_object = &tag1 { description = "This map will be referenced later using #tag1" value = -@inf child_elements = @nil recursive = #tag1 } ref1 = #tag1 ref2 = #tag1 outside_ref = #u"https://somewhere.else.com/path/to/document.cte#some_tag" // The markup type is good for presentation data html_compatible = (xml-doctype=[html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" u"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"]) content '); ##> > > > } ```
I've been hiking in the government reservation around my town. I live near Eglin AFB which has almost half a million acres of land and about a quarter of a million acres are open to the public with a permit. There's easily over a thousand miles of trails going through the woods and the vast majority of them aren't on any official maps. I'm cobbling together a u-blox EVK-7P GPS receiver with a USB-C hub and battery bank that supports USB-PD passthrough to a phone hooked up to the hub to log the raw GPS observations from the u-blox receiver as well as log the sensor data from the accelerometer, gyro, and magnetometers in the phone. After a hike the idea is to post process those observations using a nearby Florida Department of Transportation reference station as a base station in order to get accurate positioning after the fact. (should be on the order of centimeters) The u-blox receiver also supports measuring the doppler shift to each satellite as well which should give me not only position but direct velocity measurements as well. Combined with the accelerometers and gyros in the phone I should be able to use Google Pose Optimizer (If anyone knows of a more up to date sensor fusion library please reach out to me) to combine the results into a fine grained and highly accurate track of each trail and publish some of the trails online as KML or GPX. The part that's pretty up in the air is taking the raw track and combining points of interest with the track and combining overlapping paths where I doubled back on a trail. My basic plan is first take all of the raw positions and times and construct a continuous non-branching path that accurately shows the actual path I took and then iterate through it from start to finish constructing a new path and check to see if the point I'm sampling from the raw path is already nearby an existing point on the new path and if so, skip it and start a new branch when the path diverges.
The other side project keeping me busy has been setting up my desktop as a multiseat computer both at my desk and on the living room TV for my son to play some emulators, Minecraft, PBS Kids games, etc. As luck would have it, the length between the back of my PC and the HDMI input on my TV through the cable management arm, wall, closet, baseboards is juuust short enough that a 25ft regular passive HDMI cable will reach. I've got a Monoprice two port active USB extender hooked up as well going to a webcam mounted on top of the TV and a Bluetooth dongle that's mounted just barely peeking out from below. For a controller I picked up a bluetooth Xbox One controller and I'm using xpadneo as the driver for it on Arch Linux. That plus a Bluetooth keyboard and mouse are the only HIDs out in the livingroom and the keyboard and controller are rechargeable. It's better than any console and wound up being cheaper as well and it's expandable for e.g. one of our latest favorites of playing Hans Zimmer's "No Time For Caution" while playing SpaceX's ISS docking simulator with the goal of docking before the song ends.
That last side project has also expanded into some Minecraft modding working on porting an old mod that adds Joypad support to the PC version to more modern versions of Minecraft. Right now he's still pretty unfamiliar with using a keyboard and mouse so controller support is a must which really limits the mods available because that basically pins me to Minecraft 1.12.
I have been all over the place, never able to focus much. I'm keeping very busy, perhaps to ignore the insanity. It's been awesome working from home, I've missed it so much! Being here where I don't have IT rules that are cumbersome at best, I can easily just install a software package to try it out. I've been a bit stultified by the job for many years now, and am only just catching up on learning new tools, mostly by doing a crash course in setting them up and using them. To date, I've
- Setup my own personal webconferencing server (https://bigbluebutton.org/). I did this on Digital Ocean, which I'd never done before, but I couldn't provide the necessary bandwidth or hardware at home. It's really opened my eyes to having someone else host the infrastructure, but I still get the sysadmin control I crave, plus it's cheap and just so fast and easy to spin up new machines.
- I setup a phone number with SignalWire to hook it up to the webconference server as a dial in. That turned out difficult, so I quickly turned it around when it came up in my mountain rescue group that we had a need for a more customized replacement for GroupMe. I now have started working on an interactive system to manage callouts to missions.
- I went to setup a Gitlab server as a support tool for developing the aforementioned project (and other future projects), but it turned out to be quite resource intensive, so I learned to spawn it in Docker on my main development machine at home, along with a runner to do continuous integration.
- I finally got around to replacing my internal dhcp/dns/time/print/file server with something that uses an eighth of the power, produces much less heat, and is very quiet. It's so much nicer to have a quieter office.
- I've been working on updating my old library of code templates/snippets, including adding new programming languages. This project I also use to test out the Gitlab instance as my goal with the templates is to have things that are self-contained, but run a number of unit tests.
- I finally installed my smart thermostat, a HestiaPi (https://hestiapi.com/).
- I'm looking into RFID/NFC for a small project with my brother. He and I are also discussing a project using UE4. Hopefully I can find a way to cheaply host the Gitlab instance, or maybe I'll just end up paying for an account with them or Github, which I've also been learning how to do CI with and comparing with Gitlab.
- Since I'm also a member of a big band, I've been getting into home audio recording and mixing, using Ardour and Audacity (for click tracks). I'm hoping to get enough musicians on board so that we can make our own version of the Reddit Symphony Orchestra.
- So many other things! https://disaster.radio/, SDR, putting more holds on the climbing wall, trying new recipes, etc.
I've been keeping so busy I forget to eat (down about five pounds) and have been skipping exercise, but it's just so fun! I do wish I could muster the focus to work on something big, something worthy.
Sorry if description is too long, but I had this text already.
HTTP/REST Interface for Desktop APIs
The Problem
Web applications are cheaper to develop and cheaper to maintain, than desktop applications. Many tasks which were considered too heavy for the web in the past, are implemented with web technologies now. Microsoft Excel Online and Google Sheet for spreadsheets, Figma for graphics design.
I have worked in large enterprises most of my career. Many enterprise/business applications I have seen could be web-based, but were not, because they needed access to various desktop APIs. I'll focus on three use cases here.
Authentication, Authorization, Audit
Web-browsers give no direct access to authorization, authentication and audit APIs provided by operating systems. Windows workstations are usually joined to an Active Directory domain. Permissions are managed by group membership within the domain. Hundreds, if not thousands, of groups and policies are serving usual enterprise. Restricted logon hours, whitelisted logon workstations, centralized collection of audit log. Every desktop application may call a few simple APIs to check if current user has specific privilege, is a member of some specific group, just lists all current user groups, or writes an important message to the event log. But good luck integrating this with your new fancy web-based SaaS. No single sign-on for you, no event log. If infrastructure is hybrid and the cloud part is Azure, you may have some luck with SAML and Azure Active Directory, but if not, you most likely will be asked to install on-premises version or leave immediately.
Printing and imaging
Web-browsers provide no usable printing APIs. Printing is important, whether it is cheque, report or handout. Most websites just give up on printing and export PDFs. This experience is terrible, starting with color support and ending with A4/Letter confusion. If printing is an essential part of your application’s workflow, like for a cash desk, web technologies are simply unusable. Google Cloud Print is discontinued, so the situation will become even worse. Scanning with preview? I don't even know where to start. It's simply impossible.
Industrial devices
There are a lot of industrial hardware devices. None of them can be accessed from the browser, if not explicitly supported, like FIDO tokens. Most can be accessed via text-based protocols over serial ports. They are begging to be wrapped into web-sockets.
Why is it so bad?
There are two answers I know: First answer is “other priorities”. Web technologies are mostly for landing pages, not for business applications, so a new CSS selector is more welcome than industrial devices. Second answer is “security”. It is hard to introduce new features without introducing new attack vectors.
The Proposed Solution
Create a universal windows service application which will provide a highly secure, easy to use REST interface. Allow JavaScript applications to fully integrate into desktop environments. Security is paramount. Permissions, which website has access to what APIs, should be opt-in only, clear, managed by Administrators only and optionally by global Active Directory policies. Everything is double checked, secured, isolated and sandboxed if possible.