Our thoughts on software engineering, product development, and cooperative workplaces.
Protocols for Publishers: Building an Open Social Web with AT Proto
Last Wednesday evening, I attended the Protocols for Publishers (PfP) Showcase in New York City. The event brought together publishers, developers, and researchers to explore the future of social content and publishing as AI devours the web, and how adopting open distributed technologies like AT Protocol (a.k.a., "AT Proto") can help prevent creators and publishers from getting squeezed out by the big tech corporations.
Understanding AWS IoT Core Device Shadow: Reported, Desired, and Delta States
I've been doing some work for a client that uses Amazon Web Services (AWS) to manage their IoT devices. Specifically, they use AWS IoT Core Device Shadow to synchronize state between their devices and their cloud applications. In this post, I thought it would be helpful to explain how the device shadow works, focusing on the reported, desired, and delta states—and when devices should report their state or respond to changes. Let's dive in!
Limeleaf was born on March 18, 2024. Our first anniversary seemed like a good time to take stock of what we’ve achieved so far and where we want to go in 2025 and beyond.
Go and Rust for the Small Web: How We Build Faster, Simpler Apps
At Limeleaf, we chose to specialize in Go and Rust for our clients and we've written about why we made that choice. However, now that we're building our own products, we need to develop applications for the web, too.
If you happen to be in or near Troy, New York, on Thursday, February 20th at 5:30 p.m., come see us present at Startup Tech Valley! We'll talk about Limecast.net, our open-source, privacy-first podcasting platform. You won't want to miss these eight minutes of high-powered product pitch perfection!
This a dark day for many of us in the United States. A government that we believe will undermine the fundamental values of our country and harm vulnerable citizens has assumed power. While no one can predict the future, if their stated plans are any indication, we are in for a tumultuous four years that could erase over a century of progress for working people.
The OSI defined open-source AI. Surprise, big-tech AI projects aren't open source.
This week, the Open Source Initiative (OSI) released "The Open Source AI Definition" (OSAID). This is an important step in establishing guidelines around what "AI" means in relation to intellectual property rights and how open-source definitions apply to the technology.
I was about 80% finished with this post and I was going down the road of
listing out all the great things both Go and Rust offer for us to build
and maintain software for our clients and product, but then I threw it
all out. I realized that posts like that are a dime a dozen and there
are so many resources out there comparing, contrasting, and listing
features of both languages, but none of that really explains WHY we, the
humans Erik, John, and I, like using Go and Rust. So instead I thought
it would be better to personalize this a bit and grab some quotes from
each of us about why we like each of them, unedited, unfiltered, and
raw!
Since founding our company, a few people have asked how we plan to fund product development. Most assume we'll try to raise VC money. Today, we'll explain why we aren’t taking that approach and what we’re doing instead.
This morning, Blain educated me about the history of the .io top-level domain. I didn't know that history when I bought limeleaf.io last year before teaming up with Blain and Erik.
limeleaf.net wasn't available then, but to my surprise and delight, it was this morning, so I bought it.
All Limeleaf site traffic and email now redirect from limeleaf.io to limeleaf.net, and I have donated $50 to Chagossian Voices.
Go is a popular language choice for building web services. Typically, when
building those web services, we end up encoding/decoding JSON as the
data format. The encoding/json package provides a safe way to turn
JSON payloads into Go structs, and vice versa.
However, if we need to
handle raw []byte that follow a binary encoding format that
is not self-describing, we need to do a bit more work and
implement the encoding.BinaryMarshaler and encoding.BinaryUnmarshaler
directly. Since we're dealing with []byte, we need to respect slice
bounds to avoid triggering a panic() and crashing our service.
Let's look at the two ways we can decode data into Go structs and compare how
one way will be safer than the other while yielding the same result. As an
added bonus, we'll end up with easier to understand code.
Founding Limeleaf: Part 3, Finding Support in the Cooperative Community
When we started Limeleaf, we wanted to do things differently. We wanted to create a democratically managed business where every worker had a voice and a stake in the company's success. In short, we wanted to start a worker cooperative (even though we don’t call ourselves that, for reasons we covered in Part 1).
Founding Limeleaf: Part 2, Writing Our Operating Agreement
In this second installment of our series on starting a tech company as a cooperative business, we’ll discuss how we wrote our Operating Agreement (OA).