's updates for tinypilot

For the week ending Friday, May 17, 2024

  • Completed moved out of TinyPilot office.
  • Closed another unused TinyPilot credit card.
  • 1:1 with Scott

For the week ending Friday, May 10, 2024

  • Started closing old bank accounts

For the week ending Friday, May 3, 2024

  • Prepared the office desktop
  • Documented internal flow for Enterprise API

For the week ending Friday, Apr 26, 2024

  • Led dev team meeting
  • Led support eng team meeting
  • Attended customer service team lunch
  • Filed BOI report with FinCEN (required apparently?)
  • Canceled office lease
  • Tested touch support on Microsoft Surface laptop

For the week ending Friday, Apr 19, 2024

  • Made sure Bitwarden credentials are up to date

For the week ending Friday, Apr 12, 2024

Management

  • One 1:1 with teammate
  • Paid North Carolina sales tax
  • Paid Massachusetts sales tax

Sales

  • Updated TinyPilot’s about page to be less me-focused

Misc

  • Wiped data from old test laptops
  • Brought some old equipment I was storing at home into TinyPilot office

For the week ending Friday, Apr 5, 2024

Management

  • Led dev team meeting
  • Had a 1:1 with a teammate
  • Did monthly bookkeeping

Software development

  • Decommissioned old Firebase hosting
  • Decommissioned old AWS hosting
  • Refactored script for enabling git hooks

For the week ending Friday, Mar 29, 2024

Management

  • One 1:1 with teammate
  • Continued fleshing out our new RMA process
  • Finished documenting release tasks based on last release
  • Deactivated an old mailing list

Software development

  • Migrated TinyPilot’s LogPaste server from AWS Lightsail to Fly.io
    • It was our only AWS service, so it made more sense to have it in Fly.io instead
    • Seems like it was a smooth transition
  • Updated CircleCI context settings to match our release process

For the week ending Friday, Mar 22, 2024

Management

  • Met with TinyPilot’s lawyer
  • Worked with 3PL on fixing a billing issue
  • Coordinated with team and contract manufacturer on handing return processing over to our manufacturer
  • Had three 1:1s with teammates
  • Had monthly lunch with local team
  • Worked with team to clear obsolete pages from Notion

Software development

  • Worked with team to move all of our critical secrets on CircleCI to contexts with expression-based restrictions
    • Previously, allowing someone to initiate a CI pipeline effectively gave them the ability to access all secrets in that pipeline
    • With expression-based restrictions, we can say that certain secrets are only available in our main branch and not available when the job runs with ssh
    • We also require approval on all of our PRs into the main branch, so someone could go rogue and steal secrets, but they’d have to convince at least one teammate to conspire, and there’d be a clear record of it in the commit history
  • Added CI job to check for bash lint on TinyPilot website repo

Customer support

Sales

  • Worked with EU distributor on sales forecasting

For the week ending Friday, Mar 15, 2024

Management

  • Continued preparing reports for TinyPilot
  • Finished internal guide to writing security advisories
  • Sent guide to writing release announcement blog posts out for review
  • Continued working with our manufacturer on transferring our RMA process

Software development

  • Ported the TinyPilot website from Firebase to Netlify
    • I’d wanted to do this for a while because, in general, Google is a pain to deal with, but we ran into something that was easier to do with Netlify than Firebase, so it felt time.
    • Stupidly, I did this at 9am on a Thursday, so users saw TLS warnings for a few minutes.
      • I still don’t totally understand why this happened. I expected that if DNS caches still had the Firebase address, Firebase would continue happily serving its copy of the site with a valid TLS cert, but somehow, changing the DNS entries seemed to invalidate Firebase’s TLS cert immediately.
      • As a workaround, I configured Firebase to redirect to a tinypilotkvm.com subdomain that I’d created the day before for testing, so it was a little weird, but better than users seeing a TLS error when they tried to hit the sales site.
      • After an hour or so, everything seemed back to normal
    • Netlify’s config is in .toml format, whereas Firebase was .json, so it’s very nice being able to add inline comments to explain why configuration options are the way they are.
  • Deleted a bunch of obsolete redirects from the TinyPilot website
  • Ported some website E2E tests from Cypress to Playwright

Sales

  • Resumed sales for refurbished devices
  • Tested reaching out to users who had abandoned their carts
    • One reply said he purchased on Amazon, but seemed warm to the outreach

For the week ending Friday, Mar 8, 2024

Management

  • Continued preparing reports for TinyPilot
  • Did monthly bookkeeping
  • Got process unstuck for refurbished devices
  • Started preparing for retrospective on last release
  • Documented how to share new release images with our partner companies

Software development

  • Worked with team on process to announce new release to mailing list subscribers
  • Worked with team to announce new release on Twitter
    • We had to work around a bug with Twitter delegated accounts

Sales

  • Gave feedback on edits to our Raritan comparison page.

For the week ending Friday, Mar 1, 2024

Management

  • Continued creating financial reports for TinyPilot
  • Worked with team on revising our RMA policy
  • Met with TinyPilot’s lawyer
  • Had a 1:1 with teammate
  • Integrity tested microSDs from our manufacturer

Software development

  • Reviewed a security advisory
  • Helped with publication of TinyPilot Pro 2.6.3
  • Continued documenting our release process
  • Began compiling material for a release process-improvement discussion

Sales

  • Suspended sales of refurbished Voyager devices

For the week ending Friday, Feb 23, 2024

Management

  • Continued preparing financial documents for TinyPilot
  • Started reviewing a new contract for TinyPilot
  • Continued working with team and manufacturer on transferring our return process to the manufacturer
  • Had 1:1 with a teammate

Software development

  • Continued documenting TinyPilot’s release process
    • I realized I’d been kind of “cheating” by privately making last-minute ship/release decisions when we encounter bugs during pre-release testing, and I’ve never defined the decision-making process
  • Worked on improving TinyPilot’s release scripts
  • Worked on improving TinyPilot’s static IP feature
  • Supported release tasks for 2.6.3 release
  • Moved Ansible role for internal testing laptop to a team repository
  • Started transitioning the team LogPaste server to Fly.io
  • Updated team PicoShare server to 1.4.2

For the week ending Friday, Feb 16, 2024

Management

  • Continued preparing financial reports for TinyPilot
  • Three 1:1s with teammates
  • Documented more of TinyPilot’s release process
    • Documented how to write changelog updates
    • Started documenting how to write blog post release announcements
    • Started documenting how to write security advisories

Software development

  • Tested our new release script
    • I used to publish releases through the Github UI, but it’s more repeatable as a script anyone can run

Customer support

  • Removed dead links on TinyPilot website to the /r/tinypilot subreddit

Sales

  • Switched our mailing list from EmailOctopus to Buttondown

For the week ending Friday, Feb 9, 2024

Management

  • Prepared financial reports and tax documents for TinyPilot
  • Started documenting the parts of the TinyPilot Pro release process that I’ve been doing myself
    • I had felt like I eliminated a lot of the Michael-only parts, but I’m challenging myself this release to remove myself and see if it can happen without me, and I’m realizing a lot was still silo’ed in my head.
  • Continued working on RMA process
  • Led dev team meeting
  • Led support engineering meeting
  • Had two 1:1s with teammates

Software development

  • Adjusted our Playwright tests to increase parallelism in tests on the TinyPilot website
    • Weirdly, they all worked fine in CI when it was in the PR, but after we merged it, the tests all started timing out
  • Adjusted the UI text slightly in our new static IP dialog
  • Weighed in on release architecture discussions
  • Added dev-internal instructions for viewing our UI style guide
  • Reviewed improvements to our microSD integrity check scripts
  • Added an optional Nix flake for development work on our update server
  • Documented how to manually test new static IP feature in our e2e tests

Customer support

Sales

  • Offered refurbished devices on sale again
    • There seems to be a lot less enthusiasm from customers because this time around, they’re a revision behind, so I had to list all the reasons why they’re not as good as our retail versions.
  • Switched mailing list from EmailOctopus to Buttondown
    • EmailOctopus has been stagnant or degrading in many respects, whereas I’ve been impressed with Justin Duke’s work and his product
  • Ordered more of a critical part
    • But then it ended up a bit of a snafu
    • Still working on smoothing out the process for this part

For the week ending Friday, Feb 2, 2024

Management

  • Prepared TinyPilot financial reports
  • Worked with teammate on designing an RMA process for our manufacturer to work with us on
  • Improved order process for Raspberry Pi
  • Unsubscribed
  • Gathered data for 2023 taxes
  • 1:1 with teammate
  • Did inventory planning

Software development

  • Documented how to upgrade TinyPilot’s PicoShare instance.
  • Weighed in on a PR about how to prevent open redirects

Customer support

  • Updated documentation about how to handle

Sales

  • Made more progress toward switching from EmailOctopus to Buttondown for TinyPilot’s mailing list
  • Offered TinyPilot to a blogger
  • Launched TinyPilot on EthicalAds
  • Contracted with our marketing specialist for a review of our Google Ads account
  • Checked affiliate payments for December (none)

For the week ending Friday, Jan 26, 2024

Management

  • Gathered financial reports for TinyPilot.
  • Had three 1:1s.

Software development

  • Weighed in on dev work to handle redirects after login.
  • Deferred work on license key checking and shuffled around tasks to replace it
  • Reviewed change to location of libwebsockets license URL
  • Upgraded Node.js version on website

Customer support

  • Updated a couple of support pages to avoid hardcoding C: in Windows instructions.
  • Deleted some old versions of product instructions
    • Last time I tried this, a week later, a customer emailed me saying they just got around to opening their box from two years ago and wanted to know where the instructions were, so hopefully everyone from 2020-2021 has completed their initial setup.

Sales

For the week ending Friday, Jan 19, 2024

Management

  • Paid North Carolina sales tax
    • It took me four hours this quarter to pay $350 in taxes…
  • Sent W9 forms to my accountant
  • Started planning for our contract manufacturer to take over returns processing

Software development

  • Added a convenience script for searching the TinyPilot database
  • Wrote clearer instructions for populating our .env files.
  • Provisioned access to a storage bucket for a new, experimental development workflow

For the week ending Friday, Jan 12, 2024

Management

  • Led monthly dev team meeting
  • Led monthly support engineering meeting
  • Continued fleshing out process for customer outreach
  • Continued fleshing out process for manufacturing spot checks
  • Had four 1:1s with team
  • Met with accountants for R&D tax study for 2023
  • Paid estimated state and federal taxes for 2023Q4
  • Paid 2023Q4 sales tax

Software development

  • Reviewed changes to our internal microSD integrity checking script

Sales

  • Met with a large engineering firm customer
  • Started exploring ads on EthicalAds
  • Began sponsoring HomeNetworkGuy
    • Just text posts for now. We’ll see how they perform and then maybe switch to graphical ads.
  • Increased renewal price on TinyPilot Pro from $79/month to $99/month
    • A customer requested a discount on our $79/month price, and I realized I felt like $79 was too low to begin with. It’s the first price increase since we launched TinyPilot Pro in 2021.
  • TinyPilot had its biggest single-day sales revenue of all time at $16.9k

For the week ending Friday, Jan 5, 2024

Management

  • Started working with accounting firm on 2023 R&D tax study
  • Began work on process to spot-check manufacturing issues as batches arrive to our warehouse
  • Did capacity planning for 2024

Customer support

  • Experimented with using Vale for automatically linting prose on our docs site
    • Results look bad so far, as it seems impossible to get it to catch anything without also flagging 5x as many false positives

Sales

  • Met with a customer interested in a large purchase.
  • Reached out to two bloggers about collaborations.
  • Paid TinyPilot affiliates.

For the week ending Friday, Dec 29, 2023

Management

  • Caught up on emails while I was out.
  • Had a 1:1 with teammate.

Software development

  • Investigated whether we can avoid a reboot on our static IP feature.
    • We’ve been requiring a reboot to apply the static IP, but I suspect the reboot is not necessary, and there’s something lighter weight we can do to apply networking changes.

For the week ending Friday, Dec 22, 2023

Management

  • Continued working with manufacturer on shipping for a critical part
  • Collected W9s from vendors

Software development

  • Offered suggestions for getting network boot to work in our dev workflow
  • Helped debug issues around new static IP feature

Customer support

Sales

  • Started a first draft of a promotion to give away TinyPilot Voyager 2a devices to bloggers

For the week ending Friday, Dec 15, 2023

Management

  • Had three 1:1s with teammates
  • Started gathering W-9 forms from some of TinyPilot’s vendors

Software development

  • Tested upcoming static IP address feature and filed bugs about gaps in behavior
  • Brainstormed ways to debug rpi-imager
    • We want to boot a custom Pi image from cloud storage, but we’re having issues getting it to work with the Pi bootloader

Customer support

  • Gave feedback on instructions for enabling TinyPilot’s WiFi AP

Sales

  • Worked with EU distributor on new pricing following shift to contract manufacturer

For the week ending Friday, Dec 8, 2023

Management

  • Led dev team meeting
  • Met with critical supplier
  • Met with EU distributor
  • Prepped for an annual employee review meeting
  • Updated our insurance policy to cover our 3PL warehouse
  • Did holiday shopping for vendors
  • Gave feedback on new 3PL vendor option

Software development

  • Weighed in on a UX bug around representing bit rate settings to users who might not recognize the term.
  • Gave feedback on process to do development with HTTP boot server

Customer support

  • Reviewed new documentation on TinyPilot log files

Sales

  • Gave feedback on customer outreach
    • Slightly revised our process to invest more in customers where we have a good chance of reaching end-users

For the week ending Friday, Dec 1, 2023

Management

  • Had three 1:1s with teammates
  • Arranged R&D tax study for 2023
  • Complained to the IRS about the fact that I have to pay $6k for a tax study every year to run a small business that depends on software
  • Planned how to handle in-limbo devices
    • We did a minor revision on the Voyager 2a in November with the switch to the contract manufacturer, but now when we get returns from pre-revision, it’s confusing what to do with them.
    • We decided to treat even brand new ones as “refurbished” and only sell them that way
  • Picked a strategy for virtual mailboxes as an office alternative

Software development

  • Ported an end-to-end test on the website from Cypress to Playwright
    • Our website’s end-to-end tests take 2m15s on Cypress, and I suspect I could bring them down to about 45s if I port them to Playwright
    • The main difference is that Playwright natively supports parallel tests, whereas Cypress is all serial in the open-source version

Office move-out

  • Moved office PoE rack switch from my office to my home rack

For the week ending Friday, Nov 24, 2023

Software development

  • Weighed in on dev discussion of where to store TinyPilot’s application state
    • We’ve ended up splitting state between SQLite and a YAML file.
    • The YAML file was mainly there for compatibility with Ansible, but now that we’ve dropped Ansible, we’re trying to figure out whether to stick with YAML, port to SQLite, or maintain both.
  • Weighed in on UI consistency issue
    • We use a mix of “Close,” “Cancel,” and “Back” in our dialogs, and we’re not consistent about how we use them or what rules we follow in choosing, so we had to figure out what our plan is.
  • Reviewed fixes to our microSD integrity checking script.
  • Ported one of the TinyPilot sales website’s end-to-end tests from Cypress to Playwright

Sales

  • Responded to a customer about a large potential order

For the week ending Friday, Nov 17, 2023

Management

  • One 1:1 with teammate
  • Resolved a payment failure with my landlord
    • Mercury, who usually does a good job, declined a rent check I paid to TinyPilot’s office landlord
    • It took several hours to figure out what was going on because apparently the bank receiving a check doesn’t have any information about why a check failed processing
    • I thought for sure it was my landlord’s bank, but then Mercury got back to me and confirmed it was their fault
    • Fortunately, my landlord was very understanding and appreciated me resolving it quickly
  • Prepared for travel

For the week ending Friday, Nov 10, 2023

Management

  • Worked on resolving a shipping export issue with one of our vendors
    • They’re saying that they can’t ship to our new manufacturer in Vietnam because their product isn’t yet certified for sale in Vietnam
    • We’re only manufacturing in Vietnam and exporting back out, so a certificate for sale shouldn’t be required
    • They’re saying their company policy is only to ship to countries where they’re already certified for sale.
    • This adds a wrench in the gears because we need this vendor, and our manufacturer can’t build our product without this part
    • Had a call with our manufacturer and the vendor, and the manufacturer sent over paperwork explaining that they’re allowed to import raw materials as long as they export them again in finished products, and the vendor is going to see if they can work with us.
    • If the vendor won’t budge, we have a feasible plan B, but I’m hoping we can find a simple solution.
  • Led monthly dev team meeting
  • Led monthly support eng meeting
  • Announced TinyPilot’s package changes to team
  • Worked with local team to minimize the number of days TinyPilot Voyager 2a USB-C was sold out
    • I thought it would be a week, but we were able to limit it to just 36 hours
  • Worked with my landlord about a rent check that came back “unprocessable”
    • I’ve never seen this before, but hist bank just sent him back my check and said “Unable to process”
    • The check was well below the balance I’ve held for the last year, so it shouldn’t have bounced
    • His bank had no details, and they said I had to ask my bank, so now I’m waiting on my bank
    • My guess is that my landlord may have accidentally tried to deposit the same check twice
  • Sent September affiliate payments
  • Reviewed plans for clearing office inventory
  • Decommissioned our old inventory service
    • We were paying $80/mo, but now that we don’t manufacture in our office, we can simplify to a spreadsheet

Software development

  • Cut release for TinyPilot Pro 2.6.2
    • Reviewed changelog
    • Reviewed release announcement blog post
  • Wrote a style guide for the changelog
    • I’d been writing all of the entries, but we tried having someone else do it this release, and I’m realizing I was following a lot of rules that lived in my head
  • Converted some Cypress e2e tests to Playwright
  • Simplified how we install TinyPilot requirements
  • Fixed a bug in our e2e tests against a physical TinyPilot device
  • Made suggestions for improving our microSD integrity checks

Customer support

  • Handled a support request from a large customer

Sales

  • Offered answers and a call to a large prospective customer
  • Rejected a meeting request from a customer whose whole business is just collecting private data and monetizing it

For the week ending Friday, Nov 3, 2023

Management

  • Met with Walmart about listing TinyPilot on their marketplace
    • They had a pretty disappointing offering.
    • They know they’re the clear underdog to Amazon, but instead of making their marketplace more attractive to merchants, they’re copying everything Amazon does, including all the obnoxious things Amazon does to abuse their dominant position.
      • Walmart forces you to answer support requests through their custom portal, which doesn’t integrate with any external CRM systems
      • They haven’t invested any serious effort into a Shopify integration
      • Their payment system is actually worse than Amazon’s in that they can’t do ACH transfer, and they hold on to your money for weeks
      • If a customer demands a refund, Walmart keeps their commission on the sale
    • Their one big advantage is that they don’t demand to have your lowest price, which is a thing Amazon forces.
  • Continued planning inspection of next batch from new contract manufacturer.
  • Dealt with issues in an international shipment for manufacturing.
  • Continued working with local team on clearing the TinyPilot office.
  • Worked with our 3PL on fixing issues around expedited shipping options.
  • Had two 1:1s with teammates
  • Continued creating a repeatable process for customer outreach

Software development

  • Firmed up priorities for next TinyPilot release.
  • Reviewed a script for verifying microSD contents when flashed by a third-party vendor.
  • Deleted dead code from our license server.

Customer support

  • Reviewed a guide on setting up TinyPilot as a WiFi access point.
  • Updated set-up instructions based on our new packaging.

Sales

  • Met with two large customers about TinyPilot feature requests

For the week ending Friday, Oct 27, 2023

Management

  • Worked with local staff to inspect first batch of Voyager 2a devices from our contract manufacturer.
    • Everything worked well on the hardware side, but the microSDs were flashed incorrectly and needed to be re-flashed at our office.
  • One 1:1 with teammate

Software development

  • Worked with support engineering team to write a script for verifying integrity of TinyPilot microSDs flashed at our contract manufacturer
  • Adjusted our update server to give a slightly clearer error message during Backblaze outages (there was a Backblaze outage today)

Customer support

  • Updated product instructions for new TinyPilot packaging
  • Updated Shopify order confirmation email template to use our new TinyPilot Pro URL
    • This closes a loophole that allowed customers to download updated versions of TinyPilot Pro after their licenses expired

Sales

  • Worked with customer on a bulk order
  • Continued coordinating planning for ramping up customer outreach

For the week ending Friday, Oct 20, 2023

Management

  • Worked with contract manufacturer on getting first batch unblocked
  • Worked with Raspberry Pi on resolving incorrect customs information
  • Spoke with Shopify’s tax team about improving experience for North Carolina’s taxes
  • Continued working with local staff on process of liquidating office leftovers
  • Two 1:1s with teammates

Customer support

  • Consolidated two separate pages with information about downloading TinyPilot Pro

Sales

  • Made minor adjustments to TinyPilot product page

For the week ending Friday, Oct 13, 2023

Management

  • Filled out management questionnaire with consultant
  • Met with accountant about tax changes related to TinyPilot going fully remote
  • Led monthly support engineering meeting
    • It was only 15 mins because there are so few support issues lately.
    • I need to plan a bit more what we can discuss productively during quiet periods of support.
  • Had an annual review with one teammate
  • Paid quarterly sales tax for Massachusetts and North Carolina

Software development

  • Expanded automated end-to-end test for authentication
    • This was fun to get done because it eliminates a particularly tedious step in our manual pre-release QA process.
  • Reviewed an improved error dialog for certificate validity errors
  • Fixed a typo in uStreamer

Customer support

  • Reviewed proposals for re-categorizing our FAQ page
    • It’s been a long time since we re-evaluated the categories, and we felt like we can come up with more intuitive categories that surface the most viewed content earlier

Sales

  • Answered an inquiry from a large customer

Office move-out

  • Wrote a loose tutorial for selling leftover things on eBay

For the week ending Friday, Oct 6, 2023

Management

  • Worked on owner questionnaire.
  • Continued working with contract manufacturer on first production batch.
  • Sync’ed with EU distributor on long-term company plans.
  • Decommissioned accounts for temporary employee whose role wrapped up.

Software development

Customer support

Sales

  • Paid TinyPilot affiliates.
  • Increased price of refurbished Voyager 2a devices
    • I originally priced them 40% off because we were expecting to move out by end of October
    • We decided to stay until December, so we don’t have to sell them as fast, so I reduced the discount to 25%.
    • They seem to sell at about the same rate, so maybe 40% was too aggressive anyway.
  • Checked Google Merchant Center
    • I was complaining last week about how they made me fill out a bunch of information and then told me I was out of compliance, and it was a huge waste of time.
    • I ended up disabling support for every country except for the US, and then it worked and stopped complaining about me not offering a South Korean currency.
    • I now show up in Google Shopping results, so we’ll see if that does anything.
    • Their analytics claim they delivered me 9 clicks.

For the week ending Friday, Sep 29, 2023

Management

  • Sent email to team about plans for company future
  • One 1:1s with teammates
  • Had an annual review meeting
  • Continued working with contract manufacturer on second sample
  • Added clearer guidance on how the customer service team should escalate to the support engineering team
  • Reached out to our 3PL to find out why UPS isn’t showing up as a shipping option
  • Fixed an issue with TinyPilot’s Mercury credit cards
    • They for some reason changed out credit limit to $0 and never told us
  • Tried to find a way to let a teammate request Amazon payment disbursements
    • Amazon will only let the primary account holder request disbursements
    • Further crappy behavior from Amazon: all other marketplaces automatically disburse funds after a day or two. Amazon will only do that after weeks, and the only way to get it faster is for the root user to log in every day and manually request disbursement of each type of fund.

Software development

  • Reviewed design of static IP feature
  • Added end-to-end tests to cover some functionality of authentication features
  • Reviewed investigation into a better dev workflow for testing TinyPilot microSD images

Customer support

  • Reviewed new playbook entry for diagnosing a defective Ethernet port
  • Tidied up the guidance on the audio FAQ
    • It had a note about customers who purchased before Feb. 11, 2023 and haven’t upgraded, and I feel like those customers have all upgraded by now, so it was wasting real estate.
  • Officially declared TinyPilot Cloud as paused indefinitely.
    • This really happened a long time ago, but updating the blog post was never the priority.
    • Customers occasionally ask about it, so I updated the blog post to say it’s no longer moving forward.

Sales

  • Kept pinging our Amazon account rep to help with our listings getting downranked
    • After 5 emails, he said he can’t help unless I join FBA
      • Translation: “We’re treating you like crap now, so why don’t you trust us with tens of thousands of dollars of your merchandise and see how we treat you then?”
    • Oddly, our listings are back again
  • Signed up for Google Merchant Center
    • Seems to be a huge waste of time
    • It keeps deleting my information and it shows me that there are a bunch of errors that prevent them from listing my products, but then they don’t show me how to fix those errors.
  • Signed up for Powered By Pi
    • This ended up being kind of silly. I mainly did it for the backlink from Raspberry Pi, but it turns out they link all the partners with nofollow, so it’s not useful for SEO.
      • I easily could have checked this before signing up, but I didn’t think of it.
    • But now I’m listed, which is nice.

For the week ending Friday, Sep 22, 2023

Management

  • Evaluated first article samples from contract manufacturer
    • Sent a list of issues discovered
    • There were more issues than I was expecting, but I’m hoping they’re process things we can fix.
    • As a result, I extended our lease another two months so we have secondary options for auditing the manufacturer’s work.
  • Led monthly support engineering meeting.
  • Wrote clearer documentation about how customer service escalates to support engineering.
  • Adjusted our process for communicating with our 3PL.
    • They keep dropping the rest of the team from threads, so we’re going to use a new HelpScout mailbox.
  • Had two 1:1s with teammates.
  • Met with lawyer.
  • Fleshed out wind-down plans for teammate on short-term employment.

Software development

Customer support

  • Fired a customer who was being excessively demanding on their first order.
  • Added a troubleshooting step to the audio streaming FAQ.

Sales

For the week ending Friday, Sep 15, 2023

Management

  • Continued working with contract manufacturer on first article sample
  • One 1:1 with teammate

Software development

  • Provided secondary review on a few PRs that were in progress

For the week ending Friday, Sep 8, 2023

Management

  • Worked on getting a shipment to our contract manufacturer unstuck from customs
  • Had two 1:1s
  • Did monthly bookkeeping

Software development

Customer support

  • Reviewed internal docs about reading TinyPilot logs

Sales

  • Reviewed affiliate sales for July

For the week ending Friday, Sep 1, 2023

Management

  • Reviewed sample AC adapters from contract manufacturer
  • Wrote guidance for how the support eng team should manage the task queue.
  • Checked with contract manufacturer about an RMA process post-transition.

Software development

Sales

  • Answered feature requests from a customer considering a large order.

For the week ending Friday, Aug 25, 2023

Management

  • Continued working with suppliers to move manufacturing to contract manufacturer
  • Sent a move-out plan to the local team for transitioning out of the local office
  • Three 1:1s
  • Provided support for a manual end-to-end test
    • A new team member was doing it, and it turns out that our documentation left a lot out, but nobody realized because the same three people have been doing it for 12+ months.

Software development

  • Rebalanced tasks for current release
    • We caught a series of tasks that turned out to be way more complex than they first appeared, so we had to punt some to a future release.
  • Realized that CircleCI’s ARM64 instances can natively compile ARMv7 (32-bit ARM) code.
    • For some reason, I never tested it, and I always assumed you’d need ARMv7 to compile ARMv7 without emulation.
    • We’ve been using AMD64 VMs and QEMU emulation of ARMv7, which is so slow that we had to add logic to the build so it only ran on the master branch.
    • With ARM64 VMs, we can compile ARMv7 binaries in about 25% of the time, fast enough that we can cut out the conditional logic of which branch to build on.
  • Reimplemented uStreamer Launcher using Debian packaging instead of Ansible.
    • This is part of my ongoing effort to undo my terrible mistake of designing TinyPilot’s installation around Ansible.
    • It cuts out a good amount of complexity just by moving from Ansible to Debian.
    • I also realized we could cut out more complexity by making the code less configurable, as we were limiting ourselves by offering configurability that nobody needed.
    • I also learned about the -ef test in bash conditionals, which says if two paths point to the same file (e.g., with symlinks) like if [[ /path/to/a -ef /symlink/to/a ]]; then ... fi
  • Helped debug a tricky bug around threading in processing websockets requests
  • Reviewed simplification of boot settings
  • Reviewed simplification of H264 parameters

Customer support

For the week ending Friday, Aug 18, 2023

Management

  • Two 1:1s with teammates.
  • Found tasks for local staff to work on while we’re waiting on shipments of Raspberry Pis.
  • Investigated a billing discrepancy with my EU distributor.
    • Ended up being my fault.

Software development

For the week ending Friday, Aug 11, 2023

Management

  • Led support engineering meeting.
  • Continued working with contract manufacturer on transition of manufacturing.

Software development

  • Removed some effectively dead code from the uStreamer Ansible role.
  • Removed an unnecessary git install from a CI step.
  • Reviewed deletion of ustreamer_port Ansible role variable.
    • Easier to just hardcode it and limits confusing configuration states.
  • Reviewed a PR to move localhost-only ports to less frequently used ports.
    • These ports used to be user-configurable, but since we dropped support for that, we want to move to ports that are less likely to collide with other services the user might want to install.

Customer support

Sales

  • Fixed quality on the first demo on the TinyPilot website.
    • It was previously a smaller GIF that had a lot of compression artifacts.
    • I was defining a work item to reproduce it, and I realized that we still had the original capture, so I made it a streamable MP4 instead.

For the week ending Friday, Aug 4, 2023

Management

  • Two 1:1s
  • Continued working with contract manufacturer on taking over manufacturing
    • Evaluated prototype cables
    • Reviewed design changes
    • Wrote QA process
    • Reviewed instruction cards
    • Reviewed shipping boxes

