Smaller project progress

It’s been too long! Time for some smaller project updates:

I started and mostly completed a microproject I’ve had in mind for a while. A friend has a string of ~750 addressable LED lights (model APA102-C) around the top of his roof deck and they’re controlled by a Raspberry Pi SPI interface. Since all the LEDs are individually addressable, he wrote a bunch of Go to make different patterns in the lights and the code gets deployed directly to the Pi.

I started writing some patterns but they’re difficult to test unless you’re physically there so I wanted to write a “deck simulator” where I could see the output of my patterns locally and revise them until they’re good. No clue how I was going to start but I had some time I allotted as free and this jumped into my brain.

I ended up writing a swappable spi-websockets library that has all the same interfaces as the real one but just forwards the spi data over websockets to whatever clients are connected. Then I wrote a simple visualizer in a canvas that interprets the data and draws all the lights. Some days I dread doing things that I don’t know really well because in contrast with how fast I can get stuff done in Swift, it feels frustratingly slow. Other days I’m OK with spending time learning something new.

So now I have to properly write the patterns I was planning on making in the first place 😂 I’ll post the code when I’m finished and give a quick wrap-up.

I got a ton of stuff done on the CMYK site for my brother two weeks ago, though not so much this past week. I was primarily wrapped up in getting some regular work done and being sick so not much extra time there. There’s some familiarity to it from my front end days but lots of new things to play with and APIs to work on.


I hit a big realization recently related to the work I do and the kind of thing I want to spend my time on. It’s definitely related to me coming off of Treat where I wanted to be a “startup CEO” and thinking more recently about going back to full time work. The core idea is that I shouldn’t let other people’s idea of success become my own. I’ve never been successful when I followed the normal thing to do and my favorite successes are when I’ve done something unusual and made it work. I have a pretty good idea of the box my successes fit into so I’ll be trying to be cognizant of those strengths.

One thing I really like to do is tackle big, weird problems that I have no (initial) expertise in and come up with new and different ways of doing things. I’m serious that it really interests me; I wake up thinking about these kinds of problems and it’s really motivating. I’ve always been a physics nerd but only way one works in physics professionally is by having your creativity beaten out of you over 6-10 years of rigid schooling. Obviously that doesn’t work for me but I’ve learned lots of fun stuff on my own over the years and occasionally I try to apply it in different areas. I’m not afraid of learning new things, particularly things that people think are “too hard” to learn outside of some structured learning environment.

One of the new projects I’ll be working on is a deep investigation into finding different approaches to minimize skin friction in aircraft. It’s one of those obscure subjects that I always do a bit of research on when I hear something related come up and I think I have some good ideas or at least directions to investigate. I’ll write up more about this particular project on its own soon but for now I’m calling it the Boundary Layer project.

Build log: Pay by Tray

Startups have improved on many UX aspects of takeout payments for places like your local coffee shop. Some of these improvements have been customer-facing like contactless payments and automatic tip selection, others are more business-focused like simpler ordering interfaces and better user management.

Very few of these improvements have been implemented in for in-house restaurant payment. We’re still waiting for servers to return with a bill, handing off credit cards, negotiating bill-splitting, calculating tips and waiting again before you can leave. There are a few high-integration apps which solve these problems but I don’t think I need to explain the downsides of requiring some of your party to have to download and sign up for an app to gain these benefits. Takeout payment successes have been primarily focused on business hardware and plenty of takeout payment apps attempting to simplify the process from the consumer side only have failed, in no small part due to the app download hurdle.

Pay by Tray simplifies the payment process for consumers in sit-down restaurants without forcing them to opt-in to some app. Businesses get to simplify payment for customers, gain extra time that waitstaff usually spend running bills and gain additional options for customer payment. No app required.

