Update for the week ending on Friday, Nov 26, 2021
Short week for Thanksgiving
TinyPilot
Management
- Continued coordinating tasks to get Voyager 2 ready to ship
- Continued investigating how to migrate away from Justworks as a payroll provider
- Apparently they registered accounts under my name with state tax authorities and never shared the details with me, so now it’s making it hard for me to migrate away.
- Tried to work with a vendor in China on getting defective parts back to them
- Shipping anything internationally when the recipient isn’t paying you for that item (e.g., returning an item, replacing a broken part, sending a free device to a developer) is always such a pain
Software development
- Spent a lot of time trying to use a Mac Mini (first-time OS X user) to test a TinyPilot scenario
- Did an initial review of a PR to add support for logging sensitive data
- Fixed a bug in TinyPilot’s logger
- Did a small refactoring for TinyPilot’s mouse logic
Customer support
- Added an FAQ article about disabling virtual storage on TinyPilot
Product research
- Researched EE firms for Voyager 3 development
Sales
- Published blog post about 2.3.1 release
- Met with designers about rebranding and website redesign
- Found a buyer for the remainder of the cases from our now-retired Hobbyist kits
- Joined NERD Summit as a Community Sponsor
What Got Done
- Added support for exporting all your data
- You’ll now find an “Export” section at the bottom of your Profile page.
- I needed something like this for the migration to SQLite, so I figured I might as well offer it as a feature.
- Refactored authentication handling to be context-based
- Still not totally sure this is a good idea.
- Before, for API routes that required authentication, I’d authenticate on the first line of the function and return HTTP 403 if they’re not logged in.
- Now, I wrote a middleware function that adds the user’s username to the HTTP context or returns HTTP 403 if they’re not logged in.
- The part that feels weird is that when I retrieve the context later, I
panic
if it’s not there, because I’m assuming that we can’t reach that code if we didn’t already call the middleware, but nothing is enforcing that, so it feels weird, but it does “fail closed.”
- Split into two Go modules
- I realized that my main app and a test app were sharing the same
go.mod
file even though they’re totally separate apps. - I thought I fixed it, but I apparently still need to fix the AppEngine config.
- I realized that my main app and a test app were sharing the same
- Continued the migration from Google Firestore -> SQLite
- Changed the behavior of
datastore.Users
so that it includes users who have set profile information or preferences, not just users who have published a weekly update. - Fixed a bug where I was subtly swallowing an error
- Added a linter rule to catch stray
console.log
messages in JS- I thought this was on already!
- Added clearer log messages from my mock datastore implementation
- I find it helpful to know a “not implemented” error is coming from a mock test class instead of a real API.
- Updated to the latest version of TipTap’s rich text editor
- Allowed me to delete this hacky workaround for an old bug
- Deleted old, unused Firestore key constants
mtlynch.io
- Migrated from Google Firebase to Netlify
- This is part of my recent campaign to de-Google, as I’m finding that there are better alternatives for most GCP services, and I want to be more platform-agnostic.
- Made some tweaks to take advantage of Netlify’s publish drafts feature
- I was hardcoding the mtlynch.io domain in my rendered files, so I had to make some changes to pull those out, since Netlify publishes drafts to a different domain.
- Disabled Hugo’s canonify URLs setting - don’t know why I ever had it on in the first place
- Changed nav items to use relative URLs
- Removed hardcoded baseURL from CSS routes
- Cut some cruft out of my Hugo theme
- Changed plausible JS script to be named script.js to evade ad-blockers
- I’m probably going to get rid of all the evasion next month because it feels user-hostile to reject a user’s ad blocker, but it was a fun technical exploration.
- Upgraded to Hugo 0.89.4
- Switched to Hugo’s new syntax for embedding tweets
LogPaste
- Migrated to Alpine Docker image
- Brings the image size from 53 MB to 16 MB
- I kept trying to do this before, but I’d get confusing errors about libc not being available even thought I was building to not require libc.
- I missed the fact that Litestream depended on libc, but there’s a binary release that doesn’t.