Software development

  • Defined some detailed bugs for Ansible to Debian refactoring
  • Investigated tools to make flashing new images onto a Raspberry Pi easier
    • Obviously, this is a big pain point in TinyPilot development
    • I’m forever in search of a better way to replace the image on a Raspberry Pi without having to physically swap microSDs.
    • I tried iventoy, but it didn’t handle .img files and seemed like a weird solution overall.
    • I discovered cmprovision, which is an official Raspberry Pi tool, but it’s quite strange. It expects to manage an entire network subnet, and you have to access the interface specifically over WiFi.
    • It’s open-source, so it might be possible to adjust it to work for us.

Sales

  • Finally got a hold of my Amazon sales rep and fixed issues with our Amazon listings.
  • Arranged a new Voyager 2a review from a blogger.
  • Recovered money from a customer who seems like they were trying to commit consumer fraud with an illegal chargeback.

For the week ending Friday, Jul 28, 2023

Management

  • Two 1:1s with teammates.
  • Continued working with contract manufacturer on moving manufacturing from in-house to their facility.

Software development

  • Investigated a break in our license checking service.
    • There turned out to be a few interesting issues.
    • All of a sudden, the license check was returning “order not found” for every order.
    • The main problem turned out to be that Fly’s auto-migration somehow reverted one of our environment variables back to a placeholder value.
    • But I had trouble identifying that as the problem because it turned out that our service was swallowing errors when it tried to call Shopify’s GraphQL API.
    • We were calling Shopify via a Go http.Client and checking the error code of the Do method, but we forgot to also check the HTTP status code of the response, so we didn’t notice that it was failing. It ended up looking equivalent to “succeeded but returned 0 results.”
    • And then even after we added a check there, we were swallowing the error at another layer because we check multiple backends (different sales channels that could have created the order) to see if they recognize an order. For a valid order, we expect all of backends to fail except for the one backend that knows about the order.
    • So we had to adjust the logic there to say, “If you fail to find a matching order, and one of the backends reported an error other than ‘can’t find the order’, then bubble up the error.”
  • Reviewed documentation on migrating our Ansible roles to Debian packages.
  • Reviewed an update to TinyPilot’s pre-made image for better fan control.
  • Documented my weirdo-minimalist way of managing Python packages
  • Reviewed an update to our UI style guide around width for input fields
  • Reviewed PR that made implicit pip dependencies explicit
  • Reviewed a bugfix on input validation for the hostname field
  • Reviewed a re-sorting of our depenencies

Customer support

  • Reviewed new FAQ about bringing your own TLS key
  • Updated our invoice templates to include the customer’s email address.
    • We got a small bump in support emails recently from people who use multiple email aliases and had forgotten which one they used to purchase.
      • For example, they have both john@example.com and john.smith@example.com, so they see the order confirmation in their john@example.com mailbox and assume that’s what they used to order.
      • Now, if they have their invoice, hopefully they’ll see the email address on the invoice and realize which one they used for the order.

Sales

  • Sent a review unit to a blogger.

For the week ending Friday, Jul 21, 2023

Management

  • Two 1:1s with teammates

Software development

Customer support

  • Reviewed support article about bringing your own TLS keys
  • Revised installation instructions for TinyPilot Community
  • Continued fighting with Amazon on a $1k refund
    • Warehouse sent the customer USB-C units instead of PoE units
    • Customer asked us to replace it with the correct PoE units
    • Amazon auto-refunded the customer because they saw them ship a return back to our office…
    • I created a support case, and they rejected it because, “You listed the item against a detail page that it did not exactly match. When you list an offer, it must exactly match the brand, manufacturer, UPC, model number, edition, quantity, packaging, and color of the product on the detail page.”
      • I’ve appealed because it’s crazy that the customer would get to keep $1k worth of merchandise for free because we sent the wrong item the first time.

For the week ending Friday, Jul 14, 2023

Management

  • Led TinyPilot support engineering meeting
  • 1:1 with local teammate
  • Paid MA sales tax
  • Tried to pay NC sales tax but got locked out.
    • It turns out that when an organization can arrest people for not completing their web form, they don’t put much effort into making the web form easy to use.
  • Reviewed process for auditing 3PL’s inventory.

Software development

Customer support

  • Updated guidance about copy/pasting text from previous HelpScout messages
    • Clarified that if we’re copy/pasting from old emails, we should be creating official responses in our playbooks instead

Sales

  • Tried sending license expiration notices to customers whose TinyPilot Pro license recently expired
    • A lot of our customers don’t notice when their license expires, but then they’re surprised and frustrated if they need to factory reset and find that they’ve lost access to their image.
    • Of seven customers, zero have re-subscribed so far, so small sample, but not promising yet.

For the week ending Friday, Jul 7, 2023

Management

  • Had two 1:1s with teammates
  • Continued working with EU distributor on transition to contract manufacturer

Software development

Customer support

  • Documented for teammates how to add arrow indicators to screenshots.
  • Reviewed internal documentation on reading TinyPilot logs.
  • Reviewed internal documentation for doing monthly 3PL audit.

For the week ending Friday, Jun 30, 2023

Management

  • 1:1 with teammate.
  • Met with EU distributor.
  • Discussed new pricing with distributor after we switch to a contract manufacturer.
    • We’re shifting work from the distributor to the contract manufacturer, so we have to figure out how it impacts prices.
  • Got up to date with invoices for EU distributor.
  • Redefined the release testing process to delegate some tasks that were previously Michael-only
  • Ordered raw materials

Software development

Customer support

  • Revised TinyPilot Pro license check page
    • Customers were emailing us asking for an image download for purchases 2+ years ago not realizing that their licenses had expired.
    • The problem was that the download page only explained that licenses expire after a year after the user entered information for an expired license, but if it was so old that they no longer had their order information, they emailed us.
    • I revised the content to clarify license duration.
    • Before
    • After

Sales

  • Sent a review unit to a homelab blogger / YouTube creator.

For the week ending Friday, Jun 23, 2023

Management

  • Held first meeting with contract manufacturer and hardware consultants
  • 1:1 with local teammate
  • Created a plan for winding down inventory in MA office by November 2023
  • Coordinated with EU distributor about material deliveries
  • Did monthly bookkeeping

Software development

Sales

  • Checked in on new reviewer to verify they received everything

For the week ending Friday, Jun 16, 2023

Management

  • Three 1:1s with teammates
  • Sent a detailed email to the team about our transition to a contract manufacturer over the next several months
  • Did inventory planning for the transition from in-house manufacturing to a contract manufacturer
  • Met with my accountant and tax specialist about MA tax R&D tax credit
    • It turns out that you can’t claim an R&D tax credit in MA if you’re a single-member LLC, which means an increase in TinyPilot’s taxes by ~$6k/yr.
  • Emailed my senators to complain more about Section 174 and encouraged them to co-sponsor S.866.
  • Adjusted shipping process for our 3PL

Software development

Customer support

Sales

  • Sent a demo unit to a new YouTube reviewer

For the week ending Friday, Jun 9, 2023

Management

  • Signed with new contract manufacturer
  • Led monthly support engineering meeting
  • Met with 3PL vendor
  • Had two 1:1s with teammates

Software development

Customer support

  • Iterated on documentation for special investigations

Sales

  • Met with potential Enterprise customer

For the week ending Friday, Jun 2, 2023

Management

  • Continued working with contract manufacturer on taking over manufacturing.
  • Raised issues around communication with 3PL vendor.
  • Met with EU distributor.
  • 1:1 with local team member.
  • Met with R&D tax study specialist firm.

Software development

Sales

  • Added a license renewal option for TinyPilot Pro.
    • I think customers found it annoying that they had to buy an entirely new license every year, so I’m trying a discounted version for existing customers.

For the week ending Friday, May 26, 2023

Management

  • Met with contract manufacturer
  • Three 1:1s with teammates
  • Worked through issues with 3PL

Software development

Customer support

  • Updated the checkout page to remove the note about how our handling time is 1-3 business days.
    • Our handling time is now typically just one business day with our 3PL.

Sales

  • Worked with customer interested in placing a volume order
  • Reached out to two YouTube creators about reviewing TinyPilot
  • Followed up with a third YouTube creator I’d previously sent a device
  • Updated the TinyPilot vs. PiKVM comparison page
  • Started the process of offering a license renewal option for TinyPilot
    • Customers seem annoyed to pay the same price as new purchases, so I’m going to offer a discounted renewal option

For the week ending Friday, May 19, 2023

Management

  • Three 1:1s with teammates
  • Continued onboarding new local teammate
    • Updated processes in response to feedback
  • Met with experienced e-commerce owner for advice
  • Did customer interview with a TinyPilot vendor
  • Continued inventory planning for the next nine months
  • Worked with 3PL to offer a next-day shipping option

Software development

  • Made a proof-of-concept to pull nginx out of TinyPilot’s Ansible role
    • In continuing my long War on Ansible, I realized Ansible adds an annoying amount of abstraction on top of our nginx configuration, and we’d be better off installing it with Debian tooling.
  • Started working on a script to render Jinja2 templates with TinyPilot data
    • This is also part of the War on Ansible. We need a non-Ansible way of rendering files from templates and using user-defined settings as the data.
  • Reviewed third-party contribution for touch device support

Customer support

  • Defined a process for doing special investigations
    • I realized we needed a different process for when something is affecting several users and they want updates, and we have to coordinate internally to solve the problem.
  • Added some new entries to our customer support playbook

Sales

  • Reached out to two YouTube creators about reviewing TinyPilot
  • Reached out to two KVM resellers about carrying TinyPilot
  • Complained to Amazon that they’re hiding the buy button on our listings
    • I’m guessing this is some sort of spite algorithm because for a while, we priced our Amazon listings higher than our website, but then Amazon refuses to give back the buy button even when we cave and charge the same rate as our site.

For the week ending Friday, May 12, 2023

Management

  • Met with newest team member and started onboarding process
  • Continued capacity planning for 2023

Software development

Customer support

Sales

  • Tuned Amazon listings

For the week ending Friday, May 5, 2023

Management

  • Hired new employee at TinyPilot office
    • Held four interviews
    • Gave feedback to everyone who interviewed
    • Started onboarding new employee
    • Wrote onboarding docs for the new role
  • Terminated a software project that wasn’t working out
    • Did a postmortem meeting
  • Placed new materials orders
  • 1:1 with local staff member
  • Continued moving planning with contract manufacturer
  • Hired ad consultant to refresh TinyPilot ads
  • Did new certificate of insurance for Amazon
  • Signed paperwork for 2022 taxes

Software development

  • Announced TinyPilot Pro 2.5.4 release
  • Reviewed a PR to reimplement TLS key management without Ansible
  • Reviewed an automated end-to-end test of the debug logs dialog
  • Fix end-to-end test script on office laptop

Sales

  • Adjusted TinyPilot pricing
    • We had our highest profitability when prices were $399 base / $498 PoE, so I’m going to see if that works
    • This is a 20% drop from our $499 pricing in April

For the week ending Friday, Apr 28, 2023

Management

  • Interviewed two people for TinyPilot assistant position
    • Scheduled four more interviews for next week
    • Processed 12 other applications
  • Continued discussions with potential new contract manufacturer
  • Four 1:1s
  • Lunch with local staff

Software development

  • Cut TinyPilot Pro 2.5.4 release
    • Did a lot of manual testing for new features in this release
  • Added better CI logging for TinyPilot’s EDID
    • The EDID is a binary blob, so we can’t really store a source version in source control
    • To make it slightly less opaque, I added a CI step that decodes it into a text format so we can at least compare versions to each other from the CI logs
  • Reviewed a script for adding passwordless sudo for TinyPilot development
  • Reviewed a fix to a blank screen issue that affected Mac OS 13.3 targets
  • Make sudo requirement more obvious in enable-mock-scripts
  • Removed prefixes from error messages to better match our defined conventions

Customer support

Misc

  • Started moving my TinyPilot domains to their own DNSimple account

For the week ending Friday, Apr 21, 2023

Management

  • Published job posting for assistant role at TinyPilot office
  • Put contract manufacturer in touch with TinyPilot’s EE partner to plan how to outsource manufacturing

For the week ending Friday, Apr 14, 2023

Management

  • Requested extensions on my 2022 taxes
    • I initially owed $82.5k
    • After maxing out my SEP, I owe $62.5k
    • I paid $62.5k, which is a pain because TinyPilot only had $6k in cash profit last year
    • Fortunately, TinyPilot’s profit is a lot higher this year, so I have cash to pay
  • Split up my TinyPilot email account from my non-TinyPilot email
    • Since forever, it’s all been in a single Fastmail account, and I always wanted to split them but was too busy
    • I finally found time to split them up, and it’s much better
    • It’s much easier to disconnect from work when I don’t see both TinyPilot and non-TinyPilot emails in the same interface (even though I was using filters to split into different folders)
  • Decided to hire a third local employee
    • It seemed like we were going to be at the edge of our capacity for too long if we stick to just two people
    • I was reluctant to add a third because I don’t think we’ll have extra work for long, but I realized I could advertise it as a temporary position so the person doesn’t feel misled when the position ends in a few months.
    • I wrote up the job description but haven’t started advertising it yet
  • Met with potential contract manufacturer
  • Continued addressing process kinks with new 3PL
  • Paid quarterly MA sales tax
  • Coordinated release plans with EU distributor

Software development

  • Prepared for release of TinyPilot Pro 2.5.4
  • Mostly reimplemented TinyPilot’s virtual environment install as a Debian package instead of Ansible
    • I thought this would be trivial but it turned out to be super complicated
    • We used to do the virtualenv install at install time, but doing it in the Debian package means pushing the work to package build time
    • It means that the package is now architecture dependent because the non-pure Python dependencies are architecture-speciic, which makes the whole package architecture-specific.
  • Defined conventions for Github pull requests
  • Defined conventions for command-line flags in shell scripts
  • Reviewed changes to end-to-end test script for TinyPilot Pro
  • Reviewed instructions for users on legacy OS to upgrade
  • Upgraded TinyPilot PicoShare instance to 1.3.2
  • Exclude the .lintianignore file from the TinyPilot install bundle

Customer support

  • Continued pitching in on customer support, but officially handed it back to local staff
  • Led monthly support engineering meeting
  • Reviewed a proposal for a problem bank of common support engineering issues
  • Purchased a Mac Mini for one of the support engineers to investigate an annoying Ventura bug

Sales

  • Increased TinyPilot prices another 15%
    • We’re still struggling to catch up with demand, so this slowed sales enough to buy us some breathing room

For the week ending Friday, Apr 7, 2023

Management

  • Fully switched fulfillment over to our 3PL vendor
    • The 3PL now fulfills all standard TinyPilot orders from their warehouse instead of us fulfilling in-house from our office
  • Continued working on 2022 taxes with lawyers and accountants
  • Led monthly dev team meeting
  • Had four 1:1s with teammates
  • Scheduled a follow-up call with one of the logistics vendors I talked to last week

Software development

Customer support

  • Pitched in on customer support to give local staff more time to focus on the switch to the 3PL vendor
  • Clarify on TinyPilot product page that TinyPilot can only stream audio from the target through the browser
    • We’ve had some customers say they thought audio worked in both directions
  • Reviewed pending tutorial for upgrading TinyPilot’s OS from Buster to Bullseye

Sales

For the week ending Friday, Mar 31, 2023

Management

  • Met with three companies about improving TinyPilot’s assembly process
  • Continued coordinating TinyPilot’s transition to our 3PL
  • Talked to large customer about potentially sponsoring software work
  • Continued working on 2022 taxes with accountant, R&D tax study firm

Software development

Customer support

  • Pitched in on support tickets to free up time for the local staff to build up enough inventory to shift to the 3PL vendor

Sales

  • Stopped advertising trade-ins for TinyPilot Voyager 2a on the TinyPilot website
    • They’re pretty time-consuming, and we’re overloaded at the moment

Misc

  • Sold TinyPilot’s 3D printer
    • We bought it in December when we weren’t sure if we’d have enough cases before we received our metal cases
    • Paid $5,250 for it sold it for $3,100 (minus $200 for shipping)
    • Glad to have it off my hands and get a decent amount of the value back
    • Definitely glad to no longer be in possession of a giant, heavy, expensive thing

For the week ending Friday, Mar 24, 2023

Management

  • Fleshed out plan for what we need to do to migrate fulfillment to an external 3PL vendor
    • We’re currently roughly manufacturing at the same rate we’re selling, but we need to get a surplus in order to cover the transition time
    • We had to figure out exactly how much of a head start we’d need and what else we’d need to do to ship the products to the 3PL
  • Worked with 3PL vendor on translating our workflows to them
  • Revised fulfillment processes to buy us time to switch to the 3PL
    • Cut out a time-consuming validation step that has never caught any issues
    • Deferred upgrade requests until mid-April
  • Met with attorneys for R&D tax credit
    • So far, not so painful
  • Interviewed and hired a new accountant
    • They’re a mid-sized firm and $5k/yr, which is a huge jump from my usual $300-500/yr
    • I’ve had such a frustrating experience with small, local accountants, and I hate researching tax questions myself, that I’m ready to pay to outsource it more intensely
  • Two calls with people with electronics manufacturing experience
  • Two 1:1s with local staff
  • Handled a request from a large customer who wanted to sponsor a new feature
    • I quoted $15k to do an initial investigation, and they stopped responding
    • I don’t have bandwidth to project manage a major new feature for a big company, so if I was going to make time for it, they’d have to pay a lot
  • Team lunch with local staff
  • Figured out bookkeeping for overseas business expenses I paid in cash
    • I wasn’t sure how to do double-entry bookkeeping in a foreign currency, but my reading of this post was that I should convert each transaction to the equivalent dollar value
    • It feels a little dirty because I’m failing to capture information (the real EUR amount, the exchange rate I’m using), but I’m preserving them in a comment
    • It was only a handful of transactions, so if I had to do this more regularly, I’d find a better solution.

Software development

  • Open-sourced pi-expand
    • pi-expand is a tool we’ve just started using internally to flash microSDs to the exact right size
    • Normally, Pi images flash only a portion of a microSD disk, and then on first boot, they expand to occupy the full disk
    • The problem is that the expansion adds 10-15 seconds to first boot, and if the user cuts power during their process, they likely cause an unbootable device
    • Since we know the size of our disks in advance, we can flash the full disk and save the user from the resize step
  • Investigated a bug related to pi-expand
    • One member of the fulfillment team reported that after we started flashing microSDs with pi-expand, audio streaming stopped working
    • This was bad news as we had already flashed several microSDs and wouldn’t be able to track which were flashed in the old way vs. new way, potentially forcing us to unwind 2-5 hours of work
    • I couldn’t reproduce it
    • It turned out to be bad instructions. I forgot that audio is off by default and didn’t explain how to turn it on.
    • We hadn’t run into it before because our standard testing microSD was pre-configured for audio
  • Fixed a bug related to email address string casing in license checks
    • According to the spec, two emails can vary by case, but no email server works that way, so when a user enters their email address in a different case than our records, we should ignore casing
  • Upgraded to shellcheck 0.9.0
    • And got a l33t PR number

Customer support

  • Fixed a flaw in our trade-in process
    • We let users keep their microSD because it doesn’t need any new hardware
    • The problem is that their old microSD most likely runs Debian 10, which doesn’t support audio streaming
    • The whole reason they’d trade-in is for the audio, so they’d get the new device and be confused that audio streaming didn’t work
    • New process is that we give them a new microSD with the latest Pro image as part of the trade-in

Sales

For the week ending Friday, Mar 17, 2023

Management

  • Worked with 3PL vendor on setting up real-time postage pricing
    • It turns out none of their other Shopify customers had ever asked before, so they were all just charging flat shipping fees and either eating the cost or pocketing the difference when the static price differed from the actual postage costs
    • But I had to upgrade from Shopify’s $80/mo plan to their $400/mo plan!
      • I should make some of the money back in lower (by 0.2%) credit card fees at this tier
      • The higher-tier plan also supports better international shipping (customer pays duty fees up front rather than getting caught by surprise later), so it may be worthwhile
    • We’re still working out some kinks in the integration, but it seems like we’re good enough to get up and running
  • Started gathering documents for an R&D credit study
    • I can potentially get $20-35k in tax credits TinyPilot qualified for through R&D, but it seems like it’s going to be several hours of unpleasant paperwork
  • Interviewed a new accountant
  • Got together documents for 2022 tax filing
  • Sent a short-term roadmap to the team
  • Worked with hardware partners to iterate on case design
  • One 1:1
  • Reached out to most of the contacts I received from my last retro
  • Worked with hardware partners on case improvements

Customer support

Sales

  • Talked with a customer about sponsoring TinyPilot to add a new feature
  • Increased base price by $30 ($399 -> $429)
    • I’m trying to slow down sales until the fulfillment team has a chance to catch up and build up a better inventory buffer
    • I actually mistakenly increased the price by $100 and customers still purchased, but it’s unclear if that’s meaningful because they only saw the +$100 price at checkout. Though it does make me wonder whether the price should be a lot higher.
      • I partially refunded those customers because the website showed them a lower price when they decided to purchase

IT

  • Upgraded Balena Etcher on office desktop
    • This turned out to be more complicated than I expected, and I made it unusable for a day
    • Some of the paths and flags had changed, and I hadn’t tested correctly on my VM
  • Wrote instructions for troubleshooting our new router
  • I discovered that our router doesn’t resolve local hostnames
    • WTF Omada?

For the week ending Friday, Mar 10, 2023

Management

  • Re-merged our two offices
    • I moved our computers to a spare office three weeks ago because my landlord wasn’t sure if we’d have to move while I was traveling.
    • We (fortunately) ended up not having to move, so I moved everything back to how it was
  • Downgraded office router from OPNSense to TP-Link Omada
    • The OPNSense is fun, but it’s caused some issues to have too unusual a router
    • I think this router will make it easier for nontechnical staff to reset or diagnose issues, since it’s more like routers people have at home
  • Had a call with tax lawyer to talk about section 174
    • Their take is that I and every company that does software development has to amortize software development expenses over 15 years (because TinyPilot’s software developers are outside the US)
    • If the devs were US-based, it would still be amortized, but over 5 years
    • I can offset these costs by taking R&D tax credits, but it’s likely going to cost $8-10k for lawyers to do the work of claiming the tax credit, and it’ll get me $25-35k in credits.
  • Adjusted my bookkeeping so that I’m tracking software development expenses separately
  • Set up our low-volume product with our new 3PL
    • A bit of a rocky start, as they wanted me to hand over my Shopify root credentials for the onboarding
    • Apparently all of their other clients agree to do this, which is bizarre to me
    • We eventually found a workaround where I created a limited account on Shopify for them that had enough permissions for them to link my Shopify account to Shipstation, their order management platform
    • This seems to be either terrible design on the part of Shipstation, or they’re using Shipstation in a way other than it was intended.
  • Led monthly dev team meeting
  • Led monthly support engineering meeting
  • Reached out to Raspberry Pi about late deliveries
    • It seems like orders are about a month behind for the next few weeks, but we should still be okay

Software development

  • Reviewed draft instructions for migrating from Buster to Bullseye
  • Wrote a Beancount importer for CapitalOne credit card statements

Sales

  • Increased base price by $20 ($379 -> $399)
    • I’m trying to slow down sales until the fulfillment team has a chance to catch up and build up a better inventory buffer
    • It’s unclear if this price change actually slows down sales at all
  • Paid TinyPilot affiliates

For the week ending Friday, Mar 3, 2023

  • Met with punkt.de, TinyPilot’s EU distributor in person
  • Visited the Karlsruhe Castle
  • Met one of TinyPilot’s developers in Berlin
  • Had lunch and went axe throwing with TinyPilot’s support engineers in London

For the week ending Friday, Feb 17, 2023

Management

  • Led crossover meeting between dev + support engineering teams
    • Strangely, it’s the first time anyone at TinyPilot has had a face-to-face meeting with a teammate that doesn’t share their job role and isn’t me
  • Scrambled to deal with office construction
    • They’re doing repairs after a pipe burst last week, and every day building management has a new answer about whether we have to relocate offices within one business day or whether they can do the repairs without disturbing our office.
    • Moved all TinyPilot computers to a spare office.
    • Configured critical Pi servers to read-only mode.
    • Got duplicate keys made for the spare office.
  • Accidentally knocked out networking in the office for a day
    • In testing Internet for the new office, I moved the router to the new office, and it just stopped assigning IP addresses, even when I moved it back to our original office.
    • I went crazy trying to figure out what was going on, but I was limited in not having any network connectivity or 4G access
    • I woke up the next morning and realized I connected the WAN cable to the wrong port on the router.
      • I’m too used to switches, where the ports don’t matter.
  • Two 1:1s with teammates

Software development

  • Spec’ed out a high-level process for creating a uStreamer Debian package for TinyPilot
  • Reviewed a script to expand the OS partition of a microSD before first boot
  • Added better documentation to a TLS key cycling script in TinyPilot Pro
  • Fixed a minor typo in uStreamer

Customer support

  • Reviewed new FAQ article about enabling audio
  • Reviewed a proposal to integrate decision trees into our support flow
  • Reviewed a proposal to redesign our internal support playbooks

Sales

  • Published a blog post announcing the Voyager 2a
    • We actually started selling it three weeks ago, but I’d been holding off on the announcement until we completed the software changes we needed to enable its audio functionality.

For the week ending Friday, Feb 10, 2023

Management

  • Led dev and support team meetings
  • Two 1:1s with staff
  • Dealt with a pipe burst at the TinyPilot office
  • Reviewed inventory targets

Software development

Customer support

  • Removed outdated H.264 instructions from TinyPilot website
    • We have a much simpler solution now, but users were finding the old blog post and getting confused

For the week ending Friday, Feb 3, 2023

Management

  • Gathered feedback on manufacturing quality for new cases
  • 1:1 with team
  • Purchased New Year’s gift for Chinese manufacturing partner
  • Prepared for first dev/support multi-team meeting
  • Started planning for shifting assembly to our Chinese manufacturing partner
  • Finalized travel plans for the UK

Software development

  • Debugged data sharing issues with EU partner
  • Added support for Voyager 2a purchases with license check

Customer support

  • Reviewed updates to article about improving performance
  • Undeleted old installation instructions
    • A week after I deleted them, a customer who waited two years to open his package emailed me about the dead link!

Sales

  • Tried to get Voyager 2a listed on Amazon but was stymied by Codisto’s terrible Shopify integration

For the week ending Friday, Jan 27, 2023

Management

  • Started reviewing contract with new 3PL vendor
  • Two 1:1s
  • Gave feedback on new instructions card for TinyPilot Voyager 2a
  • Brainstormed ideas for dev/support crossover meeting
  • Shared new documentation for Voyager 2a with EU distributor
  • Researched options for a team-building event with UK-based teammates

Software development

Customer support

Sales

For the week ending Friday, Jan 20, 2023

Management

  • Broke up with TinyPilot’s new 3PL vendor
    • They were good for regular orders, but I found their desired process for handling exceptions (e.g., customer changes address after order, customer pasy with purchase order) a little too complicated and error-prone
  • Continue prepping for Voyager 2a launch next week
    • Registered new GTINs
    • Finished making changes to website
  • Two 1:1s

Software development

  • Published TinyPilot Pro 2.5.2
    • Soft release for the week, will be followed by broader announcement next week
  • Switched TinyPilot’s logging backend
    • I thought Logflare would be a good match because it offers unlimited log retention, but it’s pretty bad at searching logs
    • I tried every single log management tool that’s compatible with Fly.io, and wasn’t thrilled with any of them
    • I ended up going crawling back to Logtail, as they’re the closest to what I want
    • I took notes on the options because I keep reviewing options and then forgetting why I reject certain platforms
  • Fixed shell for tinypilot user
  • Added some dev scripts to update server
  • Refactored order number parsing on update server
  • Delete the default pi user from pre-made TinyPilot microSD images
    • Previously, we were just disabling it
  • Switched the TinyPilot base image from Raspbian Buster to Raspbian Bullseye
    • In the next release, we’ll be fully Bullseye compatible, and the default image will be Bullseye-based
    • I was expecting more issues, but so far, it’s looking like everything works out of the box

Customer support

  • Reviewed an update to WiFi FAQ that explains how to disable it.
  • Worked with team on possibility of adding decision trees for customer support

Sales

  • Prepped TinyPilot website for switchover to Voyager 2a

For the week ending Friday, Jan 13, 2023

Management

  • Led monthly support engineering meeting
  • Two 1:1s
  • Work with 3PL on figuring out how to handle unusual order flows
  • Prep compliance testing for Voyager 2a
  • Arranged for TinyPilot developers to get audio hardware for testing
  • Managed a few large orders from China I’m trying to complete before Chinese New Year

Software development

  • Started end-to-end testing process for TinyPilot Pro 2.5.1
  • Fixed API for accepting order metadata from our distributor
  • Reviewed script to set a static IP address
  • Reviewed a change to convert demo videos on the website to use mp4 instead of GIF
    • They were historically GIF because they were visible on first page load
    • When we changed them to play only when clicked, we forgot to change them to MP4

Customer support

  • Created a Github repo to hold support decision trees
    • We’re trying to figure out a way to keep support flows in source control
    • The idea is to create decision trees for different support scenarios, but have them in a place where we can code review changes
    • We’re going to try Mermaid, which Github and Notion support natively

Sales

  • Helped with a complicated question about bulk international shipping
  • Documented how to find HS codes for products

Misc

  • Booked more of my travel for my upcoming trip to Europe
  • Paid quarterly sales tax
  • Switched from Logtail to Logflare
    • The appeal of Logflare is that it supports indefinite retention
    • So far, off to a rocky start
    • I want it as a tool for searching my logs, but it seems more designed for people who need to generate graphs from their logs

For the week ending Friday, Jan 6, 2023

Management

  • Led monthly dev meeting
  • Coordinated manufacturing for next TinyPilot Voyager product
  • One 1:1