The product is essentially IoT for bill trays. There’s a nicely designed (draws your eye but at the same time feels familiar) bill tray that has a screen and an NFC reader (maybe a EMV dip slot). At the very least, this prominently displays your bill total. At most, you can pay on the spot with a single phone or multiple phones, splitting the bill and selecting a tip amount without doing any math or asking the waitstaff to go out of their way to split things 5 ways. A small but obviously visible LED on the tray indicates the state of the transaction - pending, paying, paid, etc - so waitstaff can glance at the tray to see that users have paid, particularly because after payment they can just get up and leave.


I’ve been thinking about this idea for a little more than a year - my first notes on this are from October 2014 - but it recently came up again and I dug into the competition to see what was currently available. So far I’ve only found apps that users have to know about and download in advance, thus plenty of effort has gone into making these apps as much about supported restaurant discovery as they are about the actual payment. I think that’s probably a distraction.

It might seem weird to have another build log for a new project so immediately after the initial build log for Watercooler but they’re distinctly different project types to me. Watercooler is a thing I can build just by throwing some hours at the engineering, Pay by Tray is a project I’d do a lot of research on and then go find some funding for a pre-product development cycle. A v1 product is mostly backend and hardware engineering, neither of which I’m very good at so I can’t really jump into the engineering anyways. Well, I can and most likely will just to get things started eventually but this is not an idea I can launch on my own so searching for buy-in from others first is the smart move here.

This has only been on my radar again in the last 48 hours so I’ll dig some more and ask around for feedback from friends next. This is always the most exciting

Build log: Watercooler / Workbreak

I’m diving deeper into the idea discussed last week about a mix of pomodoro timer and breaktime video chat that I’m calling either Watercoolor or Workbreak. No code yet, I’m thinking about the simplest tech for implementation and how to attract the first 100 users.

Actually, my primary concern right now is whether or not I should build the thing in the first place. I’m keenly sensitive to where I decide to spend my time right now (possibly as a result of this blog and my efforts to try and keep my active projects list short) and I was really hoping to break away from a strictly software based project and do something more interesting. However, the more I think about the project, the more I think I can put a basic version together with a minimal amount of work. Plus I like the concept! I think I would enjoy taking 5 minute breaks to chat with other people about projects.

Frontend choices

Obviously my first instinct was to build on iOS. Easy to do local notifications when your timer is up, easy to get video from the camera, etc. Distribution is the problem here. Distributing to randos is entirely through the app store (enterprise distribution is still too hard because it’s designed for enterprise) which means a level of polish that I simply don’t want to provide for a version 1. App icons of multiple sizes, app descriptions, privacy policies, app review - all these things make it hard to publish a true beta. And I want to build a true beta.

My second thought was a Chrome extension. I don’t really care that it’s not 100% of the browser market, it’s enough of the market that I’ll be able to tell if people want to use it. Easy enough to make a browser action button that displays the timer, easy enough to send notifications when the timer is up, easy enough to open a window to start a new break video session. I don’t know what it takes to publish on the Chrome extension store, it doesn’t seem like much effort. Obvious drawbacks are not having a fucking clue how chrome background extensions work other than the simple example case I went through and javascript 🤔

Lastly, I could still leverage Swift and make a quickie Mac app. Again, the syntax is straightforward, I’m sure AVFoundation (camera) is similar to iOS and distribution can still be done ad-hoc and gatekekeper-approved, particularly now that Mac dev certs are a part of the yearly developer membership. But organizing and building a menubar Mac app (I am so sorry, I know you don’t need another) is unfamiliar. There are unknowns and it feels a bit more “heavy” that a chrome extension.

Backend

Regardless of frontend platform, I will need a WebRTC server running somewhere, possibly with other negotiation servers (I’ve looked only briefly into this). It seems like there’s plenty of open source solutions and a $5 Digital Ocean box should cover enough usage to start. There are a few free services which I may use - PeerJS looks good but I’m unsure of how up-to-date it is since some of the examples are broken. Presumably you’d have to use JS for the frontend for this one too. Even if I used a free (or paid) service I still need to keep track of which clients are “on break” and looking for a connection. Despite the upcoming shutdown of Parse, I may still use it for this purpose! We have a year, after all.

