As we’re building Jelly, we have found ourselves looking at lots of raw emails. In particular, we’ve spent a lot of time with email headers. If you’ve ever had cause to do the same, you know it can lead to lots of scanning and squinting.| Good Enough
The London Ruby User Group is one of the longest-running technology user groups in the world, having held a monthly meeting almost every single month since late 2006. It’s no small feat to have kept a local community running for so long, especially since everyone involved is a volunteer.| Good Enough
For your small business to survive, you need customers. Not just to buy once. You need them to come back, tell their friends, and trust you over time. And yet, too many small businesses make it weirdly hard to talk to them. Well, duh, right? I agree, yet I see small businesses fumbling this over and over. All the attention when discussing business is about giant corporations. Whether they’re selling servers or vehicles or every product under the sun, millions of dollars pass through their d...| Good Enough
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 descending deeper, ever deeper, into the Q&A column introduce ourselves, one-at-a-time. Desperate to keep things interesting, James tried to spice up the interview format...| Good Enough
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 continuing our Q&A column to introduce ourselves, one-at-a-time. Today, we’re meeting the biggest Pika fan, Barry Hess… Who are you? (Who, who, who, who?) My name is Barry Hess. I grew up in a rural part of Minnesota where the population of the entire county is less than 10,000 people. After getting a college degree in Computer Science, I moved to a metropolis of 25...| Good Enough
The second half of 2024 was definitely an inflection point in the world of software. Large Language Models (LLMs) and generative AI started to permeate products everywhere, from chatbots to operating systems, and at times it felt like everyone was taking part in a race to integrate some AI feature or other into their product.| Good Enough
While building Pika’s Stream of posts layout, we had need to add the capability to manage excerpts in the Pika editor. These excerpts would be used to show a small portion of your post in a post stream while offering a “continue reading” link for readers to click to read the rest of your post. To add this capability we had to dig into extending the base open source library for our editor, Tiptap.| Good Enough
When Good Enough was in its infancy as a truly American LLC (formed in Delaware and representing one or two people who were only semi-serious about a …| Good Enough
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.| Good Enough
I have an admission to make.| Good Enough
FriendlyId is a helpful Ruby gem that streamlines| Good Enough
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 allow me to formally introduce Good Enough’s next product: Jelly! It’s a new shared inbox for teams. It’s a game-changer, and it’ll be ou...| Good Enough
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 idea: what if Rails's Action Text image display markup was confusing these feed readers?| Good Enough
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!| Good Enough
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 zine, or who just want to say hello. We love talking to these people.| Good Enough
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 exists in the Gravatar system.| Good Enough
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, text messages, Slack, or wherever should be an experience that makes you smile, and that's why we built custom social preview images for your blog. ...| Good Enough
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!| Good Enough
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!| Good Enough
We’re seven months into our Cosmic Maelstrom and we have started writing blogging software. What the why?!| Good Enough
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 want. I’m from the longest island in New York, and have lived in Brooklyn for over a decade. My dog is reeeally trying to get me to move to...| Good Enough
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 and millions of people will instantly show up and fall in love with it. But we’re not Beyoncé. The harsh reality is that most peop...| Good Enough
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, this is now what you’ll see when you share this post:| Good Enough
I wanted to disable password managers, particularly 1Password, from interacting with a username field in Contact Me. It was pretty simple in the end: …| Good Enough
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 @thing = Thing.find(params[:id]) if @thing.update(thing_params) respond_to do |format| format.turbo_stream # renders `update.turbo_stream.erb` end end ...| Good Enough
DoEvery.Day calendar navigation was broken. We built it using Turbo Rails as it was being developed. As we have updated libraries, including Rails, th…| Good Enough
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.| Good Enough
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: wh…| Good Enough
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 just right. One issue we ran into was that users would sometimes tap “Undo” a whole bunch in rapid succession. This undo’d just fine, but on ...| Good Enough
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" software runs on a small Raspberry Pi computer, which acts as a simple bridge between your Wi-Fi and the printer, funnelling data from our servers to...| Good Enough
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 dearly. No, you can’t listen to it, it’s very embarrassing and I like my job. Anyway, one of our friend-fans was an editor at Marvel, and h...| Good Enough
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 bundle lock --add-platform x86_64-linux for your Render.com deployment to work. Here’s my main.rb "hello world" app:| Good Enough
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 thoughts. It’s intended for any of us who, from time to time, struggle with intrusive or negative thoughts in any way.| Good Enough
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 internet, we expect things to be free. We're more than happy when Big Corporations offer us free software. Want to upload thousands of photos and videos to s...| Good Enough
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 things we said in that conversation could probably turn into a really useful blog post, but I'm not going to write about them right now. I will share t...| Good Enough
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?| Good Enough
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.| Good Enough
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 customer by streamlining something for them that used to be hard. We hope people enjoy using our software, while also not trying to dopamine-hit them su...| Good Enough
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 hiring some people. Once you’ve gotten over the exhilarating high of finding a perfect candidate, you’ll quickly realize that hiring someone ...| Good Enough
With conversation threading (which almost everyone has enabled), Gmail was trimming the bottom of the emails we send with our new app because they wer…| Good Enough
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 Album Whale? Following that questions, I came up with a list of ideas on how to get people's attention so that they'd use Album Whale more often. But somethi...| Good Enough
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 i…| Good Enough
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.| Good Enough
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…| Good Enough
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…| Good Enough
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! I bet you’ll find that easy. And once you loosen up your brain by coming up with ten bad ideas, some good ideas may follow.| Good Enough
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 reasonably relocate my physical body every day. Remote working also particularly suits the kind of work we do. There are many times where we need to di...| Good Enough
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 about getting in shape but wasn’t really sure how to take that seriously. Occasional pickup basketball games with friends and leisurely bike rides wi...| Good Enough
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, I did my research, was told "look at all of the flight staff – they're using Travelpro," and I spent accordingly. For some reason I got into my hea...| Good Enough
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.| Good Enough
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 possible. My first inclination was just not to use any CSS at all, but that’s pretty limiting. Then I found CSS System Colors.| Good Enough
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 far I haven't found this written up on the web anywhere, so hopefully this will help someone else with the same problem.| Good Enough
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.| Good Enough
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 very good pilot with more artfully executed twists and turns in 69 minutes than most thriller movies pull off in 2.5+ hours. Aside from the clothes ...| Good Enough
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!| Good Enough
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 you change your writing the URL changes as well.| Good Enough
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?)| Good Enough
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 right now. The Nintendo Switch is the big winner amongst our crowd, which is interesting because Nintendo definitely seems to abide by the mantra of ...| Good Enough
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. Most afternoons, we won't even know what we'll be working on the next morning. Exciting times! 😅| Good Enough
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 might also be good apps. So a few of us are using “Add to Home Screen” on these products, which has mostly been great, but we ran into somethin...| Good Enough
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 project. Quite a few people made their own printer to connect to the open-source architecture, and it was great to read about their experiences. ... except...| Good Enough
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 was younger, but now my late-30s body and mind feels like mush the next day. My Switch says I’ve put in over 55 hours so far… Why am I ...| Good Enough
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 out. (I'm not going to look, but I'm pretty sure Strunk & White would tell me not to capitalize that "in" in the album title. Yet when I look at App...| Good Enough
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 had a real telephone) and call people—like a health insurance broker—and fill out a bunch of paperwork. It’s a different world today and ...| Good Enough
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: Processing by AlbumsController#search as */* Oh, I expected that to say something about TURBO_STREAM, like: Processing by AlbumsController#search as...| Good Enough
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?| Good Enough
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 anything from us ever, especially don’t expect any more newsletters over the summer. As the Nintendo Wii would say, why not take a break?| Good Enough
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 yet. Get used to it as there won’t be a newsletter next week, either. It’s good to keep expectations low. Now on to 4 things 4 this 4th is...| Good Enough
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 (b) leave a comment saying as much. As my mother-in-law says to me literally every time I see her, “With friends like these, who needs ene...| Good Enough
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 in your bedroom hoping to get an early exit for, say, your daughter’s massive graduation party, don’t think you can negative test your way out of...| Good Enough
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 birthdays and child graduations (Barry will probably be missing his eldest’s graduation party 😭). Life has taken over and said, hey, maybe don’t pla...| Good Enough
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. Animals might roam in packs, but rabid animals? Well, they’re usually out on their own, attacking innocent bystanders. (Our fans wouldn’t attack...| Good Enough
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 Photoshop and give up, and once in a while wrote some poor HTML and CSS. (Barry probably worked a lot more––somebody had to do the heavy lifti...| Good Enough