Software development

  • Finished implementing uStreamer launcher
  • Moved user creation from Ansible role to Debian package
  • Added a convenience script for installing TinyPilot bundles
    • TinyPilot bundles are zip files that contain all the TinyPilot code to install TinyPilot on a device.
    • Our existing scripts install bundles directly from the update server, but it’s useful during development to be able to install arbitrary bundles
  • Added a convenience script for installing TinyPilot from source
    • Just handy if you’re editing code on the device and want to install that version.
  • Verified working directory in create-bundle script
    • Most of our scripts run successfully regardless of the current working directory when they’re run, but create-bundle didn’t establish its own working directory.
  • Reviewed changes to our update server to enforce checkpoint versions
    • e.g., if you’re on version 2.2.0 and 2.6.0 is out, update server points client to 2.5.0 because 2.5.0 made major changes, so we assume all clients have gone through that update.
  • Reviewed check during install to make sure read-only filesystem isn’t on

Customer support

Misc

  • Cycled CircleCI secrets in response to the CircleCI breach
    • And accidentally broke logins on WhatGotDone. Sorry about that! That’s why this is going up on a delay.
  • Debugged audio issues on next gen TinyPilot hardware

For the week ending Friday, Dec 30, 2022

Management

  • Sent email to full team about capacity planning for 2023
  • Worked out some process hiccups with 3PL vendor
  • One 1:1 with staff

Software development

  • Created a launcher for uStreamer
    • A problem we’ve had with TinyPilot is that we run uStreamer under systemd, but we generate the systemd config file using Ansible.
    • To change uStreamer’s settings like frame rate or video quality, we have to spin up Ansible to rewrite the systemd config file then restart the service, which takes about 20-30 seconds (very slow for the user if they just want to adjust frame rate).
    • My change adds a layer of indirection so that the systemd service actually runs a launcher that reads a config file at runtime and then launches uStreamer with the corresponding command-line flags.
    • This cuts Ansible out of the equation and means we can just rewrite a simple YAML file (which we were doing anyway) and then restart the service. I’m trying to get rid of our ugly Ansible dependencies.
    • Reduces time to apply changes from 20-30 seconds to 1-2 seconds.
  • Made a convenience script for installing TinyPilot during development
  • Reformatted all the markdown on the website with Prettier
    • I’m not sure if Prettier used to do a bad job with Markdown or if I just disliked its style choices, so I had a habit of disabling Prettier on Markdown. These days, I like Prettier’s formatting, so I’m undoing my previous configurations.
  • Fixed responses for invalid HTTP verbs in the Enterprise REST API
    • It seems like Flask returns a 404 for routes that handle POST but not GET
    • Routes that handle GET but not POST return an expected HTTP 405 if you request POST
    • So I had to add an explicit GET handler that just raises an exception: raise werkzeug.exceptions.MethodNotAllowed(valid_methods=['POST'])

Customer support

  • Reviewed additions to our access over the Internet article.
  • Reviewed a blog post about using TinyPilot with a 4G modem.

Sales

  • Gave feedback on 3D renderings for Voyager 2a
  • Negotiated with a customer who wants to place a large international order

Misc

  • Fixed configuration on one of the office test laptops
  • Upgraded office router to OPNsense Business
    • I actually purchased the license eight months ago, but they have an annoying design flaw in that the free version usually has a higher version number than the paid version, so you can’t upgrade the free version to the paid version unless you pause updates long enough for the paid version to catch up and put out a later version than the free version.
    • I now get to use four months of my one-year paid license, but I mainly purchased the license to support development, so it’s not a big deal.

For the week ending Friday, Dec 23, 2022

Management

  • Continued coordinating a test run with a 3PL vendor
  • Did capacity planning for next few months
  • Continued coordinating the next TinyPilot case
  • Started recurring monthly meeting with support engineers
  • Three 1:1s with teammates
  • Finished end-of-year tasks for Gusto

Software development

Sales

  • Increased price of TinyPilot Voyager 2 PoE
  • Reviewed new 3D renders of upcoming case

Misc

  • Booked flights for an upcoming trip
  • Purchased holiday gifts

For the week ending Friday, Dec 16, 2022

Management

  • Organized tasks needed to start shipping Voyager 2a
  • Met with EU distributor
  • Two 1:1s with team
  • Moved contractors over from Deel to Pilot
  • Completed contract review with our 3PL vendor
  • Signed up with 3PL vendor’s order management system
  • Completed hiring a 3D rendering artist for the next product images
  • Discovered I might have messed up our case supply
    • I ordered 75 extra cases from a secondary vendor (at 5x the price as our normal vendor)
    • It turns out that the screw holes are different on these prints, so our screws don’t fit
    • We’re trying larger screws, but it may be a $5k loss on the cases + several weeks of case shortage
    • It’s my mistake for now doing a test build with the sample print before ordering the full batch, but I assumed the fit would be identical across 3D printing vendors.

Software development

  • Created a proof of concept TinyPilot image with audio capture enabled
  • Fixed a regression in TinyPilot Pro’s CircleCI config
  • Simplified bundle uploading in TinyPilot Pro’s CircleCI config
  • Reviewed a PR allowing the update server to recognize pre-release tags with dots in the version string
  • Adjusted Ansible tests for uStreamer to exercise Janus functionality
  • Added tc358743-audio overlay to Raspbian Bullseye systems
  • Continued troubleshooting our Amazon-HelpScout integration with the vendor

Customer support

  • Wrote more internal playbooks

Misc

  • Booked another flight for a Spring trip

For the week ending Friday, Dec 9, 2022

Management

  • Continued planning the switch to metal cases
    • Tested a full build of the latest revision
  • Two 1:1s with team
  • Team lunch with local staff
  • Announced to remote contractors that in 2023 we’re dropping TopTracker / Deel in favor of Toggl / Pilot.co
    • TopTracker is a free time tracking tool and a “you get what you pay for” situation
    • Deel has been getting worse and worse
    • I chose Deel because it has built-in time tracking, but their app is so hard to use that most of the contractors had found their own solutions for time tracking and then copied their hours into Deel at the end, which made it hard for me to understand what people were working on until two weeks later
    • Pilot doesn’t have time tracking, so I’m using Toggl as a complement
    • Toggl isn’t a great solution because it’s designed more for agencies working with multiple clients, but it’s the best option I’ve found
  • Made sales forecasts for the next three and six month windows for inventory planning
  • Purchased more inventory in anticipation of Chinese holidays
  • Got a legal review on a 3PL vendor contract
  • Solicited 3D image designers for next TinyPilot Voyager release
  • Did monthly bookkeeping
  • Paid TinyPilot affiliates

Software development

  • Led monthly dev team meeting
  • Moved the TinyPilot updater service from the Ansible role to the TinyPilot Debian package
    • Now that I have a better understanding of Debian packaging, I’m trying to move more work from Ansible to Debian packages, as the Debian package manager is more suited to the task of installing/uninstalling TinyPilot on a system
  • Reviewed a proposal to change TinyPilot’s versioning to strict SemVer
  • Reviewed a change to add TinyPilot hardware information into our support logs
    • We sometimes get support requests from users where it turns out that they’re using unsupported hardware, so having the hardware information in the logs makes it easier to identify those instances sooner.
  • Reviewed a change to add overlay filesystem status into our support logs
    • We sometimes get support requests from users who can’t understand why their changes disappear on reboot, and it turns out they’ve enabled the overlay filesystem (which holds filesystem changes in memory instead of committing them to disk)
    • Having the overlay filesystem status in the logs helps us identify those cases earlier
    • We realized we should also block updates if the overlay filesystem is enabled because they’ll have no effect (the software will update and then the last step is a reboot, which will revert the changes)
  • Reviewed an improvement to our Ansible testing workflow
    • We were previously building our own Debian package for Janus, but it created complexity in our CI workflow since we didn’t have a package that matched our CI’s CPU architecture.
    • Now that we’re using an official package, arm64 packages are available, so we don’t have to put in hacks to avoid installing Janus in CI
  • Reviewed changes to add Litestream replication to our update server
  • Reviewed a change to add lsb-release during TinyPilot’s install

Customer support

  • Continued adding to TinyPilot’s internal writing style guide
  • Continued troubleshooting our Amazon / HelpScout integration

For the week ending Friday, Dec 2, 2022

Management

  • Two 1:1s with teammates
  • Monthly meeting with EE partner
  • 1:1 with EU distributor
  • Gave feedback to Pilot team about a poor experience with expense reimbursements
    • Contractors’ reimbursement was 7% less than they paid out of pocket due to Pilot taking high currency conversion fees out of the contractors’ end.
  • Started the onboarding process with a 3PL vendor
  • Ordered emergency cases from a second
    • We had record sales in November, so we were on track to run out of cases faster than I expected
  • Caught up with invoices with EU distributor

Software development

  • Removed most privileged scripts from ansible-role-tinypilot
    • And moved them to the core TinyPilot repo
    • I initially designed TinyPilot to use Ansible for installation because I didn’t know how to use Debian packages
    • Now that I understand Debian packages better, I’m seeing opportunities to simplify our install by replacing Ansible logic with Debian packaging logic
    • One big advantage is that it keeps TinyPilot logic in a single repo instead of splitting it across the core repo and Ansible repo
  • Met with Vincent Bernat who gave me excellent advice about Debian packaging and Nix
    • Sent out notes to the dev team
  • Reviewed a PR to install Janus from the debian-backports repo
    • Previously, we were rolling our own Janus Debian package, and it was burning tons of dev time
    • We realized the backports version meets our needs, and we wouldn’t have to maintain our own fork
  • Added connect retries to the integration tests in Gatekeeper
    • There was a timing issue where the integration tests would fail if they launched before the server was serving
    • Adding three retries and two second sleeps solved it
  • Adjusted CI so that we build a TinyPilot install bundle in every branch
  • Adjusted CI so that we store the TinyPilot install bundle in CI as a build artifact
    • Previously, we were only storing the index of its files, but we realized it’s useful to store the full bundle as well

Customer support

For the week ending Friday, Nov 25, 2022

Management

  • One 1:1
  • Worked on an internal style guide
    • We had one that covered how we talked to customers, but I realized we needed a separate guide that covers writing we do in public, like in blog posts or FAQ articles.
  • Continued a silly dispute with a company that overbilled me for a 3D printer.
  • Reviewed vendor expenses.
    • Documented the process so that I can delegate this next time.

Software development

  • Continued work on pulling logic out of Ansible and into the TinyPilot core repo
    • I didn’t know anything about Debian packaging when I started TinyPilot, and I’ve since learned that Debian packaging tools can do a better job at many of the things I’d been using Ansible for when installing TinyPilot

Customer support

Misc

  • Ordered screws/spacers for the next TinyPilot case prototype

For the week ending Friday, Nov 18, 2022

Management

  • Had three 1:1s with teammates
  • Got into a dispute with a 3D printing vendor
    • They had me sign a credit card authorization form for $5,240
    • They charged my credit card $5,567.50,
    • When I asked them, they said that the authorization I signed said, “taxes not included” so they’re allowed to charge above the amount they showed me for taxes.
    • I find it deceptive, and I’ve never seen a merchant omit taxes until after the purchase agreement, so I’m pushing back.

Software development

Customer support

  • Reviewed FAQ explaining how to diagnose a “No Signal” error

Misc

  • Provisioned a new office laptop

For the week ending Friday, Nov 11, 2022

Management

  • Coordinated a fix for a manufacturing issue
  • Investigated ways to mitigate our approaching shortage of device cases
    • We’re selling devices faster than our 3D printing vendor can manufacture cases
    • Bought a $5k 3D printer
      • It no longer made sense for our 3D printing vendor to buy new printers for us since we’re switching away from 3D printing in a few months, so the best option was to buy our own printer, which our vendor agreed to own and operate, and then we’ll sell it used when we’re done.
    • Continued getting quotes from other 3D printing vendors who can supplement case production
  • Held three 1:1s
  • Met with a designer about potential work with TinyPilot
  • Continued speaking to 3PL vendors about migrating fulfillment
  • Started to try Pilot as a contractor payment platform
    • I haven’t liked Deel or Remote, so I’m hoping Pilot is a better fit
  • Debugged an issue with balena Etcher on our office computer
    • It turned out the software was out of date. I updated it and then it introduced a new bug. Fixed the new bug.
  • Finally cleaned off a bunch of case prototype stuff that’s been covering my desk

Software development

Customer support

For the week ending Friday, Nov 4, 2022

Management

  • Led dev team meeting
  • Two 1:1s with staff
  • Officially welcomed new support engineer
    • He started on a trial basis, but we’ve both agreed the trial was a success
  • Met with hardware partner to review metal cases
  • Reached out to three other 3PL vendors
    • Interviewed one of them
    • Followed up with previous 3PL vendor I talked to
  • Started process of paying a new contractor with Remote.com
    • Not so hot on it so far
    • They didn’t prompt me to set up a payment method until the first invoice came in, but now it’s going to be several days before my payment method is active, meanwhile my contractor is waiting for payment
    • They don’t support the idea of hour and hourly rate, the contractor has to do arithmetic every invoice to calculate hours x hourly rate
    • They don’t support the concept of expense reimbursement, so the contractor has to manually add it to the invoice
  • Explored options for producing more cases until we switch to metal
    • Option 1: Get other vendors to print the case
      • Downside: Every other vendor is 8-10x the price because we qualify for a state subsidy with our vendor
    • Option 2: Buy our vendor 1-2 new printers
      • Downside: Costs $5k per printer and we’d only use it for 2-3 months.
  • Researched better strategy for managing HelpScout when someone’s on vacation
  • Paid affiliates

Software development

Misc

  • Switched vendors for cooling fans

For the week ending Friday, Oct 28, 2022

Management

  • Dealt with delisting on Amazon
    • They suddenly decided that they can’t verify my relationship with the TinyPilot brand, so they don’t know if I’m really authorized to sell TinyPilot devices
    • I have to jump through a bunch of hoops with them to re-establish the listings, which are still offline on Amazon
  • Applied for a trademark on the word “TinyPilot”
    • The process was in both more annoying and less annoying than I expected
    • It took about two hours start-to-finish
    • The annoying part was just signing up for an account and jumping through all the hoops to verify my ID
    • The actual trademark application was full of confusing questions and terrible form UI, but it was overall a pretty short application. Maybe 30ish simple questions about the company’s address, etc. and then examples of me using the term “TinyPilot” on my products
    • It’s now a three-month wait before I find out whether I got it
    • The advantage of owning the trademark is that I can be in the Amazon Brand Registry, which presumably offers stronger protections against random delisting
  • Continued working with designer on metal cases
  • Started process of adapting case to fit new HDMI capture chips
  • Sought recommendations for alternative designers
  • Interviewed a 3PL vendor
  • One 1:1

Software development

Customer support

  • Reviewed new wiki article about using AW EDID Editor under Wine
  • Dealt with a customer who bought several weeks ago, but saw that we sold for a lower price on our own website and was mad
    • They threatened to return for a full refund through Amazon and just order from our store so they could get the lower price
      • This would force us to eat the cost of fees + returns from both Amazon and Shopify
    • The rational response would to just give them the money, but I was really bothered, so I told staff to refuse to fulfill the customer’s order if they tried to order on our website
    • Happy ending: I explained to the customer that we charge a higher rate on Amazon because Amazon charges us fees, and it would be expensive for us if they returned our product. They apologized and said they didn’t realize that and thanked me for the explanation.
  • Adjusted our internal guidelines on handling customers who request discounts
  • Kept trying to get the HelpScout-Amazon support integration working, but it continues to be bad

For the week ending Friday, Oct 21, 2022

Management

  • Three 1:1s
  • Work with hardware
  • Untangle a misdirected delivery from our manufacturer
  • Researched 3PL vendors
  • Started backing up my Notion workspace with NotionBackups
    • Indie-run!
    • The founder contacted me for an unrelated reason, and I saw they run this service, and I realized it’s a service I need
  • Paid state sales tax

Software development

  • Eliminated QEMU from our tinypilot build process
    • I’ve been building other packages with QEMU, and I think we just blindly did it here, even though there’s no reason to use QEMU since Python is architecture-agnostic
    • Reduced build time from 2m30s to 40s
  • Refactored TinyPilot’s Debian packaging
    • Previously we were including the entire repo and using .dockerignore to exclude files and paths
    • I realized it’s easier to just have a path that represents most of the files within our Debian package, and we dynamically create a few more that need runtime information
  • Started transferring TinyPilot’s privileged scripts from the Ansible role to the TinyPilot core repo
    • I’m currently stuck on how to install a systemd service as part of a Debian package
  • Contributed a documentation fix to the upstream uStreamer repo
  • Added a persistent storage volume to our license management service
  • Reviewed migration of Janus logic into ansible-role-uStreamer
  • Reviewed changes to add bitrate control to the uStreamer Ansible role
  • Fixed logged version of uStreamer in our diagnostic logs on certain OS platforms
  • Updated our Janus Debian package build to print the package contents in CI
  • Reached out to our engineering consultant partner for possible software projects for TinyPilot in areas we don’t know well

Customer support

  • Removed my direct email address from the TinyPilot website
    • The original idea was that customers interested in large orders could contact me directly, but that so rarely happens. Instead, it’s 99% users trying to bypass our normal support channels.
  • Updated instructions on the website for installing TinyPilot Pro
  • Reviewed improvements to the wifi and read-only filesystem instructions
    • One of the support engineers discovered that the raspi-config has a non-interactive mode, so we could simplify our instructions by giving them a bash one-liner instead of a series of interactive steps.
  • Reviewed our internal playbook for handling corrupted filesystems

For the week ending Friday, Oct 14, 2022

Management

  • Picked up first TinyPilot metal case prototype from manufacturer
    • Gave feedback to hardware team
    • It’s a good start, but we’ve got a ways to go
  • Two 1:1s with teammates
  • Added more internal guidelines for writing public-facing documentation
  • Ordered more raw materials

Software development

Customer support

  • Fixed instructions for enabling H264 encoding
  • Reorganized our support playbooks to move playbooks to non-technical support if they don’t require a support engineer

Sales

  • Reviewed our process for loaning evaluation devices

For the week ending Friday, Oct 7, 2022

Management

  • Hired a second support engineer
  • Led monthly dev meeting
  • 1:1 with staff
  • Dropped off equipment with manufacturer for prototype case
  • Trialed Toggl as a new time tracking tool for the team
    • It’s designed more for agencies/consultancies
    • It’s very hard to find time tracking software that isn’t essentially bossware/spyware. As soon as the features brag about spying on which URLs your employees are viewing while on the clock, I’m out.
  • Evaluated alternative vendors for fans
  • Prepared inventory for my EU distributor’s upcoming vacation

Software development

  • Published TinyPilot Pro 2.5.0
  • Reviewed a fix to the install script that was preventing some users from updating to 2.5.0
  • Reviewed a fix that adds better OS information to our debug logs
  • Updated a library dependency for compatibility with Ubuntu 22
  • Fixed caching for version index files on our CDN

Customer support

  • Reviewed new support article about updating through an HTTP proxy
  • Wrote internal playbook to answer customer questions about TinyPilot’s USB-A ports
  • Wrote internal playbook to answer customer questions about port forwarding to enable Internet access
  • Wrote internal playbook to explain TinyPilot’s status on migrating to Debian Bullseye
  • Updated internal guidelines about offering loaner devices to make sure we collect data about compatibility when customers send them back

Sales

For the week ending Friday, Sep 30, 2022

Management

  • Continued interviewing candidates for new support engineer position
  • 1:1 with support engineer
  • Sync with EU distributor
  • Sync with hardware engineering partner
  • Spoke to local sheet metal shop about creating prototypes of sheet metal cases
  • Canceled Partsbox subscription
    • We’ve decided to switch to a simpler method of parts accounting for electronics components

Software development

  • Tested the TinyPilot Pro 2.5.0 release
  • Adjusted the release process to upload release testing artifacts to TinyPilot’s PicoShare service
    • Previously, it uploaded to a server within my office, but uploading directly to PicoShare involves fewer moving parts
  • Finished Ansible role changes to support Debian Bullseye
  • Adjusted the load TC358743 EDID service to restart on failure up to 20x
  • Added support for uStreamer 5.x to ansible-role-ustreamer
  • Updated update service to log the version number it serves to clients for TinyPilot Community
  • Updated update service to log client metadata (software version, distro) for TinyPilot Pro
  • Reviewed change to TinyPilot’s UI style guide

Customer support

  • Added a playbook response for when a customer says that they couldn’t flash their microSD

For the week ending Friday, Sep 23, 2022

Management

  • Two 1:1s with staff
  • Resumed hiring for support engineer position
  • Team lunch with local staff
  • Met with product manager from Gusto to give feedback about the product
  • Reviewed expenses from hardware engineering partner

Product research

  • Reviewed designs for metal TinyPilot cases
  • Synced with hardware engineering partner about adding audio support to TinyPilot

Software development

  • Reviewed design for integrating orders from our distributor
  • Reviewed documentation for new update mechanism
  • Experimented with TinyPilot on Raspbian Bullseye
  • Fixed a bug on the website that crashed checkout if the user had an add-on in their cart that no longer exists
    • This can happen if they added an item to their cart when AC adaptors were an add-on, and now they’re included by default
  • Fixed TinyPilot’s default VS code extensions
  • Reviewed refactoring on the website to get rid of global logic
  • Signed TinyPilot up for Hacktoberfest

Customer support

  • Set up Amazon access for support staff so they can process refunds there
  • Tried to set up ChannelReply to connect my Amazon messages to HelpScout, but it didn’t work
    • Waiting on an answer from ChannelReply support

Sales

  • Shared new TinyPilot review from LearnLinuxTV
  • Followed up with another YouTuber who’s planning to publish a review

For the week ending Friday, Sep 16, 2022

Management

  • Continued onboarding new support engineer
    • We’ve officially completed the trial period
  • Four 1:1s
  • Continued following up with candidates who applied for the Support Engineer position to let them know I’ve hired someone
  • Flagged copyright issues in another KVM over IP open-source project

Software development

Customer support

  • Reviewed instructions for installing/updating TinyPilot through an HTTP proxy
    • Turns out it’s trickier than we expected, so we’re chasing down some issues

Product development

  • Reviewed designs for a new steel case for TinyPilot

For the week ending Friday, Sep 9, 2022

Management

  • Continued following up with backlog of Support Engineer applicants
    • If they were no hires, I eliminated them (with an explanation if they made a good-faith effort in the application rather than just copy/paste)
    • If they were strong candidates, I let them know that I hired someone but I’d like to stay in touch in case something opens up in the future
  • Three 1:1s with staff

Software development

  • Reviewed a PR to use version information to decide on updates
  • Reviewed a PR to add structured data to TinyPilot blog posts
  • Reviewed a PR to fix a build break in the TinyPilot Pro ansible role
  • Reviewed PR to refactor one of our CI steps into a standalone bash script
  • Migrated away from deprecated CircleCI Docker images

Customer support

  • Reviewed new FAQ article about performing TinyPilot updates through an HTTP proxy

Sales

  • Reached out to a large company who’s been purchasing many TinyPilots

Misc

  • Emailed a blogger I like who recently mentioned TinyPilot

For the week ending Friday, Sep 2, 2022

Management

  • Team lunch with local staff
  • 1:1 with new support engineer
  • Sync meeting with EE partner
  • Hiring
    • Following up with all the candidates I haven’t responded to yet to let them know they’re either not a match or that they were a match and I got too many applications to evaluate everyone
    • I closed hiring a week ago, but I’m still following up with everyone
  • Adjusted my business liability insurance to comply with Amazon’s new requirements
    • I need to have $1M in coverage per incident and name Amazon as an additional insured
  • Wrote internal documentation establishing which holidays TinyPilot observes

Software development

  • Weighed in on design decisions for update overhaul
  • Added a privacy policy to the TinyPilot web app’s about page
  • Adjusted responsive behavior for the remote screen to leave less unused space
  • Reviewed changes to add JSON+LD data to TinyPilot landing page
  • Removed incorrect accessibility attributes from alert boxes on the TinyPilot website

Customer support

  • Reviewed a new FAQ article: Can anyone detect when I’m using TinyPilot?
  • Wrote a style guide for content on the TinyPilot website
  • Wrote internal documentation for conventions for taking screenshots
  • Wrote internal documentation for handling feature requests
  • Wrote internal documentation on how TinyPilot support engineers balance their various responsibilities

Sales

  • Increased Voyager 2 price by $10
    • We’re selling slightly too fast to meet demand at our current rates.

For the week ending Friday, Aug 26, 2022

Management

  • Hired a new Support Engineer
  • Updated ramp-up docs
  • Led monthly dev team meeting
  • Responded to other candidates for Support Engineer position
  • 1:1s with two teammates

Software development

  • Added more details to unintuitive behavior in TinyPilot’s keyboard emulation
  • Fixed a bug in the TinyPilot Shopify theme that was preventing customers from paying with Shop Pay
  • Fixed a minor bug in Gatekeeper

Customer support

  • Had a call with a large customer about feature requests / pain points
    • Filed a few bugs / PRs based on the call

For the week ending Friday, Aug 19, 2022

Management

  • Continued hiring process for TinyPilot Support Engineer role
    • Current status
    • Processed 350 new applications
    • I’m getting way more applications this time, so I’ve changed the location requirement from “Worldwide” to “United States”
      • There’s a higher proportion of qualified candidates in the US, so this reduces the influx until I can get back on top of the applications
      • With 500 applicants already, I’m hoping there’s at least one qualified applicant already in the process

Software development

  • Reviewed performance improvements to TinyPilot website

Customer support

  • Filled in for customer support, as we’re shortstaffed this week due to illness

For the week ending Friday, Aug 12, 2022

Management

  • Started hiring for an additional TinyPilot Support Engineer
  • Tried 9 different applicant tracking systems
  • Met with my distributor to discuss smooth transition to TinyPilot’s new software update system
  • Hired a freelance developer short-term to make a few performance fixes to the TinyPilot website
    • They reached out with a few suggestions, and I liked their ideas, so I asked if I could just hire them to implement them
  • One employee 1:1

Software development

  • Set up log retention on LogTail for TinyPilot’s Fly servers
  • Debugged an issue on the website where it’s no longer showing progress spinners
    • It’s somehow related to the theme work the design agency did, but I can’t figure out what’s going wrong
  • Upgraded bootstrap-vue on the TinyPilot website
  • Updated TinyPilot website README to make it friendly to a new developer
  • Reviewed Ansible change to TinyPilot install process
  • Reviewed change to upgrade Ansible dependency
  • Finished new install script for TinyPilot Pro

For the week ending Friday, Aug 5, 2022

Management

  • 1:1 with support engineer

Software development

  • Finished adapting our new install script to work for TinyPilot Pro
  • Added errcheck to gatekeeper
  • Reviewed changes to gatekeeper that install a specific version of TinyPilot Pro
  • Met with freelance developer who had suggestions for improving SEO on TinyPilot’s sales site
  • Created uptime alerts for all of our web services using Cronitor

Customer support

  • Updated guidance in customer support playbook for how to word our language when we’re asking the customer to do something they don’t think will work
    • e.g., sometimes the issue is just that their HDMI cable is bad, and they don’t believe us until we send them a better one, but customers can feel insulted if they tell us they’re using a known-good HDMI cable and we tell them we’re sending them a replacement

For the week ending Friday, Jul 29, 2022

Management

  • Led monthly TinyPilot dev team meeting
  • Continued planning for next TinyPilot release
  • Two 1:1s
  • Improved our process for paying duties
  • Re-bundled our USB-C power plug back into the product
    • Not all customers want an USB-C power plug because they either have one already, live in a country with an incompatible socket, or plan to use power over Ethernet
    • For a couple of months, we tried unbundling USB-C power plugs from the product and making it a separate add-on
    • The problem is that 80% of customers choose it anyway, and now that we’re selling on Amazon (where we include it by default because it’s harder to offer add-ons), it’s too confusing to different processes depending on the sales channel.
  • Filed TinyPilot LLC annual report
    • Basically, I pay $500 to confirm my address
  • Placed new inventory orders

Sales

  • Lowered pricing on TinyPilot products
    • Standard version: $389 -> $349
    • PoE version: $448 -> $398
    • The numbers are just gut feel, and they feel natural at ~$50 boundaries
    • My ideal is to sell 150-200 units/month, and we’re currently only at 140 units/month.
    • We’re accruing too much of an inventory backlog, so I’m curious to see if the price reduction increases sales velocity.
  • Arranged a new TinyPilot review with a YouTube creator

Software development

  • Made some fixes to our Shopify checkout domain
    • We host the website on tinypilotkvm.com but we have a Shopify checkout domain that customers only see when
    • The problem is that Shopify doesn’t expect that setup, so if customers visited the base of the checkout domain, they’d see a confusing message about having to enter a password
    • Updated robots.txt to disable search engines from indexing the checkout domain
    • Updated the Shopify theme to redirect to the real TinyPilot site if the customer accidentally visits the checkout domain directly
  • Moved app settings file out of the TinyPilot source directory
  • Made some performance fixes to website
    • Thanks to a blog reader for suggesting them
  • Started working on new install script for TinyPilot Pro

For the week ending Friday, Jul 22, 2022

Management

  • Two 1:1s
  • Team lunch with local staff
  • Did monthly bookkeeping

Software development

  • Implemented routes on the update server for checking the latest version number and downloading the latest version
  • Added integration tests for the update server
  • Fixed a bug on the website that a HN user discovered

For the week ending Friday, Jul 15, 2022

Management

  • 1:1 with local staff member and support engineer
  • Coordinated with manufacturer and local staff to manage low supply

Software development

  • Added integration tests for Gatekeeper
  • Added a LaterThan function for TinyPilot versions in Gatekeeper
  • Added support in Gatekeeper for parsing pre-release install bundles
  • Continued working on REST APIs for getting latest version available and downloading install packages
  • Updated paths to license files for Ansible dependencies (for our About page)