Projects and Watercoolers

Many little changes since last time. I resolved the last remaining PermissionScope issue and the release went out just in time to get back on the Swift trending list on Github. 36 ⭐️ so far today, just passed 2000 overall! I would like to move this project to “archived” and defer any new work until later - for me, this is easy. I still have to figure out how to communicate this effectively to new PRs that come in 😬

I finished off a new post for That Thing in Swift regarding building your own API clients in Swift. It was definitely a hit, lots of tweets and talk about it which gave the site its best day ever (just over 2k uniques and almost 3k views 📈). Most of the traffic on a normal day is from organic search which increases naturally as more people learn Swift but my goal is to actually hit more first page search terms. It remains to be seen if just writing more posts == more search traffic.

I did a bunch more work getting the blog category pages working. Now if you click on a project in a post, you’ll see all posts mentioning that project. I really think the color coded project names help a lot with this! I can scan a bunch of posts and identify the paragraphs mentioning that project fairly easily.

Pantry had some new, good pull requests which I merged in. I’ll be setting up a new 0.3 release soon but I want get releases working via fastlane so making a new release isn’t such a pain. Prototype here, make sure everything works OK and then I can move the process to PermissionScope .


Lastly, a new idea: I realize (now, finally) that working from home has some serious drawbacks in terms of socialization. Maybe this seems obvious to you but I never really considered how much I enjoy miss meeting new people and hearing about their projects and sharing my own. There are lots of ways to accomplish this, I’m trying to figure out which one is right for me.

A Virtual Watercooler

One idea I’m playing with is a combination of pomodoro timer and video chat. An app of some sort that times you for 30, 60 or 90 minutes of work and then connects you with someone else taking a break from work for 5 minutes of chat about what you’re working on and how it’s going, that sort of thing.

I actually like the idea that you’d run into the same chatters a few times over the course of a week, it gives you an opportunity to learn about the process other people are going through. It behaves a bit like a water cooler where you have a chance to run into a finite set of people but which one is semi-random.

Still thinking about how to set up a minimal test case without too much engineering (remember our promise?). Probably just a website to start!

New Ideas

Unexpected benefit of this blog: I can collect stupid ideas in writing as well! Some ideas look really dumb after a day or two, others look even better. It’ll be nice to reflect on these after a week to see where they shake out.

A new take on Connect Four

I’ve been thinking for a while that I should try my hand at some sort of simple games on iOS. I love quick arcade-style games to unwind after a long day so I’m naturally drawn to creating something like that. Alternatively, I play asynchronous turn-based games with my Mother to keep in touch between phone calls and there aren’t enough good games in this model that are quick and fun.

I’ve been doing lots of technical interviews recently and one of them asked me to write up a connect four game in code. Most of it was just some Swift organizational yoga but detecting wins was a fun challenge and the solution I came up with involved simple row-wise detection of four subsequent same-colored pieces, and then each direction you could win in (row-wise, column-wise, diagonal-right and diagonal-left) just required translating the board matrix in that direction and doing the exact same check.

This got me thinking about building a quickie connect four iPhone game (the hard part is done! now it’s just everything else! you know this feeling). But the weird translational solution I came up with got me thinking about different ways you could play connect four. Rotating board connect four? Does that exist?

This sounds fun but I know that there’s a lot of work that goes into creating a polished app. I would probably start by creating something very basic and playing with connect four rotation to see if that is fun and weird.

Twitter Conversation Stream

For the most part I like the fact that you only see @-replies on Twitter to people you follow. Otherwise I’d be muting everyone who used Twitter more frequently (or way more frequently) than I do.

But I also like sometimes like digging into conversations that my friends are having with people just outside my friend group - or entirely outside. It would be nice to have a site that would find current conversations that my friends are part of and see the whole thing in context. And then they all flow by in a stream, just like individual tweets do (in a naive stream).

Probably just a web site connected to the Twitter API. I could even use their card rendering and do less of the styling work myself.