Update for the week ending on Friday, Feb 25, 2022
TinyPilot
Management
- Reviewed two new vendor contracts
- Prepared agenda for design contractor kickoff call
- Explored different platforms for paying international freelancers
- Right now, I’m paying three freelancers using three distinct payment methods
- Now that I’m hiring a fourth, I’m looking for a unified solution
- Options I checked
- Deel: Looks the nicest but is most expensive. Natively supports time-tracking, so people don’t have to track in a different tool and copy over. Setup was pretty quick. They would have the distinction of having the dumbest domain name of any of my services.
- Pilot: Seems pretty nice platform, but I’ve been waiting a week for them to activate my account
- Remote: Is free for paying contractors, which makes me feel like they’re surreptitiously profiting off the conversion fees or that they don’t really care about customers like me and can drop me if they ever feel like it
- Right now, I’m paying three freelancers using three distinct payment methods
Hiring
- Continued onboarding TinyPilot’s first Support Engineer
- Added more onboarding docs to answer questions I realized I missed initially
- Created a Support Engineers internal mailing list
- Continued screening Support Engineer candidates
- I’m now telling candidates that I’m running a trial hire, and they can either answer my screening questions now, and I’ll consider them if the trial hire doesn’t work out or I hire a second engineer or they can pause their application and I’ll reach out if things don’t work out.
- Updated the job posting to make it more obvious that I’m personally reading every application.
- I’m getting so many cover letters that seem to be directed to an HR department, and I want to convey that I’m a small company, and they’re talking directly to me.
- Stats so far
- Total applications: 198 (+23 from last week)
- Unreviewed applications: 32 (-8 from last week)
- Hard rejected at cover letter/resume stage (no letter or didn’t meet requirements, so I didn’t send a response): 116 (+20 from last week)
- Soft rejected at cover letter stage (they sent a detailed note, so I sent a personalized note back): 36 (+6 from last week)
- Passed cover letter/resume screen, pending sample question responses: 2 (-1 from last week)
- Rejected at sample question stage: 11 (+6 from last week)
- Trial hire: 1
Customer support
- Rewrote software update instructions that were embarrassingly out of date
- Added a short article about discovering when new software updates are available
- Hid setup instructions for old products from the support page
Product research
- Continued working with EE partner on Voyager 2 PoE launch
- Updated Voyager 2 assembly documentation
Sales
- Wrote draft of blog post to announce TinyPilot Voyager 2 PoE
PicoShare
PicoShare is a minimalist web-based file sharing tool I’m working on. I’m often frustrated that I can’t just send someone a link directly to a file because every file-sharing service tries to re-encode images/video or wrap their own viewer around other files, so I’m making a simple self-hostable tool that lets you upload files and share them with other people.
- Started using PicoShare for real!
- I deployed a TinyPilot PicoShare instance and used it to share a video with a customer.
- I deployed a personal PicoShare instance and shared a 163 MB file with my mom
- Using it for real revealed two big bugs
- I didn’t handle seeking, so you couldn’t jump to a later position in web-streamable video or audio files
- This turned out to be an easy fix: the built-in
http.ServeContent
API does everything I need
- This turned out to be an easy fix: the built-in
- I never considered memory efficiency, so PicoShare required 4-5x the uploaded file’s size in RAM
- This is going to be a harder fix, as I want to store all file data in SQLite
- As a first step, I stopped redundantly copying file data on every function call
- I didn’t handle seeking, so you couldn’t jump to a later position in web-streamable video or audio files
- Added support for uploading files and specifying an expiration time
- Currently, expiration just means they stop being accessible by other users, but they still exist on the server
- I still need to implement garbage collection to periodically purge expired files and claim back the disk space
- Added a file index view
- Added support for deleting files from the web UI before expiration
- Mostly finished documenting how to deploy PicoShare to fly.io
- Configured PicoShare to use a fly.io persistent volume
- Otherwise, all the data would disappear on each new deploy
What Got Done
- Realized that now that I’m using SQLite, I can stop using mock database implementations
- I started the mock database implementations so that I could run unit tests without a dependency on Google Firestore (a remote, hosted service)
- When I switched to SQLite, I kept the mock, in-memory datastores because I didn’t want to hit the filesystem in my unit tests, but I just realized you can specify a SQLite path as
:memory:
and it will create an ephemeral, in-memory database - Refactored the SQLite code to accept a path parameter instead of hardcoding the DB path
- Rewrote draft handler tests to use SQLite instead of a mock database
- Rewrote user handler tests to use SQLite instead of a mock database
Lenny
Lenny is a tool I’m working on that will respond to templated emails I get from spammy marketers and recruiters with a sequence of templated responses to ask the spammers an endless series of dumb questions.
- Added a command-line flag for specifying the database path
- Got rid of mock, in-memory datastore
- Added matching for another spammy guest post pattern
Zestful
- Fixed a bug a user reported in matching “whole milk” to the USDA food database
- Documented how to use the convenience scripts that I wrote 2 years ago and forgot about.
Dusty VCR
- Recorded Episode 21: Big w/ Vally D and Matt Woodland
- Started editing episode 21
Misc
- Baked a chocolate tort