Customer support

  • Handled a complicated return
  • Resumed offering USPS as a shipping option to Australia
    • USPS hasn’t been able to reliably ship to Australia since mid-2021
  • Revised our customer support guidance on responding to customers who ask for discounts
    • Our previous policy was that if someone asked for a discount, we assume they’re going to be a problem customer and we gently steer them away from buying
    • We got an email from someone who said they bought one device and loved it so much they want more, so could we offer a discount?
    • We decided to adjust out policy for existing customers, so we offered a discount, and he ended up purchasing three more

For the week ending Friday, Jul 8, 2022

Management

  • Coordinated logistics for next batches of TinyPilot manufacturing
  • Finalized patent license to integrate H264 encoding into TinyPilot
    • Surprisingly high amount of work on both sides to sign a licensing agreement where I’d need to grow 80x to reach the threshold where I’m paying more than $0 in licensing fees
  • Paid commissions to TinyPilot affiliates

Software development

  • Reviewed a fix to the new TinyPilot installer
  • Continued working on adding TinyPilot Pro support to the TinyPilot release manager
  • Continued experimenting with CodeApprove
    • Gave feedback on Github
    • The founder has been super responsive in addressing feedback, so I’m considering switching away from Reveiwable entirely

Customer support

  • Thought about a better process for passing customer support tickets between people
    • We currently don’t have a formal process, so the receiving person has to do a lot of redundant work re-reading the thread to understand everything that’s happened
    • I’m thinking about how we can do a “pass-off summary”
  • Helped with some complex customer support tickets

Sales

  • Handled questions from a few customers about large orders
  • Sold a new TinyPilot Enterprise license

For the week ending Friday, Jul 1, 2022

Management

  • Started planning for TinyPilot Pro license checking
    • It’s complicated because the user needs some way of proving they purchased a TinyPilot Pro license
    • It needs to work for users who bought directly from me, through a distributor, through Amazon, etc.
  • 1:1 with local staff member
  • 1:1 with digital marketing freelancer

Software development

Sales

  • Added the non-PoE version of TinyPilot to Amazon

For the week ending Friday, Jun 24, 2022

Management

  • Led monthly dev team meeting
  • Team lunch with local staff
  • Call about video codec licensing

Software development

  • Upgraded TinyPilot to pylint 2.14.2
  • Added an explicit encoding to all Python open() calls of text files
  • Reviewed an external submission to remove a pylint global suppression
  • Added a REST API for retrieving the latest TinyPilot Community version
    $ curl https://gk.tinypilotkvm.com/community/available-update
    {"version":"725b1a1"}
    
    • We theoretically could have just used a Github API for this, but we’re going to use the same mechanism for TinyPilot Pro, which is not in a public Github repo

Customer support

  • Reviewed a rewrite of our remote.it tutorial
    • remote.it had changed their signup flow, so our previous tutorial was out of date
  • Added an “out of date” warning to our Voyager 1 instructions
    • We had a Voyager 2 customer who was confused because they must have found them through Google looking for the current instructions
  • Took over a support ticket with an upset customer

For the week ending Friday, Jun 17, 2022

Management

  • Three 1:1s
  • Sync meeting with EE partner
  • Called MA Department of Unemployment Assistance to ask why they keep sending TinyPilot incomprehensible notices
    • Phone rep was not helpful
  • Reviewed new office lease
  • Continued my Quixotic search for a good accountant in MA

Software development

  • Worked on our update overhaul
  • Helped investigate how to improve the sync between TinyPilot Community and TinyPilot Pro git repos
  • Fixed a minor bug on the TinyPilot sales site
    • It was saying “Ships in 1-3 business days” for TinyPilot Pro even though it’s an instant download

Customer support

  • Reviewed a revised tutorial for integrating remote.it with TinyPilot

Sales

  • Met with medical devices startup interested in using TinyPilot
  • Met with large customer
  • Sent proactive outreach email to a large customer
  • Tried running Amazon ads
  • Call with Amazon account manager to discuss getting started on Amazon
    • All of his suggestions coincidentally involved giving Amazon more money

For the week ending Friday, Jun 10, 2022

Management

  • Reviewed TinyPilot’s EULA with a lawyer.
  • Had postmortem meeting with design agency who did TinyPilot website.

Software development

  • Switched over to the new Go-based service for validating user licenses when they request a download image.
  • Added an option to the TinyPilot Ansible role for installing from a Debian package
  • Created a scratch implementation of a TinyPilot Debian package
  • Put my Shopify theme under source control.
    • I didn’t realize how easy it was to do this, but it only took about 15 minutes.
    • I always expected this to be a confusing, heavyweight process like almost everything else is on Shopify when you try to go outside the 80% usage case.
  • Set up a storage bucket to support our new process of distributing TinyPilot updates
  • Reviewed migration plans to upgrade the TinyPilot base OS to Debian Bullseye
  • Fixed a build break in uStreamer Ansible Role
  • Reviewed plans to adjust our git sync script between TinyPilot Community and TinyPilot Pro

Customer support

  • Worked with a large customer on a custom order
  • Adjusted wording on certificate install instructions based on customer feedback

Sales

  • Worked with digital marketing freelancer to get several new ad campaigns running.
  • Updated product comparison pages
  • Removed an old TinyPilot job listing that Google was automagically including in my ads
  • Continued jumping through ridiculous hoops with Amazon to get listed
    • They’re now claiming that in my photos, it’s not obvious enough that the word “TinyPilot” is permanently attached to my product. It’s embossed on there!

For the week ending Friday, Jun 3, 2022

Management

  • Two 1:1s with teammates
  • Prepared agenda for closing call with design agency

Software development

  • Continued porting our license check REST endpoint from Python to Go.
  • Reviewed plans to create a TinyPilot install package.
  • Reviewed changes to TinyPilot product page
  • That page officially concludes TinyPilot’s website redesign, which took eight months and cost $48k
    • It was supposed to be two months and cost $10-15k
  • Fixed a modal dialog that we accidentally broke during the website redesign
  • Added git pre-commit hooks to the TinyPilot website

Customer support

  • Wrote instructions on recording screen captures
  • Updated latency FAQ with instructions on trying H264 over WebRTC

Sales

  • Reached out to a large distributor about a partnership
  • Met with marketing freelancer
  • Worked with large customer on a custom order
  • Wrote instructions for how to do proactive customer outreach
  • Reviewed new demo GIF on the website
    • This is a re-recording of the same scenario but with our new logo

For the week ending Friday, May 27, 2022

Management

  • Reviewed TinyPilot’s EULA with an IP lawyer
  • Led TinyPilot mothly dev meeting
  • TinyPilot lunch with local team
  • Reviewed Google Ads performance
    • It’s doing worse than last month.
    • ROAS was at 2.45 last month. Now it’s at 2.03 for May and 1.92 for the last couple of weeks.

Software development

  • Reviewed update overhaul plan
  • Reviewed proof-of-concept for new TinyPilot install bundle creator
  • Investigated keygen.sh as a licensing solution for TinyPilot
  • Continued porting TinyPilot’s license check web service from Python to Golang
    • Really enjoying the process, as Golang fits this problem in a pretty elegant way
  • Added a better error message for expired licenses on the license check page
    • Users were emailing support not sure what to do when they got a license expired error, and I realized we needed to show them a link for where they could renew their license.
  • Reviewed migration to pre-built Janus Debian package
    • This reduces a 20-30 min process of compiling code from source to a few seconds of installing pre-compiled binaries.
  • Reviewed a fix for a bug in the logout button on Pro
  • Refactored about page implementation

Sales

  • Worked with a large customer on a custom order
  • Continued the search for a marketing agency / freelancer
  • Continued trying to set up an Amazon Seller account
    • Got my address verified, but then they needed to verify my credit card (which takes 24 hours for some reason)
    • Got my credit card verified, and now they need to verify that I can use the brand name “TinyPilot” which takes up to 72 hours…
  • Revised feature bullets for the Voyager 2 on the sales page

For the week ending Friday, May 20, 2022

Management

  • Four 1:1s with team
  • Reached out to lawyer for a review of our EULA
  • Worked with landlord on a lease renewal
  • Reviewed performance on search ads
    • Much less promising than the initial few weeks.
    • Google is down to roughly breakeven after cost of ads and raw materials.
    • Bing cost $700 and yielded 0 sales in the last two weeks

Software development

  • Finished implementing an About page in the TinyPilot web app for showing version information and crediting open-source dependencies
    • This was surprisingly hard!
    • It’s hard to track down all the dependencies and then organize their information in a sensible way.
  • Reviewed design overhaul of shopping cart page
  • Started porting our Python license check web service to Golang
    • We want to add more sophistication to it, including supporting multiple backends, so Go will make that much easier.
    • Plus, it currently runs as a Google Cloud Function, and I’d much rather run it under the much simpler fly.io infrastructure.
  • Reviewed PR to build a Debian package for Janus on CircleCI

Customer support

  • Added an entry in the playbook about how to answer the question “Will TinyPilot work on my device?”

Sales

  • Published blog post announcing May 2022 update
  • Sent blog post to mailing list subscribers
  • Researched becoming an Amazon seller
  • Signed up for an Amazon Seller account
    • It’s a weird process.
    • I still have to wait another week to get a postcard from them to verify my address.
  • Registered UPCs for TinyPilot Voyager 2

For the week ending Friday, May 13, 2022

Management

  • Hired a marketing agency.
  • Met with another indie hardware founder.
  • Reached out to a different indie hardware founder through Hacker News.

Software development

Sales

  • Paid affiliates for March sales.

For the week ending Friday, May 6, 2022

Management

  • Two 1:1s
  • Interviewed marketing agency
  • Terminated contract with design agency

Software development

  • Reviewed design change to TinyPilot homepage

For the week ending Friday, Apr 29, 2022

Management

  • Led TinyPilot monthly dev meeting
  • Planned next TinyPilot dev sprint
  • 1:1 with EU distributor
  • Interviewed marketing agency
  • Coordinated production with EE partner on hardware revisions
  • Team lunch with local staff
  • Started exploring process for coordinating license checks with EU distributor
  • Spec’ed out documentation tasks

Software development

  • Cut a release candidate for TinyPilot Pro 2.4.1
  • Reviewed changes to TinyPilot website
    • Before
    • After
    • It’s kind of a one-step-back, two-steps-forward kind of deal because the first step was to overhaul our bootstrap theme to share code more consistently across pages, and next we’ll start applying the new designs.
    • The neon green, in particular, should be gone soon
  • Reviewed Ansible change to make Janus WebSockets port configurable
  • Helped with small tasks to wrap up H264 implementation
  • Started working on an About page
  • Created a stub implementation of a Janus Debian package
  • Fixed alignment on product instruction cards
  • Refactored event handling in TinyPilot navbar
  • Adjusted markdown linter to include the main project README.md

Customer support

Sales

  • Sent a TinyPilot to a reviewer
  • Shared Google search ads setup with EU distributor
  • My stats so far
    • Ad spend: $459.97
    • Impressions: 3.75k
    • Clicks: 244
    • Conversions: 3
    • Revenue from conversions: $1,314
    • ROAS: 2.85 (I get $2.85 of revenue for every $1 I spend on ads)
  • Shared TinyPilot Pro 2.4.1 release candidate with large customer

For the week ending Friday, Apr 22, 2022

Management

  • Review hardware design changes to Voyager 2 to improve manufacturability
  • Had three 1:1s
  • Organized a recurring monthly dev team meeting
    • My previous system was to align them with the ends of sprints, but I always forgot or ran late
    • A recurring monthly meeting is much better
  • Arranged team lunch for local staff
  • Complained to Deel about how they’re screwing up payments

Software development

  • Cut new beta release of TinyPilot Pro 2.4.1
  • Fixed a bug that was adding clutter to our debug logs
  • Experimented with building Debian packages

Customer support

  • Tweaked language on TinyPilot install documentation based on user feedback
  • Updated a large customer about our progress with H264

Sales

  • Interviewed a marketing agency
    • Not a fit, they were way too big, mismatched for me
  • Reached out to two other marketing agencies
    • No response - I suspect I’m too small for them
    • I feel like I’m going to end up hiring through Upwork, which I’m not excited about.
  • Arranged a product review with a homelab blogger
  • Offered a Voyager 2 to a YouTuber who had previously reviewed TinyPilot
    • He wasn’t interested
  • Reached out to a large customer
  • Started running ads on Microsoft Ad Center
    • Only 4 clicks in 3 days.
    • 0 conversions
    • Much harder to use than Google Ads

For the week ending Friday, Apr 15, 2022

Management

  • Three 1:1s

Software development

  • Reviewed PRs to refactor CSS on TinyPilot website.
  • Reviewed and edited documentation for H264 on uStreamer and contributed it upstream
  • Added a markdown linter to CI for the TinyPilot website

Customer support

  • Reviewed a tutorial for setting a static IP
  • Investigated how to do returns for international orders

Sales

  • Reached out to several marketing agencies to set up intro calls
  • Tried a test campaign with Google Ads
  • Asked around for marketing agency recommendations
  • Evaluated how many customers purchase AC adaptors
    • I unbundled AC adaptors from TinyPilot a few weeks ago since the PoE model doesn’t strictly need it, and some customers don’t want an extra one.
    • I did a two-week review to see if we should keep the change.
    • For the non-PoE version, we sold 23% without an AC adaptor
    • For the PoE version, we sold 48% without the AC adaptor
    • It seems like customers do have preferences, so we’re going to keep it unbundled and give customers the option.

For the week ending Friday, Apr 8, 2022

Management

  • Gave feedback to design agency about issues in March.
  • Met with EE partner to discuss manufacturing strategy.
  • Met with advisor from FORGE.

Software development

  • Reviewed design agency’s refactoring work on TinyPilot website
  • Reviewed documentation for H264 support
  • Fixed code comments in e2e website tests for consistency.

Customer support

  • Fixed a bug in the instructions for a factory reset.
  • Set up TinyPilot’s support engineer with HelpScout.

Sales

For the week ending Friday, Apr 1, 2022

Management

  • Met with an intellectual property lawyer
  • Met with another indie hardware founder
  • Experimented with a new inventory management service for tracking electronic components with my EE vendor
  • 1:1s with two developers and support engineer
  • Continued working with my accountant on 2021 tax returns
    • I prepared everything in early March, so I’m not the slowpoke!

Software development

  • Fixed a bug in TinyPilot’s online license checker
  • Reviewed Ansible role changes to install a WebRTC server to support TinyPilot streaming over H264
  • Reviewed bugfix changes to TinyPilot’s website.
  • Experimented with netbooting a Raspberry Pi
    • Really confusing because the process keeps changing, so it’s hard to find an up-to-date guide.
  • Updated TinyPilot’s PicoShare instance to 1.0.5

Customer support

Sales

  • Published blog post announcing TinyPilot’s March update
  • Added nice 3D-rendered images of the Voyager 2 to replace my amateur photos
    • Before
    • After (we’re going to fix the excessive whitespace)
  • Unbundled TinyPilot’s power adaptor from the Voyager 2, so now it’s an optional add-on.
    • The power adaptor has always been a pain because some customers don’t want one (especially outside the US), and some do.
    • Customers who order the PoE version don’t really need a power adaptor, so we made it optional.
    • Surprisingly, almost everyone who orders chooses to order the power adaptor, so I might end up rolling this back and including it by default for everyone just for the sake of simplicity.
  • Reached out to a large customer.

For the week ending Friday, Mar 25, 2022

Management

  • Lunch with local staff
  • Two 1:1s

Software development

  • Cut releases of TinyPilot Pro 2.4.0 and TinyPilot Community 1.7.0
  • Changed logic on website for add-on products.
    • Previously, add-ons were first-class products that you could buy on their own.
    • Once you added a product and add-on to the cart, there was no relationship between them any longer.
    • The new site design calls for add-ons to be associated with a parent product in the UI, so I refactored the code to make that easier, but I’m leaving the design polish to the design agency.
    • Screenshots
  • Upgraded a bunch of npm packages on the TinyPilot sales site
    • I was seeing random runtime failures that seemed to be based on undefined behavior in the build, so I blindly started upgrading a lot of old packages in desperate hopes that they’d magically fix it.
    • My fixes didn’t work, but a dev on the design agency spotted the root cause and submitted a 5-line fix.
  • Reviewed two small PRs for TinyPilot website.
  • Submitted a minor patch to an upstream Ansible role repo
    • Just a feeler to see if it’s worth bothering to upstream more of our work
  • Fixed whitespace issues in our ansible-role-janus-gateway fork.

Customer support

Sales

  • Call with large customer

For the week ending Friday, Mar 18, 2022

Management

  • Met with EE vendor
  • Two 1:1s
  • Moved one developer to new payment platform
  • Extended lease for office space
  • Scheduled team lunch

Software development

  • Cut the first release candidate of TinyPilot Pro 2.4.0
  • Began prepping website for publication of 2.4.0 release
  • Improved instructions for make-edid
  • Simplified website code for removing an item from the cart
  • Consolidated Github permissions so that all the developers have permissions at the org level rather than at the repo level

Customer support

  • Created a separate support queue for technical questions that the customer service team isn’t sure how to answer
  • Added internal documentation about EDIDs

Sales

  • Reached out to YouTube creator about reviewing TinyPilot Voyager 2

Hiring

  • Followed up with remaining candidates who were still in the application process for Support Engineer
    • None of them ended up being a good fit beyond my first hire

For the week ending Friday, Mar 11, 2022

Management

  • 1:1s with three team members
  • Did monthly bookkeeping
  • Worked on order unstuck with Chinese manufacturer

Software development

  • Refactored some code on the checkout page.
    • An external design agency is about to start working on it, and the code is in such a confusing state that I worried it would be too complicated for them to take it over without some refactoring.
  • Reviewed changes to the uStreamer ansible role

Sales

  • Gave customer an updated estimate about our upcoming H264 feature

Customer support

  • Continued working with TinyPilot’s new support engineer on ramping up
  • Assigned TinyPilot’s support engineer his first tutorial.

Product research

  • Had collaboration call between EE design vendor and our new manufacturer.

Hiring

  • Responded to all the support engineer candidates that I hadn’t responded to yet.

For the week ending Friday, Mar 4, 2022

Management

  • Onboarded design/dev firm to begin doing dev work on TinyPilot website
    • Previously, they were doing design only, and we were handling the implementation ourselves, but we’re going to try having them do implementation as well.
  • Reviewed new Jira workflows with our new electrical engineering partner.
  • Finished reviewing contract for new electrical engineering partner
  • Coordinated with our manufacturer about an upcoming order
  • Coordinated development for our H264 integration

Hiring

  • Finished creating a contract and sending payment to TinyPilot’s first Support Engineer
  • Continued editing onboarding docs for Support Engineers
  • Continued processing applications
    • I tell candidates that I’m running a trial hire, but they can continue with the application and be on my shortlist if I decide to add another engineer or if the trial hire doesn’t work out.

Customer support

Product research

  • Applied for a grant to fund development of the TinyPilot Voyager 3
    • A local nonprofit is awarding grants for businesses that are changing their designs or processes to work around supply chain shortages.

Sales

  • Launched Voyager 2 PoE
  • Reviewed new website designs
  • Reviewed new product images for the website

For the week ending Friday, Feb 25, 2022

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

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

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

For the week ending Friday, Feb 18, 2022

Management

  • Led monthly dev team meeting
  • Adjusted project planning with design firm
  • 1:1 with local staff member
  • Resolved missing tax filing
    • Justworks (my former PEO) failed to submit the proper paperwork for 2021Q4 and it was a huge hassle to get it resolved

Hiring

  • Started a trial hire with a Support Engineer
  • Wrote onboarding documentation for Support Engineer position
  • Continued screening Support Engineer candidates
  • Stats so far
    • Total applications: 175 (+26 from last week)
    • Unreviewed applications: 40 (-19 from last week)
    • Hard rejected at cover letter/resume stage (no letter or didn’t meet requirements, so I didn’t send a response): 96 (+21 from last week)
    • Soft rejected at cover letter stage (they sent a detailed note, so I sent a personalized note back): 30 (+22 from last week)
    • Passed cover letter/resume screen, pending sample question responses: 3 (-2 from last week)
    • Rejected at sample question stage: 5 (+3 from last week)
    • Trial hire: 1 (+1 from last week)

Software development

  • Weighed in on database architecture changes
  • Reviewed PR to implement new footer design on website
  • Investigated why customers were reporting that they couldn’t complete checkouts because Shopify reported “Throttled” error
    • Turned out to be a Shopify bug that they resolved overnight
  • Wrote guidelines for writing end-to-end tests for the TinyPilot sales site
  • Tried unsuccessfully to get TinyPilot to send the KEY_SWITCHVIDEOMODE key
  • Investigated why AppEngine is incorrectly geolocating my EU distributor’s test machine in an EU data center.
  • Documented the source for USB HID keycodes

Customer support

  • Updated documentation on handling refund requests
  • Continued working on tech support decision tree

Product research

  • Shipped PoE HATs to EE partner to repair throttling issue

For the week ending Friday, Feb 11, 2022

Management

  • Met with peer founder to discuss management
  • Had 1:1 with two members of dev team one member of local staff
  • Met with EU distributor
  • Raised issues with design firm about problems with the website redesign project
  • Investigated why Gusto was underpaying employees
    • It turns out that Gusto’s “Payroll Autopilot” is so automatic that it silently ignores
    • Employers who have employees with variable hours therefore can’t use Payroll Autopilot
    • Gusto’s actual process is that every two weeks, I go into Gusto approve hours in two separate pages so that TinyPilot employees get paid accurately.
  • Helped fix an issue with Shopify’s shipping rates
  • Started planning TinyPilot’s next dev team meeting
  • Organized team lunch with TinyPilot local staff
  • Reviewed inventory targets

Hiring

  • Continued reviewing applications for TinyPilot Support Engineer role
  • Stats so far
    • Unreviewed applications: 59
    • Hard rejected at cover letter/resume stage (no letter or didn’t meet requirements, so I didn’t send a response): 75
    • Soft rejected at cover letter stage (they sent a detailed note, so I sent a personalized note back): 8
    • Rejected at sample question stage: 2
    • Passed cover letter/resume screen, still under consideration: 5

Software development

Customer support

  • Started making a flowchart of common technical support sequences
    • I’m hoping to turn this into a self-help tool
  • Started sponsoring flowchart.fun, a nice tool for making flowcharts out of text

Product research

  • Met with electrical engineering partner to discuss manufacturing

For the week ending Friday, Feb 4, 2022

Management

  • 1:1 with member of development team
  • Shared TinyPilot support engineer job listing more widely
    • Twitter
    • Hacker News
    • We Work Remotely
      • I heard positive things about We Work Remotely, but so far (five hours in), I’ve gotten 10 applications that were just generic copy/paste spam and two spam solicitations from other job boards.
    • Sent declines to two applicants (who found the job from Twitter) who wrote thoughtful cover letters but weren’t a good match.
  • Continued working on transition to new EE vendor
  • Synced with 3D printing vendor about case changes
  • Fixed a bug in my bookkeeping scripts for recording payroll
    • I was recording all payments to my payroll provider, but I wanted to split out the separate amounts I was paying for the service itself, wages, and worker’s comp.
  • Paid affiliates for referrals

Software development

  • Reviewed a PR to implement the navbar from the new site design
  • Reviewed a design proposal to change how TinyPilot handles database connections.
  • Tested proof of concept for H264/WebRTC implementation
  • Reviewed and revised documentation for H264 implementation
  • Fixed DKIM records for Amazon SES (mailing list)

Sales

  • Iterated on new website graphics with design firm

For the week ending Friday, Jan 28, 2022

Management

  • 1:1 with member of local staff
  • Wrote job posting for a technical support role
    • Haven’t really shared it anywhere yet.
  • Scheduled office lunch

Software development

  • Iterated on design doc to overhaul update workflow
  • Reviewed a PR to redesign the menu bar to match the new site design
  • Cut a beta release of the latest TinyPilot image
  • Tested proof of concept of H264 integration

Product research

  • Worked with EE vendor to resolve a heat issue with the Voyager 2 PoE HATs.
  • Documented the testing process for Voyager 2 PoE HATs.
  • Worked with 3D printing designer on improving Voyager 2 case.

Sales

  • Wrote a spec for a custom graphic on the TinyPilot home page
  • Responded to a customer interested in an Enterprise plan

For the week ending Friday, Jan 21, 2022

Management

  • Led handoff meeting between old and new EE vendors.
  • Had 1:1 with local staff member.
  • Placed orders for new manufactures to (hopefully) get in before Chinese New Year.
  • Started December bookkeeping for TinyPilot
    • Hit a big gotcha in beancount, where it apparently drops transactions silently if it thinks they’re duplicates, even when the dates and transaction amounts differ.
    • Also found a bug in my Mercury’s (business checking) website where the balance on my statements doesn’t match the balance on my dashboard.
  • Introduced TinyPilot Book Club
    • Program for TinyPilot to pay for books local fulfillment staff are interested in reading for work.

Software development

  • Revised a design document for an overhaul of TinyPilot’s update process.
    • Our current update process is very convoluted and difficult to reason about, so we’re rearchitecting it to be something simpler.
    • The toughest part is roadmapping the transition to the new system without breaking legacy clients.
  • Reviewed a PR that fixes a bug in Hobbyist Kit upgrades
  • Reviewed a PR to unbundle the power adaptor from the TinyPilot Voyager 2.
    • It’s always created confusion for non-US customers, and when we release the PoE version, it won’t make sense to bundle a power adaptor with every order.
  • Added unit test for a REST endpoint I added a year ago.
    • Another change almost silently broke the endpoint (caught during code review), but it would have been better to catch it through unit tests.
  • Removed stray   characters from Markdown files on the website and added a build check to prevent them from sneaking back in.
  • Reviewed a PR to fix a UI bug on the website.

Customer support

Product research

  • Worked with EE vendors on testing plan for Voyager 2 PoE.

Sales

  • Resumed accepting orders.
    • We had to temporarily shut down orders because we ran out of inventory.
  • Reviewed a PR that changed the TinyPilot website fonts
    • Before
    • After
    • It looks a little weird right now because it’s the new font on the old site design, but we’ll be incrementally moving to a much better design over the next few weeks.

For the week ending Friday, Jan 14, 2022

Management

  • Started the handoff process with my two EE vendors of transitioning from the previous vendor to the new vendor
  • 1:1 with local staff member
  • 1:1 with developer
  • Continued getting the wrinkles ironed out on Gusto

Software development

  • Published TinyPilot Pro 2.3.2 release
  • Led January dev meeting
  • Weighed in on a few style / architecture decisions
  • Reviewed early work on adding H264 support for video streaming
  • Reviewed changes to add Voyager 2 PoE as an option on the TinyPilot sales site
  • Migrated from CodeTree to Github Projects Beta
    • I’d really like to support a niche indie site, but CodeTree seems to be effectively unmaintained at this point

Customer support

  • Updated customer instructions now that TinyPilot ships with SSH disabled by default

Product research

  • Iterated on manual testing plan for Voyager 2 PoE edition

Sales

  • Iterated on new site redesign.

For the week ending Friday, Jan 7, 2022

Management

  • Started process of transitioning to a new EE partner.
  • Had emails/calls with design partner to get back in sync on project structure.
  • 1:1 with developer

Software development

  • Reviewed a proposal to rearchitect TinyPilot’s authentication logic.
  • Reviewed a proposal to introduce database migrations to TinyPilot.
  • Fixed a bug in TinyPilot’s image build script.
  • Reviewed a PR to add a PoE option to the Voyager 2 on the website.
  • Reviewed a PR to refactor the checkout code.
  • Removed some dead code from the website related to reddit event tracking.

Product research

  • Continued preparing for launch of Voyager 2 PoE

For the week ending Friday, Dec 31, 2021

Management

  • Completed migration to Gusto for payroll
  • Paid estimated taxes

Software development

Product research

  • Reviewed new Voyager 2 case prototypes

Customer support

  • Caught up on a lot of customer support from my vacation week.

Sales

  • Updated logo for TinyPilot Pro product
    • I had forgotten to apply the new logo when I added it to the rest of the site

For the week ending Friday, Dec 17, 2021

Sales

  • Debuted TinyPilot’s new logo
  • Bumped the Voyager 2 price up $10 to $389
    • We were selling faster than we could make them, so this was an attempt to balance it out.
    • Sales have dropped by ~80% since the change, but it’s too early to tell and potentially just a side-effect of holiday slowdown.

Management

  • Added a 401(k) plan for TinyPilot’s fulfillment staff.
  • Coordinated with EU distributor about starting to sell Voyager 2.
  • Continued migrating to Gusto
  • 1:1 with local staff member
  • Sync with EE partner about Voyager 2 production
  • Did monthly bookkeeping
  • Wrote internal guidelines for how TinyPilot handles employee vacations.
    • Clarifying that people are expected to stay away from work email on vacation.
  • Arranged holiday gifts for local staff.
  • Issued 1099s to TinyPilot vendors.
  • Paid TinyPilot’s MA sales tax
    • And added a quarterly reminder so I stop forgetting to pay sales tax.
  • Sent affiliate payments for December.

Software development

  • Added TinyPilot logo to the web app
  • Shuffled things around so that we can publish our next release in early January.
    • The PoE Voyager 2 will be ready in early January, and I want it to ship with software that has the new logo.
  • Fixed a bug in TinyPilot’s license check for re-downloading microSD images.
    • I forgot to enable TinyPilot Pro backup image downloads for Voyager 2 customers, so I fixed that.
    • Then I had the bright idea to simplify how we were storing product IDs, and I broke everything for about an hour.
    • Fortunately, it’s a low-traffic service, so I don’t think anyone was impacted.
  • Fixed a bug in the TinyPilot ansible role that can fail an update if the user has upgraded their kernel since the last reboot.
  • Reviewed a PR that disables SSH by default in TinyPilot microSD images.
  • Fixed a horizontal scrolling bug on TinyPilot blog on small viewports.

