Yesterday, Lettini took a chance and posted about Jelly on Hacker News, a discussion site notorious for it's mercurial population of tech-maybe-too-saavy experts. Jelly is a tough sell for some of them, those with the technical skill to pipe email at a low level through custom-built filters running on their own cloud servers. I'm not going to lie...
I have an admission to make. Social share images for Pika were broken on Twitter/X, LinkedIn, and Apple Messages for months. And it made me sad. But in the past few months we got it fixed. And that made me very happy! We really love our Pika social share images. They are pretty. They are readable. They reflect the theme chosen by the blogger....
FriendlyId is a helpful Ruby gem that streamlines creating permalinks and slugs for Rails applications. In Pika we're using it to help with generating permalinks for blog posts and pages as well as slugs for tags. When a customer wrote in with a request to modify the behavior of these permalinks, I wasn’t sure how easy it would be to override the...
Dear readers, we need to apologize. We know some of you have noticed that Good Enough has gotten much quieter this year than last, across this blog, our newsletter, and socials. We’ve been heads down for the last few months on something new, but we’re now ready to come back up for air and hang with you again! We know you miss hearing from us. So...
For a while now we've seen that images in our Pika atom feeds were not displaying in some feed readers. In fact, they weren't displaying in my own feed reader, which routes through Feedly. I was sad. I spent a lot of time troubleshooting this. Compared our feed with a lot of atom and RSS feeds that worked. Eventually I came to a hair-brained...
TLDNR: If you have an interest in Good Enough succeeding, we need your help! Telling friends, shouting on socials, and sharing links to our stuff with your favorite influencers–all of these things will help Good Enough succeed and continue making amazing stuff! As we’ve been trying to spread the word on some of our recent product efforts, we’ve...
If you subscribe to our newsletter — which you do, right? — then you'll know that recently we've been thinking about conversations. We're a small group making fun software for people, and we like to have conversations with those people; the lovely folks who like our take on blogging or our super-simple contact form, or who want a copy of the...
We’re building some software where we’d like to display avatars for email contacts even if they aren’t users of our software. While Gravatar is a relic of Web 2.0, we’ve found that there are still a significant number of people who have their email addresses in that system. Here’s how I streamlined displaying an avatar for an email address if it...
One of the goals of Pika, the happy blogging software that we recently launched, is to help you find your own place on the internet. Along with a nice place on the internet, when you share links to your blog we want them to represent your internet home, which you've likely taken a little time to make just so. Sharing your blog on social networks,...
Have you thought about starting or restarting a blogging habit? Have you wanted to write on the internet, but at your own place and at your own address rather than on a social network? Have you been overwhelmed by the online writing options that you’ve found? Well, have we got just the thing for you! Sign up for Pika now! Two months ago I wrote...
A common thing I find myself doing in Javascript is adding some event driven behavior that I only want to happen once. Let’s say I have a big button that starts the process of lowering a certain spy into a pool of certain doom — I don’t want a second button press to awkwardly start him back at the top again! This usually means that I’m doing a...
We’re seven months into our Cosmic Maelstrom and we have started writing blogging software. What the why?! First, let me say that, yes, I do realize there are probably 100s of blog software options out there. In terms of static-site generators (SSGs) alone, there are probably fifteen or twenty options. There are big behemoths like WordPress, and...
We put a lot of ourselves into our work, and it occurs to us that you, dear reader, might not know much about us. So we’re starting a new Q&A column to introduce ourselves, one-at-a-time, starting with our resident designer… Who the hell do you think you are? 👋 Hello, I’m Matthew Lettini, but my friends just call me Lettini. You can too, if you...
We have a couple of exciting projects—Guestbook! Yay.Boo!—that we want to share with the world. But that’s a difficult task for us because, honestly, we’re terrible not good at self-promotion. We’d rather spend time making things than talking about the things we’ve made. We’d love it if, whenever we make something good, we could just “drop” it...
Twitter X recently removed headlines and descriptions from link previews, in the name of “esthetics.” Inspired by Steph Ango, while we try not to run our business on the whims of a social media platform, this change did push us into making a change we’ve been meaning to for awhile: adding social preview images for our blog posts. For example,...
We made a zine! The first issue was released in August, and I finished the second issue just last week. Right now, a hundred copies are on their way from the printer to me (update: they've just arrived!). Today I'd like to share the story of how this zine came about. (Sorry for the mess—this is what happens when you have children.) Bad Idea:...
If you use Mac, and you use Messages on your Mac, you will probably know that in the not-too-distant past, simple reactions to messages were added: what Apple calls Tapbacks. These are great for a quick way to say yes (or no, or WTF!?!), but they are a bit of a pain to actually send. You have you right-click on the message, then choose...
Recently we built and launched A Good Enough Guestbook, a place where you can send us doodles and they’ll print out on our little printer. It’s quite lovely and fun, and you should send us a doodle. We might also have more in store for these printers in the future. In the meantime, it took a bit of finagling to get the doodle interface feeling...
It’s time for a revolution. Too long have we, collectively and individually, been tyrannized by our thoughts and what we believe about them. Or perhaps we can think of this as an intervention. This post is the circle of friends gathered to help us stop hitting ourselves in the face with a hammer. So here’s a little step-by-step exploration of...
Once I was complaining to Arun about how hard it is to come up with ideas, and he pointed out that coming up with ideas is actually very easy––what makes it hard is that we’re aiming for good ideas. The next time you're coming up with ideas, tell yourself, Forget about good ideas, let's come up with a list of ten bad ideas. The dumber the better!...
Good Enough is a fully-remote team, and I think it's safe to say that we'll never have a physical office. I've been working remotely for more than ten years, and overall I really like it. I love the flexibility it affords, being more present with our families, and that my employment opportunities are not constrained by the limit of where I can...
A body at rest tends to stay at rest, and a body in motion tends to stay in motion, unless acted on by a net external force. – Sir Isaac Newton I often find that just getting started is the hardest part of doing something. This is especially true when the project is large or results take a long time to see. A few years ago, I started talking...
In 2009 I started doing something called "business travel." I bought a piece of dependable luggage: the Travelpro WalkAbout Lite 2 22" Rollaboard Suiter. The reality was that this wasn't proper business travel. First, it'd only be two or three round-trip flights a year. Second, suits were not a thing with which I needed to concern myself. Still,...
In a project I'm working on right now I've been using a Rails nested form and a couple of things caught me off guard. has_one Nested Form Sending id Attribute In this case I have a nested form that is in a has_one relationship with the parent model. I think this is a common thing to do, especially if you want to offload less-frequently-accessed...
I’ve said this before: We’re primarily a web shop here at Good Enough, but occasionally we come up with ideas that we think would work really well as a native desktop or mobile application. Still, we prototype those ideas on the web first. Recently, I wanted to try and make one of these web prototypes look and resemble a native Mac app as much as...
Hotwire and Turbo are great for very quickly and easily adding real-time updating of webpages without requiring the browser to reload the whole page. But if the information you want to stream back from your server to the client has anything specific to the current user — like using the name "You" instead of "James" — you might hit an issue. So...
I wanted to disable password managers, particularly 1Password, from interacting with a username field in Contact Me. It was pretty simple in the end: Reference: 1Password, Lastpass.
I’m not on Facebook. It was eight or ten years ago when I left for good. While there were some good and useful interactions, the algorithm brought me down, I didn’t have a lot of desire to keep up with old acquaintances, and hearing everyone’s political stance was not good for me. I understand that this giant corporation has a lot of power over...
For the printer project I'm working on, most of the software behind it runs "in the cloud", but there's some software that needs to run beside each printer, to check for new things to print and manage the process of downloading and sending those things to the printer component itself. In the current incarnation of the project, this "on the desk"...
Earlier this week, I watched the pilot episode of Alias. Yes, that Alias – the one that began airing 22 years ago and ran for 5 seasons and was a pretty big hit and launched the careers of two bonafide movie stars and featured a cast of very well known supporting actors. So yeah, I finally got around to checking that out lol. Turns out it was a...
We recently launched Quack, a simple utility for you to share a beautifully rendered version of any Markdown text. This software is completely front-end based, and for me personally it was a bit of a challenging puzzle to implement. Thankfully we have genius hackers like Arun here at Good Enough! Arun built the first cut of this browser-based...
Today we're launching a tiny beta tool called Quack. It is a simple utility for you to share a beautifully rendered version of any markdown text. Type away in our simple editor. When you're done writing, click Share to grab the link for sending to others. There are no servers in this beta. Everything you write is stored in the URL, so every time...
This is a blog post that has nothing to do with Good Enough, but I was told “There needs to be a record of this somewhere on the internet!” and I don’t have my own blog. Years ago my friend and I ran a radio show called Gorilla Madness, which we also spun out into a podcast after we graduated. It was a half-decade of silly stupid fun that I miss...
While everyone at Good Enough is their own kind of nerd, thank you very much, as builders of the web you probably expect that we also play video games. And we do! Well, collectively we do, but not to an unhealthy degree. Usually. I asked the team to share with me what their current favorite game console was, as well as the games they are playing...
As Barry wrote in his recent blogpost, we're busy building prototypes here at Good Enough. It's weird to be in this situation. Most of the Good Enough team are used to working on just one software at a time, focusing on steadily improving it. But right now we're doing the opposite. For the next few months we'll have no revenue and no customers....
If you've been reading our newsletter (and you should be reading our newsletter) you will have seen that I've been building some printers. This is actually the resurrection of a project I began in 2012 with the help of some colleagues, and while I've been updating it, it's been fun to explore some of the original posts and tweets about the...
We’re primarily a web shop. We’re dipping our toes into mobile app development, but our collective expertise is in making products and services for the web. And like everyone else, our use of the web has shifted from our desktops and laptops to our phones. As we’re creating and prototyping new ideas, we keep developing websites that we think...
This morning I wanted to deploy a simple Sinatra app to Render.com. It wasn’t super obvious to me, so I figured I’d write down what worked in the end. First, a Gemfile: # Gemfilesource 'https://rubygems.org'gem 'sinatra'gem 'sinatra-contrib'gem 'puma' * I’m pretty sure sinatra-contrib is not necessary. Also at this point in time you’ll need to...
Beware of free pizza If I want a slice of pizza, I don't expect it to be free. In fact, if you try to offer me a slice of free pizza, I'd suspect there's something wrong with it. And ever since my kids can understand me, I've taught them to be careful of free stuff. Nothing is free!* Don't take any free candies from strangers! But on the...
I don’t know how big my internet social bubble really is, but it feels like everyone in the world that bubble has been playing a lot of The Legend of Zelda: Tears of the Kingdom lately. Me included! It’s amazing, and I’m thoroughly engrossed—I think I’ve stayed up playing until 3:00am multiple nights in the past two weeks. That was easier when I...
We've been using Turbo Streams in some of our recent prototypes, which makes it really easy and fun to get responsive and fun interactions set up. However, we kept having issues with images sent in a turbo stream response. If the response was delivered by a normal controller render, e.g. class ThingController ApplicationController def update ...
Good Enough happens to be a remote team. This isn't from some strongly-held belief that remote is best, but rather as a side effect of how we all happened to meet each other. We met remotely, we did not end up all moving into some commune, and so to work together we must work remotely. Recently we have been talking about what motivates us. The...
1. Weekly Studio Update Hello. We're going to try doing this newsletter thing regularly. The ambitious goal is to write you a lovely letter every week. Aim for the moon, right? But wait, if you aim for the moon, how in this physical world can you possibly hit a star by accident? Speaking of aiming for the moon, we started Project Cosmic Maelstrom...
Excuse any obtuse thoughts that make their way into this writing. I sat down to type with My Life in the Bush of Ghosts by Brian Eno and David Byrne as my soundtrack. This is an album I've never listened to before, and apparently I'm supposed to love it or hate it. Mostly the Internet told me this could be a decent album to work to, so let's find...
1. Team Full It's exciting times over here at Good Enough HQ! (There is no Good Enough HQ. I'd say it's in the cloud, but even clouds are now looked down upon as dirtyish things that should not be enjoyed. And not because of air pollution per se, though perhaps because of industry in a sense?) Why are we excited? Because our team is pretty well...
What follows is an edited transcript of my interaction with ChatGPT to help craft a mission statement for Good Enough. The resulting mission statement was surprisingly good and I had some literal LOLs along the way. Though I think we'll leave out the haiku. You are an expert at crafting mission statements. They are not staid, boring statements,...
What a sad thing to write. We believe in good software around here. There is a lot of poorly built software on the Internet and in the app stores. Our motivation with Good Enough is to try to put together a few products that feel just right to the folks using them. The things we build, especially those things we charge for, should respect the...
Hi, I’m Patrick. Good Enough brought me on as a part-time Operations Manager who basically does all the things that Shawn and Barry don’t want to do! My first task was to set up payroll for Good Enough’s three employees, something we thought would maybe be worth talking about! If you intend to build a serious business, you’ll probably end up...
Lately I've been pondering the future for Album Whale. It does what we'd like it to do, and we've spread the word enough that there's now a steady stream of new users coming in each day. So, what's next? Portrait of the author pondering My first impulse was to answer this question: How do we get people to come back and spend more time on...
With conversation threading (which almost everyone has enabled), Gmail was trimming the bottom of the emails we send with our new app because they were too similar to the other emails in the conversation thread. They’re similar because that’s just the link to get back into the app—you know, the important bit to keep our users engaged! Having that...
1. I ❤️HR The past two weeks Barry and Lettini have been building our next little project, and I tried to deal with the company-side of work: setting up payroll, health insurance, and making sure we’re compliant (hello, bureaucracy!). Back in the day when Danny and I started Iridesco, we had to get on the phone (this was before the iPhone and we...
Hello reader, my name is Shawn, and I'm one of the co-founders of Good Enough. I'd like to tell you a bit about how Good Enough came to be and what we plan on doing here. Barry and I started working together again in early 2022. By “work,” I mean that I’d show up on Slack for a couple of hours each day, make some wise cracks, try to design in...
I am working on a new product that's a bit more complicated than our prior releases. Getting refamiliarized with nested parameters in Rails has been interesting. In this case imagine I have a discussion that, when creating it I also want to create the first comment. The discussion information is in a form with a nested form for the comment. So at...
I am working on search for Album Whale and I was very confused when my JavaScript fetch requests were not resulting in turbo_stream rendering getting displayed on my page. I checked my logs to see if the render was happening. I looked for missing tags. Debugged and logger.info'd all over. Then I finally noticed the following in my Rails logs:...
Hello reader, I’m Matthew, the newest member of Good Enough (LLC). The rest of the team are avid writers and sharers… I’m not. But they keep chanting “One of us. One of us.” so I suppose you’ll see me around here sometimes. For my inaugural post, I thought I’d quickly share what I did in my first few days to win their affection. We’re working on...
Dear friends, we have not been good at writing this newsletter regularly. But writing is hard work, and there’s only so much time we have, and there was the winter break and Shawn kept getting sick—we have many excuses, how much time do you have? Gosh, since July of last year? Well that’s embarrassing. And why are we in Season 3? We’re not...
I had to figure out how to run browser-based tests in Rails again. In part that meant working around my lack of Chrome. Rails System Tests with Safari. I also had some problems with Rails Turbo Drive taking over EVERYTHING, which required me to figure out how to deal with a Rails form redirect not rendering HTML.
DoEvery.Day calendar navigation was broken. We built it using Turbo Rails as it was being developed. As we have updated libraries, including Rails, the API has changed. In order to get the calendar navigation working again, I had to pull out some old hacks that made use of turbo_stream_action_tag via Turbo Streams to get my Turbo Frames working....
We noticed that the victory symbol at the bottom of our homepage looked different in Chrome than Safari––it was playing smart and rendered the unicode character as an emoji. Lettini found a fix though! Append this string of code to the symbol: ︎. So ✌︎ renders to ✌︎ and not emoji. Weird. (Here’s a blogpost that explains it all.)
Good Enough is taking a summer pause! We each have travel plans lined up for the summer. We each have at least two children in our homes, begging for attention. And we each truly appreciate extended breaks as a means of reinvigorating ourselves to the ever important task of building bemusing things. So while you definitely shouldn’t expect...
0. It’s Been a Long Time Sorry 4 the silence these past weeks. Life happened fast and furious. Barry’s daughters all had marching band, and he chaperoned 4 the parades. His eldest daughter also went and got a boyfriend. Shawn’s been feeling a little under the weather, and his two boys graduated. His sons haven’t gotten a girlfriend or boyfriend...
0. Everyone Likes a Giveaway Stick around to hear how you can win a fabulous prize by hardly doing anything. Take it away, fellas… 1. Still Positive Did you know that once you acquire COVID-19 your PCR test can be positive for up to 90 days? Did you know that the at-home tests can also be positive for up to 90 days? So if you’re ever trapped...
This will be a short one. Barry’s summer vacation has started, and Shawn is deflated after the Warr…iors... sob… It’s just one game, right? 1. No One Likes a Giveaway Who doesn’t love a good pickle? Well that didn’t happen. There were no entries to last week’s giveaway. If you recall the rules were (1) tell someone about this newsletter and...
1. Oh, hello. We didn’t see you there. How are you doing? You’ve somehow ended up with a collector’s item in your hands: the very first Good Enough Newsletter. This is the beginning of what we (Barry Hess & Shawn Liu) hope to be a years-long series of communiqués with our rabid fans. We call our fans rabid because there are so few of them....
1. Confirmed Positive After two years of running from reality, it has finally happened for my family. I have tested positive for SARS Coronavirus-2, the virus that causes COVID-19. For this honor, I would like to thank our society’s collective tiring of virus mitigation. It truly takes a village. —BH This week we are celebrating family...