Customer support

  • Wrote internal guidelines for how to handle refund or replacement requests.

Product research

  • Met with EE firms about next iteration of TinyPilot’s hardware
  • Made small adjustment to Voyager 2 case to facilitate assembly.

For the week ending Friday, Dec 10, 2021

Sales

  • Launched Voyager 2
  • Updated website to mention Voyager 2 instead of Voyager 1
  • Continued discussion with company interested in an Enterprise license
  • Continued iterating on TinyPilot logo with design team

Management

  • Continued payroll migration from Justworks to Gusto
  • 1:1 with H264 developer
  • Met with 3D printing vendor
  • Met with a solo founder who might be interested in freelancing with TinyPilot
  • Met with another eCommerce founder
  • Managed parts order backlog
  • Coordinated parts shipment to EU distributor

Software development

  • Added Netlify to our CI of the TinyPilot sales site so that we can see live drafts before pushing to prod
  • Reviewed PRs to improve the UI of the Enterprise REST API
  • Cut a release of TinyPilot Pro 2.4.0-beta1

Customer support

For the week ending Friday, Dec 3, 2021

Management

  • Prepared processes for the Voyager 2 launch
  • Scrambled to fix a part shortage
    • We almost had to stop sales because we ran out of tiny ribbon cables!
    • Fortunately, our vendor expedited our order and got it to us within days.
  • Continued onboarding with Gusto and started offboarding with Justworks
  • 1:1 with developer
  • 1:1 with local staff member
  • Sync meeting with distributor
  • Sync meeting with 3D printing vendor
  • Sync meeting with EE vendor

Software development

  • Reviewed a PR that adds custom logging messages for sensitive data
    • We routinely ask users to upload their logs when asking for support in the help forum, so we want to make it easy for them to remove sensitive data from their logs like usernames or keystrokes.
  • Reviewed a Github Action to auto-merge changes from TinyPilot Community -> TinyPilot Pro
    • This used to be a tedious, manual job that fell to me
    • Now, we have it set up
  • Worked on design document for overhaul of TinyPilot’s update/install system
  • Fixed pylint’s rules so that long lines are okay for URL strings
    • Our style guide says they’re okay, and pylint makes exceptions for URLs, but it’s default exception is very narrow.
  • Got rid of pylint rules that were redundant to our other linters
  • Reformatted pylintrc for readability

Customer support

Product research

  • Met with EE vendors for Voyager 3 design

Sales

  • Met with potential enterprise customer

Misc

  • Fixed a break in the office printer
    • It turned out that the Pi we were using as a print server crashed and needed to be rebooted

For the week ending Friday, Nov 26, 2021

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

Customer support

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

For the week ending Friday, Nov 19, 2021

Management

  • Continued preparing for Voyager 2 launch
  • Sync with 3D printing lab about our increased sales pace
  • Started the process of moving away from Justworks for payroll management
    • They’re such a pain to work with, and I’m so glad to be done with them soon.
    • I’m leaning toward Gusto, but if anyone has recommendations for others, let me know. I have simple needs - just two W2 employees in the US.
  • 1:1 with both members of local staff
  • 1:1 with developer
  • Met with EE vendor for Voyager 2
  • Talked to a new developer about a one-off project on TinyPilot
  • Worked with local staff on holiday hours for Thanksgiving

Software development

  • Cut the 2.3.1 release of TinyPilot Pro
  • Worked with another TinyPilot developer in reimplementing our TinyPilot image building workflow in Packer
    • Packer’s really cool! It uses qemu to let you emulate a Raspberry Pi device and run scripts to run within the Raspberry Pi OS environment to prepare a custom Pi image.
    • Before, we were using a tool called vdesktop to run Raspberry Pi OS effectively as a “VM” within a Pi, but it required the host system to be an actual Raspberry Pi, so it was complicated to provision a Pi cloud server and then run the build.
    • It took the image building process from ~8 manual steps and 40 minutes to just 2 manual steps and 20 minutes.
  • Changed image builds to go to Backblaze instead of saving them on CircleCI
    • Warning: Never store large files on CircleCI. They charge insane storage rates and don’t let you delete files for 30 days. They’re charging me $15/day to store ~20 GB of data. I reached out to customer support to see if they’ll delete the files manually.
  • Fixed a bug in handling two Numpad keys
  • Added a debug log message for investigating keystroke bugs

Customer support

  • Handled a complicated customer return
    • A customer suspected their Pi was dead
      • This never is the case; it’s always something else
      • It turns out: their Pi was dead.
  • Investigated a bug on fr-ca keyboards

Product research

  • Met with engineering firm about Voyager 3

Sales

  • Responded to an inquiry about a new partnership
  • Temporarily marked the TinyPilot Power Connector as out of stock, as we’re selling Voyagers much faster than we expected, and I’m afraid we’ll run out if we sell one-offs.

Misc

  • Finally bought a Mac Mini for testing
    • My first time owning a Mac in ~30 years
  • Tweaked the configuration on the office test machines to run our end-to-end tests in incognito mode
    • I realized that state from previous runs was bleeding through
  • Sent a bunch of documentation to eBay so they’d release my payments that they suddenly decided to hold for no reason.

For the week ending Friday, Nov 12, 2021

Management

  • Finalized task list for next dev sprint
  • 1:1 with developer
  • Met with 3D print designer
  • Did monthly bookkeeping

Software development

Product research

  • Reached out to an open-source developer about adding H264 support to TinyPilot.

Sales

  • Met with a customer interested in the TinyPilot Enterprise API
  • Wrote internal instructions for shipping orders to our EU distributor

Misc

  • Adjusted TinyPilot’s office setup so that we don’t have to run a full-blown HP rack server 24/7
    • The rack server was serving a few functions that needed to run 24/7, but I moved those services to a dedicated Pi server
    • Updated test machines to point to the new server
  • Got a refund on 150 power supplies I bought for the Voyager 2 but realized they were over-voltage.
    • Negotiated a bulk rate with a different vendor. This time I tested the voltage on one before spending $1k.

For the week ending Friday, Nov 5, 2021

Management

  • Led TinyPilot’s development sprint meeting
  • Met with EE vendor to figure out remaining tasks for Voyager 2
  • Continued speaking with EE vendors about starting Voyager 3
  • 1:1 with local staff member

Software development

  • Struggled to figure out why I couldn’t git clone from my Windows machine even though SSH worked
    • It turns out that Git was using a different version of SSH that couldn’t communicate with the ssh-agent that’s built-in to Windows
    • Tip: You can debug the SSH connection by running GIT_SSH_COMMAND='ssh -v', or on Windows: $env:GIT_SSH_COMMAND = 'ssh.exe -v'
    • Solution: Point git at the system-native SSH binary: git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe
  • Reviewed development work to build the TinyPilot image using Packer
    • I’m having trouble actually running the code. My proxmox machine doesn’t have the loop kernel module loaded, and I’m not sure how to load one. We’re using functionality that isn’t implemented in Windows’ Docker implementation.
    • I’m trying to run it under Docker. I haven’t yet tried running it directly, which could work better.
  • Reviewed PR to backport USB HID gadget fixes to TinyPilot
  • Wrote a simple Python script to calculate my monthly payments to affiliates

Customer support

  • Posted a workaround for users who want compatibility with non-networked KVMs
  • Caught up on a million emails after my vacation last week

Misc

  • Started migrating office server from a huge rack to a small Pi so we can turn off the rack most of the time

Sales

  • Met with design agency about rebranding
  • Met with EU distributor
  • Worked on amending distributor partnership contract
  • Reached out to customer interested in large rollout

For the week ending Friday, Oct 29, 2021

Management

  • 1:1 with developer
  • Worked with EU distributor on figuring out workflow for royalties

Customer support

  • Continued training staff to handle customer support.
  • Added an FAQ article about resetting your password.
  • Reorganized the FAQ page into categories
  • Proactively reached out to several recent customers for feedback
  • Added more internal documentation about customer support.

Product research

  • Met with EE vendor about starting work on Voyager 3

Sales

  • Met with marketing firm about potentially working together

For the week ending Friday, Oct 22, 2021

Management

  • Retired TinyPilot Hobbyist kit
    • Part of it is the Pi shortage
    • Part of it is rebranding to focus more on the plug 'n play aspect of TinyPilot
  • Simplified the website to sell just one product, the TinyPilot Voyager
  • After I got rid of the Hobbyist Kit, I took a critical look at the remaining products I listed:
    • TinyPilot Pro: Confuses customers because they’re not sure if they have to buy it in addition to the TinyPilot itself.
    • TinyPilot Power Connector: Similar problem. Customers aren’t sure if they’re supposed to buy it on top of the Voyager.
    • I decided to keep Pro and Power Connector pages live and purchaseable, but bury them more. There are still paths to those products, but it’s not what customers see when they first land on the site.
  • Planned out the home stretch to shipping the Voyager 2 in November.
  • Spoke to another founder with a similar Pi-based business
    • Got some good tips about emulating the Raspberry Pi from a non-ARM system and smoothing out our image building process
  • Worked with European distributor on a standard workflow for quarterly royalty payments
  • 1:1 with local staff
  • Started planning for November dev sprint meeting

Software development

  • Gave design feedback on the plan to overhaul TinyPilot’s install/update flow
  • Gave high-level feedback on a PR about SSH credential warnings
  • Cut a new beta release and prepared it for internal end-to-end testing

Customer support

  • Expanded customer support documentation.
  • Worked with local staff to start replying to customer inquiries.

Product research

  • Debugged an issue with the Voyager 2
    • The fan on the Voyager 2 prototype was incredibly loud, to the point where it was louder than any other device in my office.
    • I first thought maybe it was a difference in the case design, then we thought it could be due to the new PSU.
    • Finally, TinyPilot’s case designer asked me if I’d tried a different fan and… it turned out it was just a defective fan all along.
  • Wrote a requirements document for Voyager 3
  • Reached out to several EE firms about working on Voyager 3

Sales

  • Met with a digital marketing agency
  • Put out feelers for recommendations for marketing agencies / freelancers
  • Scheduled meeting with another digital marketing agency
  • Re-did TinyPilot ads on mtlynch.io to point to the Voyager instead of Hobbyist Kit
  • Started listing unused Hobbyist Kit parts on eBay

For the week ending Friday, Oct 15, 2021

Management

  • Began reaching out to marketing agencies
  • 1:1 with local staff member
  • Scheduled a virtual chat with another Pi company founder

Software development

  • Cut a release of 2.3.1beta1 for internal testing
  • Contributed a doc fix to uStreamer
  • Discovered another bad Gridsome bug on the TinyPilot website and reviewed the fix
  • Investigated paths out of the two dead frameworks powering the TinyPilot website (Gridsome and BootstrapVue)
    • Hard to find a decent path out!
    • I want to find a way to generate static pages out of Markdown but also write encapsulated HTML components
    • Results in brief
      • Nuxt: Nuxt2 has the same issues as Gridsome, Nuxt3 is still in beta and won’t even support Markdown until they start a rewrite for nuxt/content
        • Sidenote: I submitted a fix to their beta release announcement, and they accepted it quickly.
      • VuePress: Too optimized for developer docs
      • VitePress: Seems even more narrowly scoped, not yet out of alpha.
      • Gatsby: Probably the best support and ecosystem of any option, but I don’t really want to learn React and rewrite all my Vue code.
      • Hugo: Templating syntax is not so fun, doesn’t encapsulate HTML components.
      • Jekyll: Same problem with encapsulating HTML components, though it’s widely supported and stable.
      • 11ty: Same problem with encapsulation HTML components (I think?), and it’s maintained by a single person who could abandon it at any time

Customer support

  • Finished writing documentation for how TinyPilot customer support works
  • Added local staff members to TinyPilot’s shared inbox so that they can begin answering customer support emails

Product research

  • Started writing requirements doc for TinyPilot Voyager 3
  • Tested new case for TinyPilot Voyager 2

Sales

For the week ending Friday, Oct 8, 2021

Management

  • Two 1:1s with employees

Software development

Product research

  • Continued design work on TinyPilot Cloud
  • Met with EE team about next-gen hardware
  • Tested Voyager 2 case prototype

Sales

  • Two customer interviews
  • Continued working with design firm on TinyPilot rebrand

For the week ending Friday, Oct 1, 2021

Management

  • Did bookkeeping for August

Software development

Customer support

  • Worked with a customer to debug an issue with mouse latency/accuracy over high-latency network connections
    • Draft of the fix that gets rid of some ugly hacks and a third-party dependency
  • Restructured contact page to encourage users to use shared support channels instead of sending support requests directly to me
  • Continued work on a TinyPilot support handbook so that other TinyPilot employees can take on support requests
  • Clarified error message for users who try to get TinyPilot images but purchased through a reseller
  • Clarified error message for users whose TinyPilot Pro license expired

Product research

  • Tested prototype for next gen hardware
  • Experimented with Raritan’s demo
  • Requested a copy of Raritan’s GPL/LGPL code
    • They’re obnoxious about granting access, so I requested all of their KVM code for $45 and I’m planning to (legally) publish it to Github when I receive it

Sales

  • Met with design firm about branding
  • Met with customer about potential TinyPilot deployment
  • Scheduled a customer interview for next week

For the week ending Friday, Sep 24, 2021

Management

  • Three 1:1s with local staff and developers

Software development

  • Published the TinyPilot September release
  • Gave feedback to TinyPilot’s senior dev on TinyPilot Cloud’s design
  • Made a UI fix to the Ctrl+Alt+Del shortcut
  • Added a clearer error message to the TinyPilot license check service for when a user’s license is expired

Customer support

  • Researched an issue with a customer who wanted to capture at 1680x1050 resolution
  • Updated an old screenshot in the customer documentation

Product research

  • Sync’ed with EE partners on next gen hardware
  • Sync’ed with 3D printing lab about cases for the next gen hardware

Sales

  • Handled attention from Jeff Geerling’s review video
  • Began working with a design agency to start the process of rebranding TinyPilot
    • Recorded some demos to help them understand the product
    • Answered initial questions about what I’d like the brand to be
    • Made notes about which websites and brands I like
  • Interviewed an existing customer about their needs
  • Arranged a review unit to a homelab blogger

For the week ending Friday, Sep 17, 2021

Management

  • Met with designers about a redesign of the TinyPilot website
  • Met with a customer interested in a large TinyPilot rollout
  • 1:1 with local staff member
  • Wrote official license terms for the Pro version

Software development

  • Reached code complete on September release
  • Reviewed QA results for September release
  • Began the process of publishing September release
    • This is the first release with local staff helping me with QA and where we’re building it on cloud servers, so it’s a bit of adjustment to the new process.
  • Provided little bits of assistance on a new TinyPilot image building CI workflow
    • The process of building new production images for TinyPilot used to be really clunky and manual
    • TinyPilot dev Jason set it up so that now on every PR to our image-building repo, CircleCI spins up a bare metal Raspberry Pi in the cloud and uses it to do full production builds of both the Voyager and Hobbyist images.
    • It’s still kind of brittle and slow, but this is a big step forward.
    • I’m hoping that by the end of the year, we’ll have nightly builds so that we can flash a microSD at any time and it will have the latest development code on a pre-configured image.
  • Added some minor improvements to our build scripts
  • Documented how TinyPilot uses web components
  • Added pip3 to the base image, as I realized installing it was creating a bottleneck and network dependency during first-boot

Customer support

  • Added an FAQ article about using Chrome’s “app mode” to avoid the browser capturing certain hotkeys
  • Transitioned the support email address over to HelpScout (a shared inbox service)
    • I’m starting the process of scaling out customer support to my teammates

Product research

  • Worked with EE firm on next-gen hardware

Sales

  • Recorded a podcast interview
    • I was the guest. It should be out in ~3 weeks.
  • Proactively reached out to recent customers
  • Reorganized the product page into categories

For the week ending Friday, Sep 10, 2021

Management

  • Led sprint planning meeting
  • 1:1 with local staff member
  • Paid estimated taxes
  • Fixed mistake in previous sales tax payments
  • Defined bug labels we use in our projects

Software development

  • Updated QA instructions based on results from initial QA runs
  • Fiddled with CircleCI for a test that needs access to two repos
  • Documented the Google Cloud Function we use for managing subscriptions to our mailing list (via the EmailOctopus API)

Customer support

  • Started researching different “shared inbox” customer support solutions

Product research

  • Checked in with EE vendor about Voyager 2

Sales

  • Added some little tweaks to the TinyPilot website
    • Clicking the CTA (“Order Now”) takes you directly to the Voyager product page instead of the index of all products
    • Added a fourth review to the review carousel
    • Tweaked the layout of the review carousel
    • Re-styled the FAQ page: before vs. after
    • Make products in the shopping cart clickable
    • Fixed a UI bug that occurs when you empty the shopping cart
    • Removed underline when you hover over links
  • Reached out to 5-6 designers and firms about redesigning the TinyPilot website
  • Added a popup on the website for European users telling them about our European distributor
    • It seems like it’s working, as he got two new sales this week
  • Paid affiliates

For the week ending Friday, Sep 3, 2021

Management

  • Drafted high-level requirements doc for TinyPilot Cloud
  • Set up a process to allow local staff to manually test new TinyPilot releases
    • I’ve been doing this for each release, but there are enough features now that it takes a long time
  • Started planning for the next dev sprint
  • Bought and provisioned a new test laptop
  • Ordered microSD cards with TinyPilot logo

Software development

  • Wrote a simple geolocation service
    • It only took two hours!
    • With the new EU distributor, I want to pop up a notice telling EU customers they can buy from Europe instead, so I needed a way to determine if the user is visiting the site from Europe
    • I thought I could approximate it with JavaScript, but it turns out you can’t get the user’s installed language with only JS
    • AppEngine adds HTTP headers to every inbound request with geolocation information
    • My geolocation service just checks the country and matches it to a whitelist of countries that my EU distributor supports
    • I haven’t published the source because it contains TinyPilot-specific logic, but someone else has published a Java version
  • Reviewed a PR to add Pro upgrade paths into the free version of TinyPilot
  • Reviewed a PR that adds an X (“close”) button on all of our overlay dialog boxes
  • Reviewed a PR to integrate the geolocation API into the TinyPilot website
  • Removed an extraneous try/catch

Customer support

  • Spent a long time trying to figure out why a customer couldn’t resolve DNS addresses from their device

Sales

  • Added a PiKVM vs. TinyPilot page
  • Followed up with a YouTuber who never responded to my pitch to review TinyPilot.
    • Following up worked!
    • He’s interested, though it’s not yet a done deal.

For the week ending Friday, Aug 27, 2021

Management

  • 1:1s with two developers and member of local staff
  • Met with EU distributor about last steps to get sales going
  • Began prepping for next TinyPilot dev sprint
  • Unsuccessfully tried to provision a testing laptop with Ubuntu
    • It’s the first time I can remember encountering computer hardware where Ubuntu won’t install.
    • I couldn’t start the installer at all on Ubuntu 18 or 20.
    • I got the installer to run on Ubuntu 16, but when it finished the install, the OS just sits frozen
    • This was on a Dell XPS M1530 that I bought used since we only need it for occasional testing, but I guess I should have bought a laptop made within the last 10 years.

Software development

  • Cut two releases to fix an upgrade-blocking issue
    • I was too careless in the first release, as I pushed the fix without properly validating it
    • The issue is that because Debian 11 is now out, if you run apt-get update on Debian 10, it errors out because it wants you to explicitly accept that the apt repositories have switched from stable to oldstable
    • The fix is to add the flag --allow-releaseinfo-change-suite, which says, “Yes, it’s okay if stable switches to oldstable, I still want to update.”
  • Reviewed a PR that adds frontend unit tests to the build
  • Reviewed a PR that completes our migration from Mailchimp to EmailOctopus
  • Fixed a minor package compatibility warning
  • Fixed extraneous scrollbars on TinyPilot’s dialog overlays
  • Cut a beta release of the next TinyPilot version
  • Made minor improvements to our image building process

Product research

  • Met with EE vendor about Voyager 2

Sales

For the week ending Friday, Aug 20, 2021

Management

  • 1:1 with software developer

Software development

Product research

  • Tested prototype of Voyager 2 in prototype case
  • Met with EE vendor

Sales

  • Published a preview of the Voyager 2
  • Took photos of the Voyager’s custom case for an upcoming case study (no pun intended)
  • Gave feedback on changes to TinyPilot landing page

For the week ending Friday, Aug 13, 2021

Management

  • Continued working with EU distributor on spinning up sales from Germany
  • Worked on setting up a test machine so that local staff can QA TinyPilot releases
  • Had 1:1 with local staff member
  • Scheduled 1:1s with two developers
  • Realized I have to fix something stupid in my corporate registration to handle sales tax properly.
    • I’ve been accidentally overpaying sales tax on my purchases for the past year, but now MA thinks I owe them sales tax on my sales, so that’s going to be a fun thing to straighten out.

Software development

  • Code reviewed a new GCP cloud function for checking whether a user has a TinyPilot Pro license
    • It checks against the store data in Shopify.
  • Watched as TinyPilot’s developers code reviewed for each other and realized I should have been doing this long ago.
  • Gave feedback on UX for a new feature.

Customer support

  • Added self-serve downloads for the latest TinyPilot Pro image
    • The issue was that I can’t just publish the image for everyone since it’s reserved for customers, but we didn’t have a good way for customers to prove they were customers in an automated way.
    • The process in the past has always been for users to just email me, but I finally invested dev resources into automating it so that I’m no longer in the critical path.
  • Clarified product instructions for finding the TinyPilot web interface

Product research

  • Met with EE vendor about next-gen Voyager development

Sales

  • Reached out to two YouTube creators about a potential partnership
    • One declined, the other hasn’t responded, which seems like a bad sign.
    • I may have exhausted YouTube as a marketing channel.
  • Reviewed a redesign to the landing page that makes the feature brags more compact
  • Met with customer about potential enterprise feature
  • Continued firming up details for podcast appearance

Misc

  • Reached out to another Pi company about exchanging ideas

For the week ending Friday, Aug 6, 2021

Management

  • Continued working out process with EU distributor
  • Investigated some hiccups with customs on the first shipment to our distributor

Software development

  • Wrote a Go cloud function for TinyPilot’s EmailOctopus mailing list signup
    • I like EmailOctopus, but for whatever reason, they don’t offer a signup form HTML snippet that’s easy to style
    • I wrote my own REST API for signing up for the TinyPilot mailing list, using EmailOctopus’ API
    • I wrote a similar one for my blog, but the new one is prettier because it’s in elegant Go instead of disgusting Node
  • Experimented with playwright as a browser automation tool
    • The good
      • It is satisfyingly fast
      • It seems to run parallel tests by default
    • The bad
      • Documentation frequently omits important information
      • I couldn’t figure out how to use their official Docker images
      • Video recording seemed to randomly work and not work
      • Doesn’t seem to take screenshots on failure, which made me appreciate the value of that feature in Cypress
  • Investigated why TinyPilots ship with a New York timezone
    • It turns out that the images inherit the timezone from the build machine, which is in my home in MA
    • The next version will fix this accidentally because we just switched to cloud build servers in the UK

Customer support

Product research

  • Met with electrical engineers to discuss next generation hardware
  • Met with 3D print designer to discuss next generation case
  • Set up a call with a customer to discuss product direction

Sales

  • Pitched myself as a guest two podcast
    • One said yes, other hasn’t responded
  • Reviewed a redesign of the sales site footer
  • Paid affiliate commissions

For the week ending Friday, Jul 30, 2021

Management

  • Made more progress on contract with EU distributor
  • Send first batch of materials to EU distributor
  • Gave local employees dedicated TinyPilot email accounts
  • Filed an annual report for my LLC
  • Updated our stocktake workflow to happen weekly
  • Enabled tax-exempt status on my Amazon account
    • In my state, I’m exempt from taxes on raw materials because I manufacture them into taxable products that I resell, but not all vendors support this status.
    • I didn’t realize that Amazon supported this all along, and it takes 10 mins to turn it on.
    • I’ve probably paid $2k in needless taxes, but at least I’m stopping it now

Software development

  • Verified that teammates can build a TinyPilot production image
  • Added iptables rules to my build servers to limit access

Product research

  • Started the ball rolling again on the rack mount design

For the week ending Friday, Jul 23, 2021

Management

  • Continued working on distribution agreement with EU distributor
  • 1:1 with developer
  • Revised instructions for flagging late incoming orders with our new inventory system
  • Paid an annoying $4 UPS bill
    • Took me 20 minutes to figure out how to even pay it
    • I’m pretty sure they sent it to me by mistake since I never use UPS, but fighting it would cost way more than $4

Software development

  • Published a new release
  • Researched Pi server hosting options
    • I’ve been looking for this for a year and finally found two providers this week
    • IKoula
      • A little hard to get up and running
      • Fast customer support
      • Ostensibly has English support, but you end up seeing a lot of French language
    • Mythic Beasts
      • Easy to get up and running
      • Responsive customer support
      • Pretty good REST API
      • Super affordable pricing
  • Migrated our TinyPilot image building process to Mythic Beasts
    • I’d been doing it on a little Pi + SSD in the corner of my office and some hacked together scripts
    • Cleaned up the scripts a bit and made them reproducible by any other developer on the team
  • Reviewed PR to improve button style in web UI
  • Reviewed PRs to fix redundant file re-downloading issue
  • Had TinyPilot’s first PR where I wasn’t the reviewer
    • Before this, I’ve always reviewed 100% of PRs, but this was becoming impractical.
    • We’re switching to a system where everything still goes through code review, but devs can review each other’s work
    • We intended to do this earlier, but it was hard because the developers work part-time at different hours, so they’d have to wait for a review from each other, whereas I’m usually available to review within hours.
    • So new system is that PRs go to me if they’re urgent or affect UI, others get reviewed by other devs
  • Reviewed PR to add an “Add to Cart” button to products on the sales site from the product index
  • Reviewed a PR that adds a quantity adjust option to the checkout cart
  • Reviewed a PR that fixed an issue with images in the checkout cart on the website

Product research

  • Continued working with EE and 3D printing vendors on Voyager 2 design
  • Met with EE consultant about future projects

Sales

  • Reviewed design overhaul to TinyPilot sales site

For the week ending Friday, Jul 16, 2021

Management

  • Held the July sprint planning meeting
    • Finalized the list of features for next TinyPilot sprint
  • Migrated to a new inventory system and updated most of our documentation to match
    • For the first year, I’ve been using a home-grown spreadsheet that’s ever-increasing in complexity
  • Reviewed an internal to-do list that one of TinyPilot’s staffers made in Notion
  • Continued making plans with EU TinyPilot distributor
  • 1:1s with two local TinyPilot staff members and one remote developer
  • Reordered inventory

Software development

  • Cut a release candidate for the new version of TinyPilot
  • Began QA testing for the release candidate build
  • Gave feedback on work to display update logs in the TinyPilot UI
  • Reviewed a change to bring a mailing list signup form back to the TinyPilot footer
    • There was a weird Vue bug killing the whole site that seemed related to the mailing list signup, so I cut it two months ago and hadn’t had time to restore it safely.
  • Reviewed a change that allows the user to make HTTPS optional in TinyPilot Pro

Product research

  • Met with cloud vendor about possible TinyPilot Cloud collaboration
  • Continued coordinating with EE firm about Voyager 2

Sales

  • Reviewed a proposal for a redesign of the TinyPilot sales site

For the week ending Friday, Jul 9, 2021

Management

  • Hired a new developer to work on the TinyPilot website
  • Scheduled the next sprint planning meeting
  • Found a new accountant
  • 1:1 with one of TinyPilot’s developers
  • Wrote a spec describing my ideas for a redesign of the TinyPilot sales site

Software development

  • Investigated an issue where TinyPilot fails to redirect from HTTPS to HTTP
    • We still can’t figure it out, so suggestions welcome
    • On Chrome, if you visit http://tinypilot.local (plaintext) and click a link to https://tinypilot.local (TLS), it does two odd things
      • It excludes cookies when you click the link, but if you copy the link URL and paste it into the URL bar, it includes the link. It also sets the Sec-Fetch-Site header to cross-site, whereas when you type the URL directly, it’s set to none
      • This behavior doesn’t happen when you drop the .local domain from the URL (it includes the cookies in that case)
      • Additionally, when you have the .local suffix, instead of redirecting to HTTPS URLs, nginx redirects to plaintext HTTP URLs, but when you strip the .local suffix, it redirects to the correct HTTPS URLs
  • Reviewed PRs to allow TinyPilot users to relax the TLS requirement on their devices
  • Reviewed PRs for the REST API documentation
  • Paid monthly fees to my affiliates

Product research

  • Reached out to more EE firms about building a PoE HAT

For the week ending Friday, Jul 2, 2021

Management

  • Revised processes for weekly and monthly tasks now that two people are splitting them.
  • Defined a process for identifying late incoming orders
  • Defined a process for regular office cleanings
  • Met with overseas development agency about filing the Vue role
    • Eventually decided against it, too much overhead working with an agency vs. an individual freelancer
  • Ended a trial hire that wasn’t working out
  • Posted the freelancer role to the HN monthly freelancer thread
  • Had 1:1s with both local employees
  • Scheduled 1:1 with one of TinyPilot’s remote developer
  • Tracked down information to fill in state employment posters I need to keep posted in my office

Software development

  • Reviewed PRs to finish adding a REST API to TinyPilot Enterprise.
  • Reviewed a PR to add version information in the TinyPilot Pro update dialog
    • Previously, it just said an update is available, but didn’t say anything about what was changing
    • Now, the user will see their version, the latest version, and a link to our changelog
  • Reviewed a PR that allows us to manage TinyPilot settings in a more flexible way.
  • Added a public changelog for TinyPilot Pro.

Customer support

  • Added product instructions to TinyPilot’s main navbar.
    • Instructions existed before, but they weren’t linked from the main page.

Product research

  • Continued discussions with EE firms about hardware improvements to TinyPilot

Sales

  • Started writing instructions to delegate the research part of YouTube marketing to local employees
  • Started experimenting with the idea of selling items as refurbished if we get customer returns
    • I just did a one-off this week, but we might make it a regular thing and sell returned items on eBay as “used, refurbished”

For the week ending Friday, Jun 25, 2021

Management

  • Created a recurring schedule for staffing the local office
  • Let a trial hire go and began looking for a replacement
  • Did bookkeeping
  • Wrote instructions for local staff to order 3D-printed parts
  • Documented our mailing lists
  • Brainstormed ideas for additional tasks for local staff to take on

Software development

  • Reviewed a PR to rearchitect keystroke processing, which fixed some bugs as a side-effect
  • Tweaked the spec for the public REST API for Enterprise users
    • Reviewed PRs to implement it
  • Reviewed a PR that fixed a bug in the updater
    • This was an interesting bug
    • At the start of TinyPilot, I didn’t really understand how to use fetch, so I didn’t know how to distinguish between the server responding successfully and returning an error (e.g., an HTTP 400) and the network failing so that it triggered the catch
    • As a hacky, temporary workaround, I made sure that all of my server API endpoints returned a JSON object with success and error fields, so the JavaScript code ignored the HTTP code and only looked at the JSON objects.
    • This was silly because the code would return HTTP 200 but then return an error in the HTTP body
    • In the last update, we finally got rid of all the success and error fields and switched to conventional HTTP status codes
    • The problem is that during an update, the server changes to the new semantics, but the JavaScript in the browser hasn’t updated yet, so it’s still expecting the success and error fields in the response and it rejects responses that don’t have them, so updates broke because they need to query the new backend to verify that the update succeeded, except they didn’t recognize the response.
    • Fix is that the backend now has to include those extraneous fields for backwards compatibility
  • Reviewed a PR that fixed a bug in CA cert checking on OS X
  • Fixed a bug on the website where it failed to show a warning when the user purchased redundant products

Product research

  • Tested a TinyPilot cloud prototype

Sales

  • Added an Alternative to Lantronix Spider page to attract people looking for replacements to their Lantronix devices.
    • Still needs some editing and better design.

For the week ending Friday, Jun 18, 2021

Management

  • Organized a team lunch for local staff
  • Continued struggling with mailing list services, but I eventually settled on a solution
    • Ultimate solution: Topicbox + a custom, separate domain
    • First, I want a custom domain because I want to be able to change mailing list vendors without updating all my alias email addresses (e.g., I don’t want devs@tinypilot.topicbox.com)
    • Initially, I was trying to use a tinypilotkvm.com subdomain like lists.tinypilotkvm.com, but the problem was that even with a separate MX record for lists.tinypilotkvm.com, Fastmail (my main mail provider for tinypilotkvm.com) thinks that it owns all subdomains, so it would get confused when I try to respond to messages at subdomains because it thinks it doesn’t have to route the message externally (even when I set it to route externally)
    • I also tried Gaggle, but I ran into the same issues.
    • I eventually just created a whole dedicated domain for group emails so there’s no confusion with Fastmail
    • Topicbox
      • $20/month for business plan (required for custom domain)
      • Nice solution
      • Good customer support
      • Simple, clean interface
      • Using a custom domain requires manually requesting it from customer support, but they have turnaround of < 24 hours
    • Gaggle
      • $7.50/month for professional plan (required for custom domains)
      • Pretty good solution
      • Interface is fine, but I find it kind of ugly and cluttered
      • Good customer support

Software development

Sales

  • Sold my first enterprise subscription ($50 MRR)
  • Wrote a letter to a local industry organization to try to get to interview business owners about TinyPilot for that industry
  • Started experimenting with a Lantronix Spider so I can add a webpage about how TinyPilot compares

Misc

  • Donated a bunch of old cables and Pi cases to a local maker club

For the week ending Friday, Jun 11, 2021

Management

  • Led sprint planning for the next TinyPilot release
    • Picked a list of features and bugs to tackle for next release
    • Created a rubric for sizing work items as “t-shirt sizes”
      • We wanted a way to communicate with each other our rough estimation of the cost of fixing each issue, but we didn’t want to get into nitty-gritty formal methods, so this felt like a nice compromise.
      • Small: 4 hours or less to fix
      • Medium: 4-12 hours to fix
      • Large: 12-14 hours to fix
      • Extra-Large: 24+ hours to fix
  • Continued training for new local employee
  • Fixed an Internet outage at the office
    • Router just crashed, but I forgot that my router is not obvious to reset, which blocked an employee’s work for the night.
    • I wrote instructions in our internal docs explaining how to fix it in the future.
    • I also added a heartbeat server to the office and connected it to Cronhub so that if there’s an outage again when nobody’s in the office, Cronhub alerts me proactively instead of me waiting to hear that someone’s work is blocked.
  • Updated my freelance guidelines to clarify that I’ll only pay US-based freelancers via ACH.
    • A freelancer who I briefly hired but didn’t work out interpreted “ACH” as “bank transfer to any country,” and it complicated paying their final invoice.
    • Hopefully, this avoids similar misunderstandings.
  • Looked for mailing list solutions
    • I’m looking for something that’s basically Google Groups, but private so that I can create an email like sales-staff@tinypilotkvm.com and it emails all the salespeople.
    • Fastmail: Fastmail is my normal mail provider, and they natively offer aliases that forward, but it means that any time you email the alias, it forwards the email right back to you, so it doubles your messages in the thread.
    • Gaggle: Gaggle is okay, but their interface feels bloated with lots of features I don’t need, and they put a big obnoxious banner in the bottom of your emails on the free plan. I might revisit their paid plan.
    • TopicBox: Jury’s still out. I like that they have a nice simple interface that seems like it gives me exactly what I need, but the behavior so far is no different than just using Fastmail, so I’ll see if they can improve it once I get custom domains set up.
  • Reached out to a specialist developer about consulting on TinyPilot’s video component.
  • Wrote an internal doc about how to create internal docs.
  • Wrote internal instructions for using Bitwarden to manage credentials
    • Added one of the local staffers to the TinyPilot Bitwarden org.
  • Scheduled the first lunch for all local staff.
    • They haven’t met yet due to working in different time slots.

Software development

  • Built a release candidate for a new TinyPilot version and ran the manual pre-release tests on it.
  • Published an ansible role for setting up a server to send heartbeat messages to Cronhub so that I can get outage alerts.
  • Moved the tinypilot Github repo from my personal Github to the tiny-pilot Github org
    • That was the last TinyPilot-related repo in my personal Github
    • I thought that once all tinypilot repos were under one org, I could switch from CodeTree (not crazy about) to Github’s native project management features.
      • It turns out that Github’s native project management features are pretty bad, so I’m sticking with the lesser of two bad solutions: CodeTree.
  • Reviewed PRs that finish adding “upload disk image from URL” feature
    • This turned out to be way harder than we expected, especially because we’d already implemented “upload from local computer.”
  • Removed end-to-end tests from the pull request workflow
    • They bloat the build from ~40s to 3.5 mins, and I can’t remember the last time they identified a failure, so I’ve moved them to post-merge
  • Reviewed PR to add a timeout to the update process
  • Reviewed a PR to fix a minor UI bug
  • Reviewed a PR to refactor our boilerplate HTML custom element code

Customer support

  • Solved a mystery of how a customer thought we shipped them a device with a beta version of TinyPilot
    • This scared me at first because I was worried we somehow screwed up the shipping process, and a beta image had become the standard disk we ship.
    • It turned out to be not the case, thankfully, and the issue should go away entirely after next week’s release.

Product research

  • Met with EE consultants on alternate strategies for the Voyager 2 in the face of the global chip shortage.

Sales

  • Raised prices on TinyPilot Voyager from $299 to $349
    • The dominant feedback on my last retrospective was that I’m charging too little, so I’m trying this price bump.
    • Total revenue is 20% lower than last week, but it’s too small a sample size to make any meaningful inferences.
  • Got a verbal agreement on the first sale of a TinyPilot Enterprise subscription
  • Met with potential EU distributor
  • Ordered a competing KVM product so I can publish a side-by-side comparison

Misc

  • Migrated tinypilotkvm.com domain out of Google Domains (as part of my efforts to reduce Google platform risk)

For the week ending Friday, Jun 4, 2021

Management

  • Continued training for newest employee
    • Gave him keys to the office, access to the computer, tweaked documentation.
  • Ended a contract with a recent trial hire for frontend development.
    • We got off to too bumpy of a start, and I felt like we just weren’t going to communicate well.
    • One of the issues was that he tried to communicate things to me in commit messages, but I only review code at the level of the pull request, so I didn’t see it.
    • I updated my documentation to make expectations clearer.
  • Started a trial hire with another freelance developer
  • Sent polite decline letters to other freelance applicants
  • Iterated on inventory processes for the new office
  • Arranged order of Raspberry Pi boards directly from the manufacturer
    • It’s been hard to find them due to the global chip shortage
  • Scheduled TinyPilot sprint planning

Software development

  • Updated our inventory spreadsheet to make it easier to track ready-to-ship products (as opposed to unassembled parts)
  • Reviewed PRs to allow the user to upload a disk image from a URL
  • Reviewed refactoring PR for closing of dialogs
  • Reviewed a PR to add a reusable dropdown button
  • Moved ansible-role-tinypilot from my personal Github to the tiny-pilot Github org
  • Added a convenience script to fix frontend formatting
  • Added better documentation for the TinyPilot website’s end-to-end test after it seemed to trip up the most recent freelancer

Customer support

  • Answered questions in support forums
  • Highlight
    • A customer reported that their Voyager wasn’t booting.
    • Signs are pointing to a defective Raspberry Pi, even though that would be the first time TinyPilot has ever seen one of our Pis die in the field.
    • I offered to send the customer a return label so we could investigate and replace whatever’s broken.
    • They said they’re going to have one of their IT guys “look at it with an oscilloscope and voltmeter.”
    • Sounds cool, and I’m interested to see what they can find out.

Product research

  • Offered advice to one of my developers doing bleeding edge dev work on an integration with a new cloud provider

Sales

  • Iterated on the spec for a TinyPilot REST API, aimed at Enterprise customers
    • Reached out to large customers for feedback

Misc

  • Installed Proxmox on the office rack server.

For the week ending Friday, May 28, 2021

Management

  • Continued ramp-up process with newest employee
  • Had 1:1s with both developers
  • Had 1:1 with my inventory manager
  • Ended a contract with a trial hire who didn’t work out
  • Advertised the dev job opening on Twitter and a local mailing list
  • Researched options for schedule coordination
    • TinyPilot’s two local employees need to coordinate their schedules so that someone’s there 5-6 days a week.
    • Surprisingly hard to find tools that let people share schedules and swap shifts. Every solution that offers it is bundled up with complicated timesheet and payment features.
    • Ended up trying TeamUp
      • Basically just shared calendars.
      • Okay so far, but we’ll see how it goes.
  • Added guidance to my freelancer guidelines around how often developers should share status updates
  • Added a note to developer guidelines about a Github permissions gotcha that can bite devs joining the team.
  • Purchased my mandatory poster of state and federal employment laws so that I can “display it prominently in my office.”

Software development

  • Reviewed a PR that adds “Reset to Defaults” button to video settings page
  • Fixed a bug that caused TinyPilot to die if it didn’t have Internet access on first boot.
    • As a side effect of the fix, the first boot will be a little faster.
  • Tried to create an Ansible Galaxy namespace for tinypilot, but didn’t have much luck
    • Instead, I’m just referring to my roles by direct Github URL, which seems fine, as Ansible Galaxy doesn’t provide much value.
  • Reviewed a PR that makes the security dialogs more consistent with the rest of the app’s UI
  • Created a draft spec for a REST API (premium feature for Enterprise customers)
  • Configured VS Code to auto-format Python code on save
    • I should have done this a long time ago.

Product research

  • Continued exploring TinyPilot Cloud access solution

Sales

  • Moved the TinyPilot origin story blog post from my personal blog to the TinyPilot sales site
    • I set the rel=canonical tag on the original post to point to the new location.
    • I’m hoping that after a few days, if you search for “tinypilot” the result will point to the TinyPilot sales site rather than my blog, but we’ll see.

Misc

  • Searched around for a vendor who wants to reliably sell me Raspberry Pi 4B boards
    • Vendors are short because of the global chip shortage.
    • I might be getting an allocation directly from a manufacturer; I’ll find out next month.
  • Continued setting up server rack at new office
    • My HP ProLiant G7 works!
      • …but it doesn’t recognize keystrokes from TinyPilot during boot. Need to investigate further.
  • Reprovisioned a laptop we were using as a temporary workstation to be purely for device testing.

For the week ending Friday, May 21, 2021

Management

  • Met with newest employee for his first day
    • Gave him a tour of the office and a take-home task.
  • Hired a new freelance frontend developer.
    • I found some good leads on the HN monthly freelancer thread.
    • Reached out to one other (no response)
    • Sent a detailed decline to a candidate that reached out via referral but wasn’t a good match.
  • Reached out to two successful open source companies for advice
    • One responded, the other I haven’t heard back from yet
    • Takeaways
      • My profit margins are too low to make the business sustainable. I should look for other monetization channels, increase prices, and/or reduce costs.
      • Big companies should be paying substantially more than they’re currently paying. Revisit licensing terms to prevent them from freeloading.
      • It’s not obvious enough what the difference is between TinyPilot Community and TinyPilot Pro.
  • Arranged 1:1s with all contractors and part-time employees.
  • Did paperwork so that TinyPilot does tax withholding properly for payroll
  • Started to catch up on bookkeeping
  • Covered inventory management duty while my inventory manager was on vacation

Software development

  • Reviewed a PR that introduces a new convention for dialogs
    • We realized we actually had two distinct types of dialogs.
      1. “Take an action” dialogs, where the options are either “Do this specific thing or cancel” (e.g., perform an update or cancel).
      2. “Feature” dialogs, where the user can adjust a variety of settings, but it’s not a specific flow they’re completing (e.g. adjust video settings)
    • Credit goes to Jan, as I wouldn’t have recognized this distinction.
    • We needed to design these dialogs differently to reflect the different intended flows.
  • Reviewed a PR that fixes a long-standing bug we had related to modifier key input
  • Reviewed a PR that fixes a bug in the update flow
  • Reviewed a PR to improve the UI on the manage virtual media screen
  • Started consolidating TinyPilot Github repositories out of my personal mtlynch account and into the official TinyPilot org
  • Fixed a bug in our inventory spreadsheet

Product research

  • Continued iterating on a prototype for a TinyPilot cloud access portal

Customer support

  • Reached out to a large customer to check in
  • Met with a large enterprise customer

Sales

New office setup

  • Started putting equipment into the TinyPilot office server rack
  • Set up a new main desktop workstation
  • Got a label printer working
    • Brother printers seem to work really well with Raspberry Pis, which is what I’m using as print servers
    • I’m using the Brother QL-1000, which feels like a big step up from my old Zebra. It prints like 10x faster and automatically chops the label into an individual sticker instead of printing it as a long strip.

Refactoring English

  • Adjusted my table of contents based on feedback from the Write Useful Books community.
  • Sent out my first email to my mailing list subscribers to get feedback on my outline
    • Out of 204 subscribers
      • 6 filled out the survey or responded with feedback
      • 3 unsubscribed
      • Lower than I was expecting, but still good feedback. I’m hoping people will be more engaged once I start sharing actual content.
      • The respondents were pretty spread out in terms of topics that most interested in them, but they mostly agreed on chapters they didn’t find interesting.

For the week ending Friday, May 14, 2021

Management

  • Completed migration to the new office
    • We now do 100% of our shipping and receiving from the office, and all of our supplies are there.
  • Reviewed documentation of our internal processes
    • My longtime inventory manager is going out of town for the next week, and our new local employee will take over all of her responsibilities
    • It didn’t seem like the job was super complex, but once we sat down to actually document everything, it’s a ton to know. It never felt that way because we’ve been learning it little by little for the last year.
    • We’ve been working on this documentation several hours per week for the last two months, and we’re still not done.
  • Set a start date for TinyPilot’s third local employee

Software development

  • Finalized the list of priorities for the next TinyPilot release
  • Reviewed PRs to finish our migration to using HTTP error codes in the right way
  • Reviewed a PR to fix a UI bug on the virtual storage dialog that occurred when disk images had very long filenames.
  • Added SANs to the TLS certificate on TinyPilot Pro
    • Before, if you visited tinypilot at https://tinypilot.local, you’d see a certificate error because the TLS certificate was only signed for the URL https://tinypilot
    • Now, it supports tinypilot, tinypilot.local, and tinypilot.localdomain.
  • Adjusted UI for the video settings page
    • The short sliders made it hard to pick the right values
    • Before
    • After
  • Reviewed a PR to fix my bad byte counting on the mouse HID descriptor

Customer support

  • Updated documentation for installing TinyPilot Pro to make the language clearer
  • Updated the FAQ about reducing latency to mention the much more user-friendly options that are available in the latest version

Sales

  • Frantically fixed fatal JavaScript failures on the TinyPilot sales site
    • I can’t tell if these issues had been there all along and I only noticed after setting up sentry or if something new happened.
    • When a user would visit the site, put something in their cart, and then either reload the page or visit the page after browsing off-domain, JS would crash and the site would become completely unusable (images don’t load, links don’t work)
    • Up to 50% of the site’s users were seeing these crashes
    • It seems to be the same issue as this, although I use Gridsome instead of Nuxt, but they’re both static site generators on top of Vue
    • I eventually fixed it with a lot of workarounds, where I got rid of conditional rendering on the navbar and footer
    • Fortunately, I was able to add an e2e test that consistently reproduces it, so I should hopefully catch any similar errors before they hit production
    • I still need to undo all of my workarounds and add back the features I stripped to get the crashes to stop
  • Shared TinyPilot’s big review in ServeTheHome, the premiere homelab blog.
  • Shared a YouTube creator’s video about setting up remote access with TinyPilot
  • Updated TinyPilot’s homepage

Product research

  • Wrote a tutorial for fly.io so my teammates can begin experimenting on the platform

Misc

  • Continued setting up IT infrastructure at the new office
    • Everything works pretty well, except my printers started to fail on me
    • The printers have always been fine from my Windows machines, but I hooked them up to a CUPS server at the office, and the client machines are Ubuntu, and sometimes browsers don’t show them as a print destination, but then you’ll close and reopen the print dialog a second later and they show up…
    • I’m trying to keep the office all Linux, but I might have to cave and install a Windows box if it turns out that Ubuntu is the problem with the printing setup.
  • Added a “manual adjustments” page to our inventory spreadsheet
    • Previously, if you had to adjust an inventory count (e.g., discard a defective part, grab an item for testing), the only way to record it was to just manually adjust the total number of that part in stock
    • There was no tracking for adjustments, so we couldn’t tell how often this happened or by how much
    • There’s now a dedicated “adjustments” sheet where we record what the adjustment was, who made it, and why

For the week ending Friday, May 7, 2021

Management

  • Moved into TinyPilot’s first real office
    • Set up printer, servers, workstation, smart lock
    • Moved furniture around
  • Worked with inventory manager on updating all of our written processes for the office
  • Switched our documentation from Google Docs to Notion
    • Notion is a much better fit for our process documentation, but the migration process was tedious
  • Met with product dev team to discuss priorities for the next release
  • Met with account rep for my PEO platform (basically HR-as-a-service to handle payroll)
  • Argued about why their worker’s comp team classifies me as a warehouse worker
    • Answer: Because I employ people who pack and unpack boxes as part of their work, I’m “exposed” to that work and that somehow makes my rates 3x higher than the employees who actually do this work.

Software development

  • Published the 1.5.0 release, adding virtual storage and bandwidth tuning
  • Quickly published an update because of a bug I discovered while putting together a demo for the blog post.
    • Previously, I pinned dependencies to external libraries, but I just used the latest version of dependencies I controlled (like the Ansible roles)
    • This release, I realized I should be pinning all dependencies so that if users ever need to roll back, they get back to the exact software they wanted.
    • But I forgot to account for updating the pinned versions in my release process, so the 1.5.0 release was building against the 1.4.1 release of the video streaming library, making the new bandwidth tuning features not work.
    • I updated my release process playbook and cut a new release with the correct version
    • I need to automate more of my release, because it’s now very long and manual
  • Tried to debug an annoying bug that’s making the TinyPilot website unusable if a user adds an item to their cart and then reloads or leaves and comes back
    • It comes back to this Vue bug that plagues me
    • It seems like Vue randomly decides at some point that you’re not allowed to do conditional rendering anymore, so it punishes you by making on of the conditionally rendered components in your app randomly kill your entire site
  • Reviewed a PR to fix the moronic pattern I introduced for HTTP error codes
    • Early in TinyPilot’s development, I got frustrated about trying to figure out which JS component would consider it an exception when the backend returned an HTTP error code, so I configured it so that the backend always returns HTTP 200 OK even on error, but it has a JSON payload that says whether there really was an error or not.
    • I never thought this was a good idea, but I kept deferring a fix
    • Meanwhile, we kept adding routes that adopted this conventions for consistency, and it was driving me crazy, but we’re fortunately on a path away from that now.
  • Reviewed a PR that made TinyPilot Pro’s security page an overlay dialog
    • Now it’s consistent with the rest of our settings pages
  • Accidentally published the 1.5.0 beta as a production release
    • TinyPilot looks at all release tags and is supposed to ignore anything without a valid semver string like 1.2.3
    • What I didn’t realize was that a version like 1.2.3-beta is considered a valid semver string
    • I had to add an extra check to make sure that the string parsed as a valid semver and it doesn’t contain a prerelease tag
    • Bonus: I realized I don’t have to use the third-party semver library because the Python native distutils.version module also can do it (though it’s not officially documented)
  • Got Sentry releases working on the TinyPilot website
    • Actually pretty handy so far for diagnosing errors in production
  • Reviewed a PR to add temperature/CPU throttling to debug logs
  • Fixed a bug on the --brightness flag for ansible-role-ustreamer

Product research

  • Met with EE folks to discuss moving forward on TinyPilot hardware improvements despite the global chip shortage
    • Resolution: throw money at the problem
    • The components we need are consistently out of stock, but we’ll likely have better luck if I’m willing to spend 4-5x per component
    • This actually isn’t so bad
    • Paying $20 for a component that normally costs $4 is a big change, but it’s to sell a product that I can sell for a profit of ~$150-200, so I can swallow that cost.

Sales

  • Spoke to two customers about volume orders
  • Talked with YouTube affiliates about new videos

For the week ending Friday, Apr 30, 2021

New office

  • Signed a lease for TinyPilot’s first office space!
    • I can move in tomorrow
  • Got insurance for the office space
    • Required in the lease
  • Ordered networking equipment for the new office

Management

  • Continued working on new hire documentation explaining how to pack orders
  • Completed Worker’s Comp insurance
    • Pretty annoying process, I don’t recommend JustWorks

Software development

  • Began testing the next TinyPilot release candidate
  • Reviewed PRs to complete the virtual storage feature
  • Automated more of our inventory spreadsheet
  • Reviewed a PR to make the video reviews section of the website look prettier
  • Reviewed a PR to add the mailing list back to the footer of the sales site
    • We had to remove it because it was causing Vue runtime errors
  • Continued trying to get Sentry releases working on the sales site
  • Added support for the --brightness flag in ansible-role-ustreamer

Product research

  • Experimented with the idea of TinyPilot Cloud Portal
    • It would be a SaaS that gives users remote access to their TinyPilot with minimal setup/configuration

Sales

Misc

  • Configured a new test machine
  • Ordered an additional test machine

For the week ending Friday, Apr 23, 2021

Management

  • Reviewed the office lease with a lawyer and sent proposed changes to landlord
    • I felt like a real businessperson!
  • Continued working on documentation for the new assistant
  • Reviewed a ramp-up timeline my inventory manager created for the new assistant
  • Continued setting up JustWorks
  • Created a contingency plan for what looks like an exhaustion of 2 GB Pi 4B availability

Software development

  • Reviewed PRs to add UI controls to adjust video streaming settings
    • Previously the process of changing streaming settings was very slow and clunky, but now you can do it fast from the UI
  • Reviewed PRs that add disk image uploading functionality to TinyPilot Pro
  • Changed the update logic to eliminate a race condition
  • Continued refactoring and adding more tests to the update logic
  • Started planning for next TinyPilot milestone
  • Did a bunch of boring merge commits to sync TinyPilot Pro repos with the community edition
  • Fixed a bug in my TinyPilot shopify webhook endpoint
    • I’m probably not going to bother with Google Cloud Functions in the future, because they create lots of little headaches, and the savings is not worth it over just running a small server 24/7
  • Experimented more with TinyPilot cloud portal

Product research

  • Met with EE folks to discuss strategies for overcoming component shortage

Sales

  • Talked with customer who wants custom TinyPilot case for a bulk order
  • Pitched TinyPilot to a self-hosting podcast
  • Continued working on an experimental version of TinyPilot to control DSLR cameras

Misc

  • Set up an OPNSense router for the new office, using only TinyPilot
  • Set up a new TinyPilot test machine
  • Added support for image flashing on the TinyPilot test machines

For the week ending Friday, Apr 16, 2021

Management

  • Signed up for JustWorks to handle employee payroll and legal compliance
    • So far, not terribly impressed.
    • The forms kept asking me nearly identical questions about my business, then reps started calling and emailing me with the same questions.
  • Worked with inventory manager to prepare instructions for new employee to assemble Voyagers
  • Continued working on leasing office space
  • Started prepping some new test equipment

Software development

Customer support

New product researh

  • Met with a cloud hosting company about a potential partnership

Sales

  • Shared two new review videos
  • Chased down a bill from an IT sourcing company who bought on credit and was really taking their time to pay
  • Met with a large customer about a bulk deal
  • Pitched to appear on a programming podcast

For the week ending Friday, Apr 9, 2021

Management

  • More discussions about leasing office space
  • Started training new assistant
  • Posted assistant job to craigslist
  • Interviewed two additional assistant candidates
  • Updated TinyPilot’s logo
  • Migrated shared credentials over to BitWarden
  • Did bookkeeping
  • Bought a new (used) laptop as a test device for new assistants

Software development

  • Reviewed PRs to add virtual media support to TinyPilot
  • Switched the post-update check to use HTTP instead of socket.io
    • socket.io protocols are not backwards compatible, so in the last version upgrade, the update check broke. The frontend was still running the old code even though the backend had upgraded to a new version.
    • I’m confident HTTP will stay backwards compatible for a while.
  • Reviewed a PR to add UI controls for video settings
  • Experimented with accessing TinyPilot over the internet via a custom WireGuard proxy on fly.io
    • I’m looking for ways to give users secure, convenient access to their TinyPilot over the Internet
    • fly.io is definitely interesting, could be something more here.
    • Made me realize TinyPilot wasn’t supporting IPv6, so I added that
  • Tried to upgrade to Ansible 2.10.0, but found out you can’t go from 2.9.x to 2.10.x through a regular pip install, which is a bummer, so now I have to add a workaround before I can upgrade.
  • Deleted some dead code

Product research

  • Continued working with EE firm on PoE HAT

Sales

  • Made an experimental version of TinyPilot for a YouTuber’s upcoming video

For the week ending Friday, Apr 2, 2021

Management

  • Made my first local hire for TinyPilot
  • Visited potential office space for TinyPilot
  • Did bookkeeping for March

Software development

  • Integrated my TinyPilot shopify webhooks listener into my inventory system
    • Now any time someone buys a product, the parts for that product are automatically decremented from my inventory (previously this was a manual process)
  • Added unit tests to my shopify webhook listener
  • Added more rigorous parsing to the shopify webhook listener
  • Reviewed a PR to make install parameters more robust
  • Migrated the TinyPilot Logpaste server from Heroku to fly.io
    • I fell in love with fly.io at first, but then noticed some warts, including the fact that you can’t deploy a specific tag of an image, only its latest version
      • Edit: fly.io reached out to me, and it turns out lack of tagged releases was a bug, which is now fixed.
  • Migrated the TinyPilot LogPaste server from fly.io to Amazon Lightsail
    • LightSail is kind of big and clunky, but it gives me the most control over what I deploy. It costs $7/mo, which is the same as I was paying on Heroku.
  • Updated uStreamer dependency to v3.23
  • Disabled hot reloading on file changes
    • It was convenient for development, but it’s too confusing having that behavior in production
  • Fixed a js.map filename to get rid of a distracting browser warning

Customer support

  • Normal answering of customer support emails, but didn’t add any FAQ articles

Product research

  • Continued iterating on design for TinyPilot PoE HAT

Sales

  • Invited three more YouTubers to join TinyPilot affiliate program
  • Met with another YouTuber about niche sponsored content for TinyPilot

For the week ending Friday, Mar 26, 2021

Management

  • Started sharing job listing for part-time local assistant

Software development

  • Created a Shopify webhook listener to process completed checkouts
    • I’m hoping this can solve two of my problems
    • The first is inventory. I want to automatically update my inventory spreadsheet every time an order comes in (we’re currently doing it manually at the end of each day)
    • The second is automatically providing the latest microSD images to customers. If customers need to reflash their microSD, they currently have to email me for a secret link to the image. It would be way easier for everyone if there was a web form where they just typed in their order number and email, it checked whether they should have access, and then it shows them the link instantly.
    • Shopify’s kind of a pain to integrate with because they give examples of their requests, but they don’t define the schema, so it’s hard to know if I’ve implemented the listener correctly until I see some requests come in
  • Reviewed a PR to make error handling more uniform
  • Reviewed a PR to add a convenience script for changing video settings
  • Reviewed a PR to add a tag to the uStreamer Ansible Role
  • Added the hostname to the title tag on all TinyPilot Pro pages
    • It helps users who are running multiple TinyPilots
  • Made a new demo GIF to highlight the new UI
    • I can’t figure out how I got the old one to be so small in size. It was 658 KB and I think 30 FPS.
    • New one was 6 MB on first try. I managed to bring it down to 2 MB with gifsicle, made a smaller version that’s 300 KB
  • Fixed some of TinyPilot’s documentation
  • Removed the Github pull request template
    • It added friction for the regular developers and there are so few new contributors that it was a net negative

Customer support

Product research

  • Continued planning for custom PoE HAT

Sales

  • Replaced the super old demo on the homepage with reviews from YouTubers
  • Reached out to two more potential affiliates
    • No response

For the week ending Friday, Mar 19, 2021

Management

  • Worked with my assistant on a listing for her job
    • She’s going back to grad school in the summer, so I’m going to hire two people to share the role
  • Led the first meeting with both of TinyPilot’s freelance product developers

Software development

  • Cut a new release
  • Tested in-browser updates
    • In-browser updates were added last version, but there’s been nothing to update to until now
    • I tried with a clean version of the previous TinyPilot Pro release, and it… failed 😞
    • I thought I’d have to suck it up because there’s no way to auto-patch already-deployed versions, but it turned out that the bug was fixable from the post-update code.
    • The issue was that the TinyPilot server checks the result of “recent” updates based on result files, but the cutoff for “recent” is 3 minutes from the last update completion. But there was a bug where it was recording the timestamp at the start of an update rather than the end. Updates take about 3 minutes, so updates never looked “recent.” But that part of the code runs after the update, so I added 5 minutes of padding and cut a new hotfix release an hour later.
  • Discovered CodeTree
    • It’s a way of creating a unified view of Github issues across repos
    • Seems alright so far. UI is a little confusing, but it does its job.
  • Reviewed PRs to fix CORS hacks and fix a CSRF vulnerability in the socket.io component
  • Reported a bug in Flask-SocketIO’s CORS behavior
  • Reviewed a PR to add a reusable overlay HTML component and a few more PRs to backport all of our old dialogs to the new component
  • Reviewed a PR to move keyboard event indicators to the status bar
  • Took a user suggestion to display the device name in the TinyPilot browser tab
  • Reviewed a PR to add better error message rendering in the login page
  • Updated UI on TinyPilot Pro to match the new UI improvements
  • Tried setting up Zapier to connect Shopify with my inventory spreadsheet, but it was too wonky, so I deleted it

Customer support

Product research

  • Reviewed plans for a custom TinyPilot PoE HAT
    • None of the existing PoE HATs protect against reverse current in the way TinyPilot needs
    • This gets TinyPilot on an incremental path toward building our own custom board to replace the Raspberry Pi

Sales

  • Wrote TinyPilot’s affiliate policies
  • Reached out to three YouTubers about joining an affiliate program
    • Two agreed, one hasn’t responded
  • Continued discussions with another YouTuber about sponsored content
  • Added more personality to my About page
    • Before
    • After
    • And then I realized like 3% of users ever visit the about page…

For the week ending Friday, Mar 12, 2021

Management

  • Mostly finished bookkeeping work for my 2020 taxes
  • Continued migrating my bookkeeping from Xero to beancount
  • Looked for contract manufacturers or kitting providers so I can pay a company rather than hiring part-time employees (and doing endless paperwork)
    • It looks like I’m too small for kitting providers, so it’ll likely be part-time employees
  • Adjusted my Fastmail Focus Mode script so that code review requests have high priority
    • I might have to tweak this, as it’s making me check email too frequently

Software development

  • Cut the TinyPilot 1.4.0 release and TinyPilot Pro 2.1.0 release
  • Reviewed more changes to the TinyPilot web UI
  • Reviewed a change that fixed noise in the debug logs
  • Reviewed a change that added a bash linter to CI
  • Thought I fixed a bug in our websocket usage
    • But it turned out to cause a regression and I had to roll it back
    • I upgraded all the websocket libraries to their latest versions to eliminate that as the reason, but that had no effect.
  • Reviewed a change that added htmltest to the website build
  • Added mock scripts to faciliate development
  • Disabled caching in dev mode
  • Fixed a regression I caused at some point that broke the Numpad Enter key
  • Fixed a bunch of too-large images on the sales site
    • The website developer discovered that the build was timing out due to image resizing and identified large images as one of the causes
    • I went through and realized I had accidentally uploaded dozens of images at full resolution instead of something sensible. Gridsome was resizing them down before serving them to end-users, but they were slowing down the build a lot.
  • Closed a bunch of stale bugs, reduced bug backlog from 60 -> 50.

Customer support

  • Adjusted the website language around emailing me for customer support
    • I added a support forum last month, but most customer were still sending me private emails.
    • Private emails are bad because the information isn’t available to other users who run into the same issue, so it basically disappears into email silos
    • But the benefits of the forum are more for me and future users who encounter the issue, not the user reporting the problem. To the user reporting the problem, the easiest path is email, so I needed to align incentives.
    • In places where my email address was listed, I replaced it with a link to a contact page
    • The contact page still explains how to contact me directly, but advises users that they’ll receive a faster response if they post to the forums

Product research

  • Started working with my EE consultants on a way to mitigate the supply risk of HDMI chips, which disappeared from all vendors suddenly in mid-February and have only recently begun to resurface
  • Reviewed and aggregated feedback about the TinyPilot rack mount preview
  • Tested three popular managed VPN providers with TinyPilot and updated my FAQ page to give more helpful guidance.
  • Tested a non-networked KVM that works out of the box with TinyPilot
    • It’s pretty neat in that it lets you turn your TinyPilot into a 4- or 8-port switch for 1/20th the price of other multi-port KVM over IPs. Blog post to come.

Sales

  • Reviewed the rough cut of TinyPilot’s first piece of YouTube sponsored content
    • It didn’t work, unfortunately
    • The video was meant to be a tutorial about a common TinyPilot scenario, but the result was too complicated to be a match for my target market
    • Lessons learned
      • Sketch out the video beforehand with the video creator so you both understand what will be in the video
      • Agree ahead of time on a “kill fee” - an amount you pay the creator to scrap the video that compensates them for the time and lost content

For the week ending Friday, Mar 5, 2021

Management

  • Continued my search for HDMI capture chips and finally received my first bulk deliveries post-shortage.
  • Started working on a job description for local hire to help with order fulfillment and QA
  • Collected paperwork for a new developer

Software development

  • Reviewed and iterated on UI improvements for TinyPilot’s web interface
    • Before
    • After
    • Big thanks to Jan for his great work here
  • Implemented a grown-up release process for TinyPilot Pro
    • Before
      • Users just got whatever was on the HEAD branch of my production repo
      • In order to test a release, I had to push the code to production
      • My tinypilot-pro repo depends on ansible-role-tinypilot-pro, but it just pulled the latest HEAD branch, so the version of tinypilot has no explicit tie to any particular version of the Ansible role
    • After
      • TinyPilot Pro now only upgrades to the latest tagged production release
      • The Ansible TinyPilot Pro role is versioned and each version of TinyPilot Pro depends on an explicit version of the Ansible role
      • I added support in my image building script for building a specific tag of TinyPilot, so I can test a build without pushing it to prod first
  • Used my new release process to test a new major release for TinyPilot and TinyPilot Pro
    • Waiting until Monday to push to prod in observance of “never push to prod on a Friday”
  • Reviewed a PR to allow TinyPilot systemd to keep attempting to restart the TinyPilot service after failure.
  • Reviewed a PR that allows TinyPilot to disable and re-enable its USB gadgets (i.e., start and stop keyboard/mouse emulation without a reboot)
  • Fixed behavior during the first-boot process so that the webserver doesn’t unexpectedly restart
    • The original behavior was for the web server to start so that the user could begin interacting with TinyPilot as soon as possible
    • The problem is that the server needs to restart when the TLS keys get cycled on first boot, so the user would start playing with TinyPilot and then two minutes later see the session suddenly stop.
    • Fix: keep nginx service disabled until TLS key cycling process completes

Product research

  • Published a preview of a rack-mounted version of TinyPilot to get user feedback.
  • Discovered the PoE version of Voyager I expected to ship this month will be more complicated than I thought
    • I thought I had a working prototype, but I plugged it into my laptop and the TinyPilot instantly killed the laptop’s power (no permanent damage, fortunately, but not ready for prime time).
  • Started a doc for how to fix PoE issue, handed off to EE consultants to investigate

Sales

  • Reviewed a PR to the website that adds referral tracking, so I can start an affiliate program
    • But I didn’t test it well enough and broke checkouts for non-referral purchases for a day before someone told me 😬
    • Added e2e tests to make sure the checkout flow works
      • I tried to add this in the past, but Cypress is weird about cross-domain test flows. I’m not sure if they’ve improved it since my first try or I didn’t try hard enough back then, but I got it working after only an hour of messing around with it.
    • One unexpected benefit is that this gives me more reliable data about non-affiliate referrals, like when I refer from my blog or run ads on Reddit
      • My previous conversion tracking depended on Google Analytics, so if the user has adblockers, it fails to track. New version is native and doesn’t use third-party trackers, so adblockers won’t have a problem with it.
  • Continued working with a YouTube creator on a TinyPilot demo video (sponsored content)
  • Resumed advertising on reddit
    • Reviewed a new ad for Voyager

Customer support

  • Added an FAQ article about reducing latency
  • Added a wiki page that documents TinyPilot compatibility with non-networked KVMs based on user reports and my testing
    • Largely drawn from this awesome post with a ton of independent research on many KVMs

For the week ending Friday, Feb 26, 2021

  • Sent out TinyPilot’s first security advisory 🥺
    • tl; dr - I have a script that runs on first customer boot to cycle the CA keys/certs the device uses to sign TLS certs locally, but I accidentally broke it, meaning all customers who purchased in a 6-week window were using the same CA cert and private key.
    • Affected customers were very understanding and said they were happy that I shared so much detail about what happened.
    • I revisited several of my processes to make sure mistakes like this are unlikely in the future.
  • Reviewed a PR that adds support for changing the device hostname from the web UI
    • Demo of the rough draft
    • Also made some changes on the backend so that when TinyPilot is using TLS, it regenerates a new TLS certificate with the new hostname.
  • Reviewed a PR to make debug logs accessible from the web UI
  • Reviewed designs for a rack-mounted version of TinyPilot
  • Scrambled to find a new source of HDMI capture chips
    • Vendors were on break for most of February for Chinese New Year, but they came back and suddenly told me they were out of stock of the HDMI capture chip I use in the Voyager.
    • I’ve been trying to find new suppliers on eBay, Alibaba, and AliExpress, but the vendors keep offering deals, then waiting until after I pay to tell me that I have to wait several weeks or cancel my order.
    • Worked with 3D print designer to make a new case that fits an alternate type of HDMI chip I may be able to source
  • Changed behavior in TinyPilot Pro so that it targets the latest tagged release rather than whatever is currently in the repo HEAD

For the week ending Friday, Feb 19, 2021

  • Created a public FAQ
    • Long overdue and needs more content, but it’s a start
  • Scrambled to find a new source of HDMI capture chips after I discovered that there’s currently a shortage, and the vendor I ordered from is telling me 3 weeks later that they can’t fill the order. : 0
  • Reviewed PRs to add the ability to change a TinyPilot’s hostname from the web UI
  • Allowed the TinyPilot update script to read parameters from a YAML file
    • This should make the installation/update process a little more flexible so that it’s easier for the web app to communicate desired configuration changes to the privileged installer/updater.
  • Fixed a build break in the ustreamer Ansible role
    • This issue is breaking me in like 7 different projects
    • My fault for not pinning my dependencies properly, though.
  • Made a few other Ansible role fixes
  • Fixed a bug in upgrade where Ansible Galaxy wasn’t pulling down new versions of roles
    • Ansible Galaxy has such bizarre behavior around upgrading.
    • If you specify a requirement of a specific version of a role, Ansible will ignore it if the role is already installed with a different version number.
    • The fix is to use --force, but that re-pulls every role regardless of whether the installed version is behind the required version.
  • Fixed some bugs in the internal image building scripts.
  • Fixed some shell scripts to better match the project’s official style guidelines
  • Reviewed a PR to make images on the TinyPilot website more pleasantly clickable
    • They used to just link directly to the image and leave the current page.
  • Added support for customizable EDIDs
  • Did lots of paperwork for new hires (contracts, tax forms)
  • Adjusted keyboard input forwarding to improve compatibility with legacy KVMs
  • Cut a new release of TinyPilot Pro to apply a bugfix.

For the week ending Friday, Feb 12, 2021

  • Got in-app updates working!
    • Video
    • This took me waaaaaaay longer than I expected
    • It turns out that having a web app update its own code is really hard
    • Attempt #1: Try doing it in a single long HTTP call even though it’s a 3-5-minute process
      • Quickly realized this is dumb because nginx times out the call, and lots of other things would probably time out a 3 minute HTTP call.
    • Attempt #2: Make it asynchronous, but keep track of the background job using a global variable (I know it’s hacky!).
      • Part of the update process is restarting the TinyPilot web server, which loses the global state.
    • Attempt #3: Instead of a global variable, store state in a file.
      • Worked, but on service restart the thread performing the update gets restarted, so it never records completion.
    • Attempt #4: Instead of a background thread, use a background process.
      • Still didn’t work, process gets killed when the parent process dies.
      • That’s weird, shouldn’t the child process stay alive?
      • After lots of digging, I realized the child process was dying not due to regular OS process management but due to systemd killing all children on service restart.
    • Attempt #5: Instead of a background process, start a new one-shot systemd service
      • Worked!
  • Hired two new freelance developers
  • Wrote an ACHITECTURE.md and a CONTRIBUTING.md
  • Set up a new customer support forum
    • Updated all my documentation to point to the support forum instead of sending me a private email (thought private email is still an option)
    • I’m really liking this solution!
    • Every time I respond to a support question via private email, I feel like useful information is being trapped in my inbox.
    • When I answer a question on the support forum, it feels like I’m making an investment in something that will pay dividends over time as other users encounter the same issue.
    • Shoutout to TalkYard. It’s an open source forum similar to Discourse, but it’s an indie developer, priced much more affordably, and I like the interface better.
  • Tried to set up an affiliate program, but it turns out every Shopify solution requires you to hand over your entire customer database to an affiliate marketing company.
  • Reviewed design doc for potential rack-mounted future version of TinyPilot
  • Fixed a break in the installer
  • Reviewed new TinyPilot Voyager photos
  • Reviewed a refactoring of the assembly instructions pages
  • Fixed code coverage metrics
    • I gave up on Coveralls a couple years ago, but maybe I should come back.
  • Changed test file organization
    • I used to put my unit test files in a separate tests folder with a subfolder structure that mirrored my production code.
    • My new solution is to put tests alongside production files and change the naming so that it’s foo.py and foo_test.py rather than test_foo.py even though the latter is standard. But the foo_test.py way, the test and production files appear adjacent to each other in most file views, so I am cautiously bucking standards there.
  • Updated logic for updating the sudoers file so that it can’t generate duplicate lines or corrupt the file.
  • Added a check to the website repo for whitespace violations
  • Shared new YouTube review video

For the week ending Friday, Feb 5, 2021

  • Reviewed a design doc for a potential new version of TinyPilot
  • Investigated why an in-development “update via web UI” feature wasn’t working
    • It’s a funny root cause.
    • I know the real way to do long-running background tasks in Flask is to run celery or some sort of background job manager.
    • But I didn’t want to do something so heavyweight, so I just did a hacky thing and started a background process and used a global variable to track completion.
    • But part of the update process involves restarting the TinyPilot server web app. When the web app restarts, it obviously loses the global variable…
    • I think the fix is to track state in a file so that I don’t rely on a global that persists in memory.
    • Started working on a fix, but the service restarting still kills the child process, so I have to figure out how to let the child process keep running regardless of what happens to the parent.
  • Tweaked my internal script for testing power connectors
    • Getting Python to play a sound is surprisingly complicated
  • Reviewed a PR to the update mechanism in TinyPilot Pro
  • Reviewed a change to the Voyager case design to prevent the fan wire from rubbing up against the fan
  • Fixed a bug in TinyPilot Pro where it was incorrectly rejecting usernames for having uppercase letters
  • Fixed a break in my uStreamer Ansible role
  • Made it easier to configure custom EDID settings in the Ansible role
  • Fixed dead links on my parts list
  • Submitted a couple small documentation fixes to ustreamer

For the week ending Friday, Jan 29, 2021

  • Looked into options for scaling production
    • I’m currently limited by cases for the Voyager, as my printing lab can produce only 40 cases per week.
    • The next option up is likely plastic injection molding, which is super fast and inexpensive, but requires an up-front investment that will likely be ~$20-25k to make the molds
    • Met with one plastic injection molding and they’re putting together a quote
    • Reached out to additional 3D printing labs to see if I can parallelize production, but they’re quoting me 10x higher than I currently pay (I get an amazing deal through a state subsidy at my lab)
    • Talked with my 3D printing lab about using alternative materials that may speed up the process
  • Reviewed PRs from new TinyPilot freelance developer
  • Added automated style checks to the build
  • Wrote up a new freelance developer contract
    • Maybe it would mean something in court? Who knows!
  • Reviewed a proposal from my EE contractors for a rack-mounted TinyPilot
  • Explored options for streaming video over H264.
  • Reviewed a PR from my frontend freelancer to convert assembly instructions on the website
    • The old ones were done as Vue HTML, but the new ones are Markdown, which is much easier to manage.
  • Reached out to more YouTubers about reviewing TinyPilot
  • Bought a tiny little laptop for testing
    • Look how cute!
    • Only $80 on eBay
    • I didn’t realize it’s i686, which is a little annoying, but there are still plenty of distros that support it
    • I ended up installing Q4OS, which took forever to install but is pretty lean and snappy once it finished
    • It will likely be a dedicated machine for testing power connector circuit boards that arrive from the factory

For the week ending Friday, Jan 22, 2021

  • Conducted a postmortem with my fulfillment manager to review improvements to our process during sales spikes
    • There was a huge surge in sales following our Craft Computing review, and we had to scramble a lot to keep up.
    • Findings
      • We need defined emergency procedures for when inventory runs out so that we’re not deciding on new targets at the same time we’re scrambling to place new orders.
      • Schedule regular reviews of our inventory targets to adjust the amount we keep in stock based on trends in our recent order volume.
      • Bump our advertised handling time to 3 days. We ship next day 80% of the time and within 2 days 95% of the time, but we need slight more buffer.
      • Look for better inventory management software (our rudimentary spreadsheet isn’t telling us everything we need to know)
      • Find backup options for items like USB cables and PSUs in case our main supplier is out of stock when we try to reorder
      • Most of our systems worked. We were able to absorb a 5x spike in volume for almost a week without going into backorder (although we eventually had to go into backorder briefly)
  • Reviewed a PR to add an HTTP endpoint for updating TinyPilot
  • Meta: Why did I write so much code this week?
    • I’m realizing that shortcuts I took earlier are making it harder to ramp up new developers.
    • The bad code makes it hard to understand what patterns I want them to repeat and which I want them to improve.
  • Added a prompt to prevent users from accidentally downgrading from TinyPilot Pro to TinyPilot free
    • A few users found instructions from my older blog posts about installing TinyPilot and ran the same command on TinyPilot Pro, which overwrote their Pro installation with the stripped down free version. It also broke the installation due to another bug.
  • Fixed a bug in downgrading from Pro to free
  • Realized I broke version-to-version updates and fixed them
    • I had an update script that used to live at /opt/tinypilot/scripts/upgrade, but I moved it, so I updated instructions to point to the new location.
    • I only realized after pushing the code and testing it that anyone with an old install won’t be able to run the script from the old location because their version still has the upgrade script at the old location. So now I have two and the old one executes the new one.
  • Refactored out a progress spinner HTML custom element
  • Consolidated my shutdown dialog into a single custom element
    • It used to be split into an prompt then a progress dialog, but I no longer felt like the split made sense
  • Refactored out the HTTP logic into a separate controller file
    • And then refactored it more to make the abstractions cleaner and share code better with future API controllers.
  • Moved log collection script to a special directory so that the web app can run it as sudo
  • Started a new trial dev hire
  • Shortened the tagline on the sales page
    • Old: An easy-to-use, low-cost device for managing your bare-metal servers
    • New: An easy-to-use, low-cost device to manage your servers
  • Researched higher-scale options for producing cases
  • Researched alternate inventory management software (still not finding anything that’s a good match)

For the week ending Friday, Jan 15, 2021

  • Scrambled to handle a huge surge in orders after Craft Computing published a TinyPilot review video
    • Helped my assistant with fulfillment and inventory since this was ~5x larger than the biggest load of orders we’ve ever had before.
  • Added a blog post about the review video
  • Emailed newsletter subscribers to link the blog post and announce that TinyPilot Pro is officially out of beta
  • Reviewed PRs to support version-to-version updates from within the web app
  • Looked into moving from 3D-printed cases to plastic injection molding
    • 3D printing currently costs me $7/case, but there’s only one manufacturer who can do it with the material I want and they can only make ~3 per day.
    • Quote for plastic injection molding was $20k upfront cost to make the molds. And then $6/case after.
    • Going to try and get other quotes and tweak the design, as the current case design is optimized for 3D printing. There are design changes we can make to optimize for plastic injection molding.
  • Continued working on adding support for virtual storage
  • Added a warning on the checkout page if a customer is ordering both a power connector + a product that already includes a connector
    • Sometimes a user orders both not realizing that their other product already includes it, but half the time they don’t, so I email them to confirm, which is slow and manual. Hopefully this prevents the issue.
  • Added TinyPilot as a sponsor for the Ansible for DevOps git repo
    • Prime real estate!
    • It’s listed as one of the perks of sponsoring him, but I didn’t see anyone else doing it, and I kind of thought he’d ignore my PR, but he accepted it and seemed excited about it.
  • Add CI checks to make sure whitespace is consistent
  • Accepted a PR that added parameters to pip install
  • Reviewed a PR to fix an alignment issue on the TinyPilot website
  • Reviewed a PR that made editing products on my sales page easier
  • Tried to reproduce a bug where a user reported getting spontaneously downgraded from Pro back to free
    • Wasn’t able to reproduce

For the week ending Friday, Jan 8, 2021

  • Started a trial hire for TinyPilot
    • Sent rejection or “waitlist” emails to all the other applicants.
    • I’m only trialing one person at a time, so the clear “no” candidates, I told it wasn’t a match, but the others I said I was doing a trial and would reach out to them if it didn’t work to see if they’re still available.
  • Reviewed a PR to move a file from the tinypilot core repo to the Ansible role repo
    • This actually caused a break that I missed in review. It was placing a file in a directory without verifying the directory existed.
    • Fixed the break in #69
    • The tests missed it because I used to skip all test steps related to systemd services during CI testing because I couldn’t figure out how to get systemd to work in Docker. I later figured it out but forgot to remove the skipping behavior. The test missed the bug here because it was logic related to a systemd service.
    • The fix to the test gap was to just remove the test skipping logic
  • Reached out to a YouTuber about reviewing TinyPilot
  • Did a little bit of work on virtual drive mounting
  • Connected with another Indie Hacker for hardware/electronics advice
  • Took TinyPilot Pro out of beta and began shipping it with customer devices
    • Updated install instructions for all my products that use TinyPilot Pro
  • Fixed a minor bug in the installer
  • Expanded some command-line flags in a shell script to their verbose equivalents
  • Started running reddit ads again
  • Continued investigating Power over Ethernet

For the week ending Friday, Jan 1, 2021

  • Released the first beta version of TinyPilot Pro
  • Added a digital product checkout flow to the online store
    • Sold seven licenses in the first 24 hours
  • Polished TinyPilot Pro’s new UI interfaces
  • Allow user to turn off password authentication after enabling it
  • Updated install instructions for all TinyPilot products
    • I had the dumb idea to change a label on the TinyPilot power connector case, then changed it back, not thinking about how much work I was creating for myself in taking all new photos and updating instructions for customers.
  • Signed up for Notifier for Reddit
    • I keep missing discussions of TinyPilot on reddit, so this might be a good solution
    • It sent me a notification email within 1 min of my test email
    • I also tried F5Bot (free), which worked in 5 mins
    • I’ll probably end up with F5Bot because Notifier doesn’t offer much over the free solution for my use case, and it covers more platforms
  • Tested PoE with TinyPilot
  • Added support for listing discounts on the website.
  • Created a job posting for a part-time dev position
    • If you’ve read to this point in my What Got Done, and you want this job, please reach out, as you’ll likely have a huge advantage as someone who’s already interested in this work.
    • Published the job application on borderline.biz after seeing it advertised on Hacker News
  • Added support for downloading the device’s CA certificate
    • Allows the user to trust a self-signed application certificate
    • As far as I can tell, this is the only way to make a browser trust the certificate of an internal server’s certificate because normal certificate providers can’t sign an internal device’s TLS certificate.
  • Added protections to ensure an unauthorized user can’t access the TinyPilot video stream without being logged in
  • Added support for signing TLS certificate when the hostname is not tinypilot

For the week ending Friday, Dec 25, 2020

  • Mostly finished implementing user authentication
    • In TinyPilot Pro (not yet released), users can create new accounts, log in, and log out
    • Added support for a local sqlite database for credential information.
    • Added PBKDF2 password hashing.
    • Added secure settings for session cookies.
    • Added validation for usernames and passwords.
    • Still TODO: support removing users, better UI, better error handling
  • Switched to using a CA-signed TLS cert
    • It’s still basically a self-signed cert, but signing with a CA means that the user can install the device CA as a trusted root CA and avoid seeing the browser warnings about a self-signed cert
  • Reorganized my ansible role so that I now call dependent roles explicitly
    • Ansible allows you to define dependencies through the meta folder, which causes any parent roles to install and run automatically before yours. The problem is that if you do it that way, you can’t parameterize the installs of the parent roles.
    • The TinyPilot role now calls the nginx role (one of its parent roles) explicitly via import_role, which gives me more control over the nginx installation.
  • Cut a new release, 1.3.0, which improves keyboard compatibility
  • Upgraded the stock TinyPilot image to the December release of Raspberry Pi OS
  • Stressed about inventory
    • I was backordered several days on Voyagers and then USPS delivered a critical component two days late (eep!)
      • Going forward, I’m cranking up the amount I keep in stock and using DHL instead of 4PX (usually 1 week turnaround vs. 2-4 weeks)
  • Sped up version-to-version upgrades by adding a persistent updater folder
    • Previously, I was bootstrapping a fresh virtual environment for Ansible each update, but that’s pretty slow
  • Added a basic end-to-end test
    • This was surprisingly hard, given that the CI environment differs from the Raspberry Pi OS environment in several tricky ways that make it hard to replicate the logic.
  • Refactored the backend API logic
  • Fixed a dumb bug in the dump-logs script

For the week ending Friday, Dec 18, 2020

  • Implemented basic support for user authentication
    • Useful discovery: you can hook nginx into your app’s authentication system
      • I was afraid I was going to be forced to use nginx’s authentication mechanism to prevent it from routing to protected routes.
    • Currently, users are just hardcoded into source with dummy creds, need to move to sqlite.
    • Need to make everything prettier.
    • Need to support adding/deleting users.
  • Added a dummy remote screen for development
    • Before
    • After
    • In production, nginx redirects the route to a real stream, so it never really hits TinyPilot, but it made development sort of ugly because it was always displaying a broken image link. Now, at least there’s a placeholder.
  • Got TLS working with self-signed certs in TinyPilot Pro
    • Updated my TinyPilot image building process to cycle the TLS keys on first customer boot.
  • Reviewed a PR to simplify Shopify integration
    • Originally, the website used the gridsome-source-shopify plugin, which is good for stores with dozens of products, but I only have three, so it was adding tons of complexity and saving very little work.
    • The simple implementation was 200 LOC vs 800 LOC to integrate through the plugin.
    • Now, I have to redundantly change images, titles, and prices to match each other between Shopify and my website, but it’s easier than changing on Shopify and having to fiddle with auto-sync’ing back to the website.
  • Increased price of Voyager from $249 to $299
    • Right after, a customer purchased seven, making my biggest sales day ever
    • I originally did it just to slow down sales because I had a shortage of Voyagers, but I may try this pricing to see what it does to sales over longer scales.
  • Reached out to a freelance developer about potentially working on TinyPilot
  • Obsessively checked delivery status on a late part coming from China
    • I ran out of HDMI capture chips, and my restocking order from a month ago has been going slowly through international shipping.
    • I had to put Voyagers on backorder for two days, but the part is now scheduled to arrive tomorrow (fingers crossed)

For the week ending Friday, Dec 11, 2020

  • Forked TinyPilot into a separate TinyPilot Pro repo
    • First screenshot
    • Currently, its only feature is that the logo says “Pro…” but soon it will have actual features.
    • The biggest challenge was figuring out how I’d distribute it to customers and keep them on a separate upgrade path from the free version.
      • I got 60% through writing a spec for a custom activation and license key generator, and I realized it was way too overengineered for this point in the product, so now I’m protecting access to the Pro version essentially by security through obscurity (unpublished, hard-to-discover URL).
  • Got TinyPilot working on most international keyboards with one change.
    • I was on this super labor-intensive path where I was going to have to somehow create custom key mappings for every keyboard layout.
    • Then at the urging of one of my customers, I realized I could use the code field of JavaScript key events and work in terms of the key’s physical location rather than what symbol it mapped to. If I tell the target OS which physical key the user pushed, the OS takes responsibility for mapping that to the correct symbol. That cut out half my keyboard logic and gave me instant compatibility with most keyboard layouts like French (AZERTY), German, and Japanese.
    • I’ll do a longer writeup on this in my next retrospective.
  • Investigated a bug in TinyPilot’s HID descriptor
    • I initially thought this was a bug because the USB logs of computers where I connect the TinyPilot usually report an error, but upon further investigation, I think TinyPilot’s HID descriptor is valid and the bug is coming from Linux’s usb-gadget implementation or Raspberry Pi’s USB OTG implementation.
      • I tested the descriptor with several USB tools, and they all reported it as valid.
      • I grabbed the HID descriptor from my Microsoft keyboard and it had the same result.
  • Fixed a break caused by an indirect dependency changing out from under me.
    • It turns out you can pin indirect dependencies in Python by using pip freeze > requirements.txt
      • Am I the only one who didn’t know about this? I always used exact matches in requirements.txt and lamented the lack of a package-lock.json equivalent, when apparently it’s been sitting right in front of me the whole time.
  • Added a convenience script for performing version-to-version upgrades.
  • Commissioned a freelance web developer to re-do the TinyPilot website’s Shopify integration
    • It currently automatically syncs data via Shopify’s API, but it adds so much complexity to the site and tightly binds my site to state on Shopify, so I’m going back to maintaining the data separately.
  • Updated instructions for all of TinyPilot’s products because the new power connectors work a little differently than the v1s.
  • Submitted proof of identity documents to Shopify
    • They demanded proof of ID, residence, and business because I’ve earned too much money. Yay?
  • Realized that a large portion of TinyPilot customers discover the product through the Github repo, so I added nicer product photos to the repo README
  • Reached out to YouTubers about reviewing TinyPilot

For the week ending Friday, Dec 4, 2020

  • Realized I’d been handling non-US keyboards in a dumb way, and there’s a much simpler solution that should instantly make most keyboard layouts work.
    • Previously, I was purchasing different keyboards and enumerating the keycodes key by key to find the correct JS code mapping to HID code mapping.
    • It turns out that the code property on JS keyboard events indicates the physical key regardless of how it’s labeled.
      • e.g., On an AZERTY keyboard, the equivalent of the Q key is labeled A, but it turns out that regardless of language or layout, the key in that position always generates a keyboard event with code=KeyQ.
    • I should be able to enumerate the keys once and it should “just work” for all keyboard layouts because it’s the OS’s responsibility to figure out how to map the key at a given physical key position.
  • Panicked about two separate inventory shortages that affected all of my products.
    • Fortunately, everything was resolved, and we only had to postpone one unusually large order.
  • Fixed a bug on the AltGraph key on the on-screen keyboard.
  • Fixed an incorrect key code on the Meta key on the on-screen keyboard.
  • Adjusted the on-screen keyboard to press and release keys, more like a real keyboard.
  • Launched our new, improved power connector
  • Cut a new TinyPilot release

For the week ending Friday, Nov 27, 2020

  • Launched a Black Friday deal
  • Got cross-domain working for Google Analytics
    • I think? It seems to sort of work. Previously it was losing track of visitors as they moved between my site and the shopify checkout and back again.
  • Updated my dump-logs script to include config files
  • Helped users with support questions.

For the week ending Friday, Nov 20, 2020

For the week ending Friday, Nov 13, 2020

  • Reviewed an external contibutor’s patch to add screenshot functionality.
  • Reviewed an external contributor’s patch to support Norwegian keyboard layouts.
  • Ran into a showstopper bug for the next version, but fortunately mdevaev found a great workaround
  • Ordered inventory for the next model of TinyPilot.
  • Spent a lot of time fulfilling TinyPilot orders by hand since my assistant was on vacation.
    • Good news: lots of orders this week.
    • Bad news: I had to pack them.
  • Adjusted my automated TinyPilot image generation to make two separate types of images.
    • Next model of TinyPilot requires a slightly different OS configuration.
  • Adjusted the install script to separate different types of HDMI capture hardware
  • Spec’ed out desired behavior for an on-screen keyboard
  • Refactored lots of code to make way for an on-screen keyboard.
    • TinyPilot’s frontend code is kind of split between messy code before I discovered WebComponents and… less ugly code from after I discovered them.
    • The problem is that when external contributors need to get something done and they see the messy way, they think that’s the right way to do it.
    • I didn’t un-messy everything, but I unmessied the things that the on-screen keyboard would have to touch so that it too can be unmessy.
  • Clarified language on TinyPilot Pro page to make it clear that it’s not yet available.
    • Some users were getting confused and thinking that it’s available now.
  • Sent back a non-networked KVM I purchased hoping to chain it to TinyPilot, but the KVM seemed defective.

For the week ending Friday, Nov 6, 2020

  • Forked vdesktop into customize-rpi
    • My use case is to just run a script in a virtual Pi OS, whereas vdesktop’s goal was to create an interactive virtualized Pi environment.
    • I cut out the code I didn’t need, and it’s about 1/3 the code as vdesktop.
    • I still need to document it because I think others might like to use it.
  • Added native support for the TC358743 HDMI capture chip in ansible-role-ustreamer.
    • It always sort of supported it, but these changes mean that the user doesn’t have to do any extra tinkering on top of the Ansible role to make TC358743-based chips work.
    • These are a higher-quality, but slightly more expensive HDMI capture chip than the MS22109 ones that most HDMI dongles use.
  • Polled twitter for names of a high-end version of TinyPilot

For the week ending Friday, Oct 30, 2020

  • Cut a new release (1.1.3).
  • Experimented with a new video capture device.
  • Reviewed a user-contributed PR to add support for mouse wheel scrolling.
  • Continued working with 3D printer on the design for a new TinyPilot case and power connector.
  • Conducted a customer interview.
  • Updated instructions to include directions for users who are connecting through a VGA to HDMI adaptor.
    • As an experiment, I tried adding a VGA-to-HDMI adaptor as an add-on you could buy with TinyPilot kits.
    • It seems like it’s working, as 3 of 14 kits sold last week included the VGA-to-HDMI add-on.
  • Reviewed a contractor’s PR to cache Shopify data under source control rather than query the remote API every time we build the TinyPilot website.
  • Did some emergency inventory juggling because two of my restocking orders for HDMI dongles got delayed in shipping.
    • Managed to avoid going into backlog, but I did miss shipment SLO for one customer, but I emailed them and upgraded them to priority shipping to make up for it.
    • Reassessed my inventory reserve numbers to prevent it in the future.
  • Checked in with customers who recently received their kits.

For the week ending Friday, Oct 23, 2020

  • Conducted a customer interview with an MSP I found on Reddit.
  • Sent out 8 cold requests for customer interviews with MSPs / IT techs
    • One person responded to say they prefer responding over email
    • Another said they’d pass along the message
  • Reached out to a blogger about reviewing TinyPilot
    • They seem interested
  • Worked with 3D printer on TinyPilot case
  • Worked with EE firm on power connector v2
  • Promoted blog post about TinyPilot on Twitter
  • Promoted podcast about TinyPilot on Twitter
  • Tried chaining together a non-networked KVM with a TinyPilot
    • Sort of works, but the KVM’s hotkeys don’t seem to work, even when I connect a real keyboard.
  • Added support on the website for multiple product images
  • Added support on the website for “add-on” product of a VGA to HDMI adaptor
    • I frequently get emails asking if TinyPilot works with VGA, so I’m experimenting with just allowing users to add it on to their order.
  • Worked with an external developer on adding mass storage support to TinyPilot Pro.
  • Tested the new beta of vdesktop
  • Refactored my main.py file
  • Integrated my Shopify account with eBay
    • No sales yet, but I might be getting sales from people who choose to buy on the website to avoid the markup I added to eBay
  • Negotiated wholesale pricing for TinyPilot cases (50% cheaper than what I was paying).
  • Finally set up an Amazon Business account.
    • Should have done it sooner because it allows native support for negotiating bulk orders.
  • Experimented with Reddit ads again
    • Still 0 sales, gave up.

For the week ending Friday, Oct 16, 2020

  • Conducted a customer interview
    • Reached out to two potential interviews that the customer suggested
  • Lots of work to try to figure out why one user is unable to get the web app to recognize any modifier keys on their physical keyboard
  • Added support for right-hand modifier keys
  • Added unit tests for the JavaScript keystroke to HID keystroke conversion logic
  • Got rid of some magic numbers in the HID keycodes
  • Reached out to a Gridsome developer to hire them for tweaks to the Shopify integration on the TinyPilot website.
  • Babysat reddit ads
    • Impressions: 12,881
    • Clicks: 208
    • Avg CPC: $1.73
    • Total spend: $360.68
    • Conversions: 0
    • Cost per conversion: ∞
  • Fiddled with my Shopify template for invoice generation
    • Either I don’t understand Shopify or Shopify’s templating system is ridiculous, because it seems to not support access to important product fields like HS code (for int’l shipping)
    • My dumb workaround: save my product’s HS code redundantly in the ISBN field (which I otherwise don’t use) because the templating language offers access to the ISBN field but not the HS code.
  • Worked with the vdesktop maintainer on a maintainable solution for offering config files.
  • Played around a little bit to try to get TinyPilot working on Ubuntu for the Raspberry Pi, but it failed again.
  • Did some inventory management.

For the week ending Friday, Oct 9, 2020

  • Conducted a customer interview.
  • Fixed a bug in my Shopify settings, where some international customers were seeing shipping rates of ~$120 when they should have been ~$35.
    • Plus, I added more shipping options, so now economy international shipping is available.
  • Ran my first reddit ads.
  • Found a tech blogger interested in reviewing TinyPilot.
  • Updated frontend so that it persists user settings to local storage.
  • Learned to use ES6 modules in vanilla JavaScript.
  • Wrote instructions for adding support for new keyboard layouts.
  • Contributed two PRs to vdesktop, a tool I use to build redistributable Raspberry Pi .img files.
  • Cut a new TinyPilot release, v1.1.2.
  • Reviewed two PRs to improve experience on mobile.
  • Added more diagnostic logging to the log dumper script.
  • Submitted TinyPilot to Awesome Self Hosted.

For the week ending Friday, Oct 2, 2020

  • Finally caught up with orders
    • I was backordered on one or more products for almost all of September, but now I have ~40 of the power connectors, the hardest component to restock because it’s custom-made.
  • Wrote a blog post showcasing the new features in TinyPilot v1.1.
  • Fixed a break in my Ansible role
    • I couldn’t figure out how the role suddenly broke out from under me because I thought I was explicitly declaring versions of all my dependencies.
    • It turned out that the Docker image I was using was auto-upgrading to the latest version of Ansible, so I forked it and made my own.
    • But that didn’t fix the issue…
    • The answer was that if you pip install molecule before you pip install ansible, molecule automatically installs the latest version of Ansible.
    • So I just switched the order of my pip installs to ensure that Ansible came first.
    • Added version printing to hopefully make this issue more obvious in the future.
  • Fixed a break in my TinyPilot image building scripts.
  • Fixed feature blurbs on the homepage
    • I broke these when I migrated to Gridsome and completely failed to notice it for two months.
    • Before
    • After
  • Spent the day driving out to the manufacturer to pick up boards for the TinyPilot Power Connectors
    • There were shipping issues that would have delayed delivery until days after they were due out to my customers, so I figured I’d just drive out myself.
  • Adjusted the way the remote screen occupies browser window real estate as the window size gets smaller.
  • Resumed work on new TinyPilot case.
  • Did a customer interview with an MSP.
  • Reviewed inventory processes with my assistant.
  • Spoke to several different customers about their orders and feature requests.
  • Reached out to 7 IT consultants/MSPs requesting customer interviews.

For the week ending Friday, Sep 25, 2020

  • Shipped out 38 orders.
    • Mostly power connector replacements for legacy customers, but a handful of new paid orders.
    • We’re almost through our backlog, 5 orders left.
  • Spent a long time trying to figure out international shipping.
    • Working well so far. One item successfully delivered to the UK, another is on its way to Sweden, three more should go out this weekend to Japan, Brazil, and Denmark.
  • Tinkered a lot with I/O writes.
    • Context: When TinyPilot writes fake mouse or keyboard events to the HID interface, sometimes the write can hang indefinitely, so I did it in a separate thread to avoid hanging the entire app.
    • First, I thought I could get clever by switching to non-blocking I/O and skip threading entirely, but it turned out that this made writes fail that were previously succeeding.
    • Then I thought I could be clever by combining two writes into one, but this also broke stuff.
    • Eventually, I went back to doing writes outside the main thread, but I switched to doing it in separate processes so that I could kill processes that were hanging for too long.
  • Added throttling for mouse events
    • If you’re connected to a computer without a GUI, then any attempt to write to the mouse interface will hang and fail. The problem is that you can go from a mouse-friendly environment to a mouse-ignoring environment quickly (e.g., as the computer goes from its boot sequence into a GUI OS), so you can’t just turn off the mouse if you notice lots of mouse events failing. But if you just send mouse events optimistically, your communication channel can get totally backed up by mouse events that eventually stall out.
    • First, I added a fixed limit of 20 mouse events per second.
    • That was a so-so solution for everyone. For non-mouse environments, it still backs up the event queue. For mouse environments, it makes mouse movement a little slower.
    • Then, I switched to adaptive throttling, a little like TCP.
      • When an event fails, we wait 500ms longer per event (up to a max of 2 seconds)
      • When an event succeeds, we adjust the throttle to a weighted average that’s a function of whatever the last RTT was and whatever the previous throttle was.
      • It works pretty well so far. It learns pretty quickly when mouse events are failing and dials them back, but it also dials up requests quickly to take advantage of a fast network channel.
  • Reviewed a PR that enables keyboard input from mobile devices.
  • Reviewed a PR that expands screen real estate.
  • Recorded a new screencapture and put it on the TinyPilot website.
    • This one shows mouse integration, whereas the previous one was keyboard-only.
  • Interviewed a managed service provider about remote administration.
  • Merged in support for AZERTY keyboard layout.
  • Wrote instructions for connecting the new TinyPilot power connector.
  • Call with a student interested in adapting TinyPilot for a different business.
  • Picked up the latest print of the 3D cases for the TinyPilot power connectors.
  • Cut two new official releases.
    • 1.1.0 - Big release, as I hadn’t been cutting any new releases for a few weeks, which officially adds mouse integration, fullscreen mode, and clipboard paste.
    • 1.1.1: Minor release to prevent mouse integration from blocking keyboard input on non GUI environments.
  • Synced with electrical engineers on manufacturing progress for the remaining power connectors.
  • Discovered uline for ordering shipping boxes
    • I had been previously just looking for closest matches on Amazon, but uline lets you browse way more size options. They do overnight shipping for only ~$6.
  • Created more independent accounts for TinyPilot LLC so that the LLC’s finances are cleanly separable from everything else.

For the week ending Friday, Sep 18, 2020

  • Sent out the first 24 completed power connectors to customers.
    • Updated TinyPilot assembly instructions to integrate the new connector.
  • Reviewed an external contribution to enable full screen mode
  • Mostly finished implementing support for AZERTY keyboards
  • Reviewed an external submission to add cursor options
  • Added Github templates for pull requests and new bug reports / feature requests
  • Added a diagnostic script that allows users to upload logs in one command.
  • Reviewed an external submission to make keystroke message parsing more robust
  • Reviewed an external submission to make mouse event message parsing more robust
  • Reviewed an external submission to [make the shutdown process more clear](https://github.com/mtlynch/tinypilot/pull/2360.
  • Updated the Flask logic so that we don’t have to specify the names of child templates.
  • Fixed a bug in clipboard paste on Firefox.
  • Spent way too long trying to figure out how to get a DHL business account.
    • I didn’t realize “business account” for DHL is like “enterprise customer” and I got trapped in this super heavyweight process where they wanted to do credit checks on me and have them send contact information for my vendors.
    • I figured out that a My DHL account is the thing I actually want.
  • Met with electrical engineers to review progress on the power connector.
  • Reached out to 5 IT consultants to interview them about TinyPilot.
    • One soft yes, don’t have a confirmed meeting yet.
  • Wrote copy for Reddit ads (not yet live).

For the week ending Friday, Sep 11, 2020

  • Merged in feature for pasting clipboard text
    • Although I just found out it’s broken on Firefox.
    • Pasting is tricky because the browser doesn’t give websites access to the clipboard except in special circumstances, so we have to pop up an editable div, ask them to paste the text there, then grab it.
  • Huge community involvement this week!
    • Reviewed nine PRs from external contributors vs. nine from me.
  • Automated creation of TinyPilot microSD images.
    • Previously, I had to flash a real microSD with a base OS, install TinyPilot, then capture the image.
      • It tediously involved physically moving a microSD between three separate machines.
    • Now, I can do it all virtually, and it only takes ~5 minutes.
  • Added nested menus to the navbar
  • Refactored shutdown dialog to be an HTML custom element
  • Got the first 30 3D-printed cases for the TinyPilot power connector
    • We’re working on some other options to make the lettering more legible.
  • Disabled caching in the web app.
    • Caching wasn’t buying us much in terms of performance, but it was causing user confusion when different parts of the page would go out of sync due to caching after a version upgrade.
  • Got Shopify post-checkout redirects working.
    • The solution seems like it shouldn’t be the right solution, but it apparently is the recommended way and it works.
    • This was a sticking point for me because I couldn’t figure out how to use tools to track conversions if the users permanently disappeared from my site at the beginning of the transaction. Redirecting them back to an “order complete” page after checkout lets me track which users completed purchases, so I can (hopefully) see which channels bring paying users.
  • Repeatedly tried to open a DHL account (all unsuccessfully).
    • They keep telling me that they’ll call me within 24 hours, and then nothing.

For the week ending Friday, Sep 4, 2020

  • Resumed pre-orders on TinyPilot website
    • Re-did the shopping experience so that there’s now a shopping cart
    • Previously, there was only a button that took you to a checkout page, so you could only buy one item at a time
    • Listed the TinyPilot power connector for pre-sale.
  • Polished up a user-contributed PR that adds support for clipboard paste
  • Got most of a working flow going where I can create a new TinyPilot microSD image without swapping around microSD cards.
  • Added a wiki
  • Refactored a few components into HTML custom elements
  • Refactored navbar into a separate template (#185)
  • Added a better e2e test for the checkout flow
  • Customer support

For the week ending Friday, Aug 28, 2020

For the week ending Friday, Aug 21, 2020

  • Tried to install TinyPilot on alternative single-board computers: no luck
    • But, in the process I made the Ansible role a bit more robust: #39, #40, #41, #42.
  • Worked on improvements to inventory system.
  • Explored advertising options.
  • Updated the install script to allow more configurability.
  • Added instructions for setting up a read-only filesystem.
  • Tried to add Google Tag Manager - no luck.
  • Updated assembly instructions.
  • Continued experimenting with TinyPilot stickers.
  • Answered support emails.

For the week ending Friday, Aug 14, 2020

  • Switched to a new design with a prettier case and cleaner cabling
    • Before
    • After
    • Not really enough sales to say for certain it made a difference, but the numbers are encouraging.
      • 48 hours before the change: 0 sales from 137 visitors
      • 48 hours after the change: 5 sales from 315 visitors
    • Sidenote: I just notice a spike of new visitors today, but I can’t figure out the source.
  • Tried to write a blog post about the new design but got caught in a yak shaving sequence.
    • I was having a hard time adding Markdown support to the TinyPilot sales site.
      • Okay, I was planning to eventually switch from Nuxt to Gridsome, so might as well do that now. (I know Gridsome better, but Nuxt makes it easier to throw a site together).
        • But to make such a big change, I need to create e2e tests to make sure I’m not breaking any of the original site’s behavior.
          • Oh, but now my e2e test framework is hanging in a way, I’ve never seen before. 90 minutes of debugging…
          • Okay, all my tests pass under Gridsome. Time to deploy.
          • Oh no! My site looks totally different deployed than it does locally. 30 minutes of debugging…
          • Okay, fixed the CSS stuff. My site now successfully looks exactly the same as it did this morning. What was I trying to do again?
  • Wrote up new assembly instructions for the new kits.
  • Re-wrote part of the instructions for the previous kit versions to address customer confusion.
  • Answered customer support / feedback emails.
  • Started a very rough implementation of simulating mouse input.
  • Collaborated with a community member on support for pasting text from the clipboard.
  • Registered a dedicated LLC for TinyPilot.
  • Met with two different designers.
  • Met with a potential partner company for auth/remote access.
  • Cut a new release and made a new standard .img.
  • Chased down a bug that some users hit in the installer.
  • Made changes to installer to optimize for latency.
  • Migrated and refactored the HID configuration logic in anticipation of mouse support.
  • Tweaked nginx configuration so that it more quickly detects when backend services come back online.
  • Fixed installer so that it makes tinypilot own the TinyPilot directory rather than leave it to root.
  • Added support for --tcp_nodelay flag in ansible-role-ustreamer.
  • Ordered more inventory.
  • Tested alternate hardware for a future kit.

For the week ending Friday, Aug 7, 2020

  • Cleared the order backlog!
  • Initiated conversations with design companies about a cleaner design for TinyPilot.
  • Reviewed a user-submitted PR to add clipboard paste functionality
  • Answered customer support questions from new users.
    • Updated the blog post and installation instructions to try to prevent users from repeating mistakes.
  • Set up eBay listings for non-US customers.
    • This was surprisingly hard!
    • I haven’t created a new eBay account since I was 13 (shhh, don’t tell eBay I had my personal account since age 13), so I didn’t realize the hoops you have to jump through now.
    • I had to go through manual verification and they’ve capped me to $1,000 in sales per month.
    • But now these listings are up:
  • Tweaked my assembly instructions to add clearer photos and more clarification about how to know things are working.
  • Adjusted the color on the sales site logo
  • Did some work to get TinyPilot closer to working on non Raspberry Pi OS systems.
  • Fixed a UI bug in the web app.
  • Added video demo to website.
  • Added Twitter link to website.

For the week ending Friday, Jul 31, 2020

  • Shipped out 4 new completed units
    • I should have shipped out 20+ but I made a dumb screwup reading a product listing
      • How I read it
      • How I was supposed to read it
      • So I thought I was ordering 40 microSD cards, but I actually only ordered 4
      • Fortunately, microSD cards ship pretty fast on Amazon, so I got 40 today and expect the rest of what I need tomorrow or Monday
  • Packed 7 completed units, shipping out tomorrow
  • On track to clear my order backlog by Tuesday or Wednesday
  • Switched from Stripe to Shopify
    • Huge improvement, so I tweetstormed about it
    • Still a lot of manual work in migrating orders from Stripe to Shopify, but hopefully I got it all sucessfully
  • LOTS of logistics planning and managing inventory
    • At any given time, I’ve got 10-12 different shipments in transit to me (parts of the kit, packing supplies, different equipment I’d like to experiment with).
  • Evaluated a few options for inventory management software
    • The problem is that simple inventory tools don’t support the concept of raw materials or “kitting” (i.e. to sell product A, I need parts X, Y, and Z)
    • Inventory tools that do support “kitting” are super complicated and assume that you have multiple warehouses and transfer orders and shipping receipts.
    • The closest match I could find was Stock & Buy, which is pretty complicated but the version I need costs $80/month. I’ll revisit if inventory continues to be a problem after this initial rush.
    • Also tried Zoho Inventory - free but terrible
    • Also tried Odoo - also free, also pretty terrible.
  • Tweetstormed a bunch of scaling issues I’m running into with shipping physical goods.
  • Made my first freelancer hire (my girlfriend)
    • I’m struggling to keep up with shipping, and she’s looking for flexible work, so it’s a good match.
    • Made a checklist for packing boxes and transferred that task to her.
  • Successfully tested an alternate design for TinyPilot that draws full power from the USB-C port instead of relying on GPIO.
    • It relies on an obscure cable I can’t source in bulk, so I’ll update the kit once I have enough cables.
  • Updated landing page to better integrate the new logo
    • Before
    • After
    • Looking at it now, maybe I should go back to the green color…
  • Added a teaser page for TinyPilot Pro
  • Added a mailing list
    • Got 3 subscribers since yesterday
    • I feel like I should just absorb the lesson to always add a mailing list to everything even if I can’t think of a reason why people would want to sign up.
  • Figured out a way to make a TinyPilot .img file so I can prepare microSD cards in a single step.
    • My previous workflow took like 20 minutes per card and involved swapping the microSD between machines for various steps.
    • The missing piece for me was using PiShrink, though I’m not sure why it failed when I previously tried writing an unminified image.
  • Met with David Williams of Box CI to talk about using BoxCI as a way to run CI for TinyPilot on my own hardware.
  • Sent follow-up emails to all the customers who received their devices in the first wave of shipments
  • Caught up on backlog of emails from people who reached out around the time of the blog post.
  • Wrote some behind the scenes notes on Indie Hackers
  • Briefly played around with a BeagleBone as a possible future candidate for TinyPilot’s standard build.
  • Adjusted the target resolution from 780p to 1080p.
  • Reviewed a PR that added Python packaging support instead of relying on pip to install requirements.txt.
  • Fixed a bug that was causing TinyPilot to break if people accessed it by anything but the hostname
    • e.g. http://192.168.1.105 or http://tinypilot.local (a Mac thing, I guess?)
  • Fixed a bug that was preventing install on 64-bit ARM systems
    • I think it still fails, but it’s a little closer to working now.
  • Adjusted HID config so that TinyPilot has better compatibility with boot environments.
  • Tinkered with nginx settings to reduce spew of warnings in logs.
  • Reached out to the owner of the tinypilot.com domain to see if he’s interested in selling.
  • Added versioned releases of TinyPilot.
  • Documented a VGA adapter that’s confirmed working with TinyPilot.

For the week ending Friday, Jul 24, 2020

  • 26 new orders! Huge week.
  • Published the blog post TinyPilot: Build a KVM Over IP for Under $100, which attracted a surge of interest in TinyPilot.
  • End of week stats:
    • Sales revenue: $4,814.49
      • Profit margin: 30-40%
    • New customers: 26
    • Blog post readers: 38,327
    • Sales page visitors: 2,678
    • Amazon Affiliate Earnings: $39.99 (at one point, I considered monetizing entirely through affiliate links - whew!)
  • Recorded a video demo of TinyPilot.
  • Worked with a designer to finalize the logo.
  • Shipped out 9 TinyPilot kits.
  • Ordered more supplies so I can fill backorders.
  • Ran into lots of “things that don’t scale” in this process:
    • Writing microSD cards: I should be able to have one image I just dd onto every SD card, but whenever I try it fails, so I end up with this very manual process of writing a stock Raspberry Pi OS image, booting it, then installing everything on the live system.
    • Printing address labels from Stripe orders - strangely, Stripe doesn’t seem to offer support for exporting a list of shipping addresses.
    • Sending tracking notifications to customers.
    • Managing inventory: I have this doofy spreadsheet, but I need a better way of keeping track of which parts I have in stock, how many kits that translates to, and how many parts are in transit to me.
  • Did lots of responding on social media:
  • Added support for rebooting directly from the web interface.
  • Fixed a bug where I was assuming every TinyPilot device used the hostname tinypilot.
  • Started experimenting with a different installation mechanism for nginx, because the one I’m using now just pulls from the Debian repository, and it’s a version of nginx that’s 8 years old.
    • I suspect the old version is to blame for issues I’m running into with proxying.

For the week ending Friday, Jul 17, 2020

  • Conducted two customer interviews
    • Reached out to 5-6 other local IT shops who didn’t respond
  • Fixed a bug where holding down a modifier key (e.g., Ctrl or Shift) would be treated like sending the key repeatedly
  • Fired the logo designer I hired last week
    • They submitted sketches that were much worse than the samples they sent me from their portfolio when I was interviewing.
    • I reverse image searched the samples and realized that they were plagiarized
  • Hired a new logo designer and reviewed their concept sketches
  • Captured updated screenshots and live clips
  • Upgraded uStreamer dependency to v1.1.9
  • Fixed a bug in ansible-role-ustreamer that caused it to build corrupted binaries during version upgrades.
  • Published assembly instructions

For the week ending Friday, Jul 10, 2020

  • Shipped my first two units!
  • Renamed the project from KVM Pi to TinyPilot
    • Following a Twitter poll where TinyPilot drastically outperformed other options (except for the option of “these names all suck,” which it still beat but by a smaller margin)
    • Updated all the project repo names, moved to a new domain, etc.
  • Reduced video latency from 600 ms down to 200 ms
    • Maxim Devaev, uStreamer’s developer, did a remote session with me and discovered that my HDMI capture device was doing MJPEG encoding already, so the extra encoding I was doing on the Pi was unnecessary.
  • Spent an extraordinarily long time trying to create a master .img file for the microSD cards
    • I tried imaging a configured microSD card with Win32DiskImager, but it kept failing with I/O errors midway through
    • Is it because I’m using my test microSDs, which are lower quality?
      • Tried doing it on SanDisk class-10 microSDs and it wrote out the image successfully
    • But then when I wrote the image to a new microSD card, it wouldn’t boot
      • Actually, now that I type that out, maybe I need to test writing it to another non-crappy microSD, even though writes to crappy microSDs work for other images I’ve tested.
    • Ultimately, I gave up and just wrote a script to configure the disk with Ansible while it’s booted
      • Not an ideal solution because it still requires me to write Raspbian on one device, transfer it to the Pi, boot it, then run the Ansible script from my dev machine.
  • Commissioned a logo
  • Started writing a tutorial for customers on assembling the kit
    • The kit includes a URL to find the instructions online, but I haven’t finished them yet.
    • Time’s ticking because the first order is scheduled to arrive Monday.
  • Added a self-ad for TinyPilot to my post about building a VM homelab
  • Fixed a bug that interfered with upgrading TinyPilot after installation
  • Added hardware requirements to the README
  • Tweaked the UI for modifier keys to make it less ugly
  • Ordered more stock equipment.