CSS Tips - text-wrap:balance will make your sites feel better
Improve readability with text-wrap: balance. Learn how this simple CSS property creates visually balanced text for better user experience and design polish.
I work as a co-founder & CTO at Craftwork — I'm a founder & product builder with background in design and development.
Find me on Bluesky @mikebifulco.com, Threads @irreverentmike or Mastodon.
What you see here are my own thoughts, and don't necessarily reflect the views or opinions of Craftwork or you, or anyone else.
01-14-2025
A guide to help you send introductions to your network.
Improve readability with text-wrap: balance. Learn how this simple CSS property creates visually balanced text for better user experience and design polish.
Subscribe and join 🔥
My weekly newsletter for product builders. It's a single, tiny idea to help you build better products.
Once a week, straight from me to you. 😘 Unsubscribe anytime.
Learn how I write and publish content on my Next.js site using Markdown and MDX, and a custom content creation workflow.
This post walks through the process of migrating from the next-sitemap library to the Next.js App Directory's sitemap.
I dive into the data from my PostHog AB Test and show you how to interpret the results.
I tackle a significant drop in my newsletter subscribers. Join me as I dive into the data using PostHog, identify and fix critical errors, and ultimately switch from ConvertKit to Resend.
Optimizing signups by testing, trusting statistics, and fine-tuning UX using data from PostHog
In part two of my product analytics journey, I tackle a subscriber drop, dive into PostHog data, fix key errors, and switch from ConvertKit to the developer-friendly Resend.
This video dives into the process I used to diagnose and debug a conversion problem on my personal website using Posthog, a powerful product analytics tool.
Powerful advice gleaned from a quote by Ira Glass - your taste will always outpace your creative abilities.
Learn how to seed your Supabase database with this simple pattern.
Canonical tags are a powerful tool to help search engines understand which version of a page is the original one. This can help you avoid duplicate content issues and ensure that your content gets the credit it deserves.
Structured Data can be added to your site tell Google and other search engines what type of content is on each page using a metadata format called JSON-LD.
A YouTube live coding stream, learning to build content-driven sites with the Astro Web Framework.
A YouTube live coding stream where we explore how we use a variety of dynamic images with Next.js using Satori.
A coding livestream where integrate Resend's new Broadcasts feature into my next.js site to use for sending newsletters.
Set up self-healing URLs with the App Router in Next.js for better SEO, accessibility, and usability
I built a tool for summarizing podcasts Using Open AI's GPT and transcription APIs. This is a sample of its output for an episode of the Acquired podcast about Costco's history and business.
Learn how to add custom fonts to your Next.js app using next/font and Tailwind CSS. Improve user experience without sacrificing performance.
Tiny Improvements has seen 350% growth in the last 6 months. This is my reflection on that growth, and tips for anyone interested in writing a newsletter.
Sometimes fixing a TypeScript or eslint error in VS Code can feel impossible. Here's what I do when I have exhausted all my resources.
Extracting types from a JavaScript object is a common task in TypeScript. This post shows how to do it with VS Code.
Learn how to sync your About page and your personal GitHub README bio on your Next.js site, as a step towards owning your content on social media.
Reflections on the current state of Twitter, and its similarity to the shocking results of a 1961 experiment by Yale Researcher Stanley Milgram.
Embrace no-code tools to save time, boost efficiency, and complement your coding skills. No-code is the future - don't be left behind!
Use previous issues of your newsletter to attract new subscribers, using the ConvertKit API with your Next.js site.
Learn how to use the ConvertKit API to publish your newsletter to your Remix site.
Implement the Orton Effect in CSS and React. The Orton Effect creates a surreal, dreamy image effect, named after photographer Michael Orton.
The Third Place is thought of as a space different from home (the first place) and work (the second place), where people can socialize and find community.
I use these tools on every project to help track source code, monitor traffic on my site, and optimize content for better Search Engine Optimization (SEO).
This is the right format to use if you want to add a subtitle below an h1 tag on your html pages. Semantic HTML makes your site more accessible and better for SEO, since it is easier for search engines to process.
Building a website using the Remix.run webb app framework? This tutorial will teach you how to add privacy-first analytics to your Remix site with Fathom.
Let's call it an experiment. I'm building a tiny product to see if I can make something people will buy.
You're building relationships with all of your customers, whether you know it or not. Setting up the right CRM for your product can help make those relationships stronger.
I migrated apisyouwonthate.com, a site with 20k+ monthly visits, from Gatsby to Next.js at the end of 2021. Let's talk about what I learned from that experience.
This tutorial will teach you how to automatically add links to heading tags in your mdx posts on your Next.js site with a plugin called rehype-slug. This should work for most nextJS sites that use MDX for content, as well as many other JavaScript-based sites which use MDX.
The article discusses the ESLint rule no-floating-promises which disallows promises without await. The rule is designed to prevent developers from accidentally forgetting to await promises, which can lead to unexpected behavior.
Since its release, teams around the world have been using dependabot to automate the process of keeping your project's dependencies up to date. In this article, I'll show you how you can run dependabot on the command line using dependabot-core.
Powerful AI tools like ChatGPT make it super easy to generate inaccurate and dangerous and inaccurate content. Relying heavily on AI to write can be messy.
If you're running an Apple Silicon Mac (with an M1, M1 Pro, or M1 Max chip), you may be able to speed up VS Code massively with a quick update.
Buildspace offers free, online, cohort-based courses on building web3 blockchain apps. If you're interested in dipping your toe into the world of Ethereum apps, the blockchain, or NFTs - it's a great starting point.
For years I did a weekly coding livestream of my React and Python work on Twitch every week, and I'm getting back into it again. This is what sticks out to me as the most valuable learnings from those experiences.
Let's take a look at the Nullish Coalescing operator (??) in JavaScript, which returns the right operand if the left is null or undefined.
If you come across array.filter(Boolean) in JavaScript code, never fear! It's a handy bit of functional programming that cleans up arrays with null and undefined values in them.
Have you noticed that your favorite IDE has been slow to load lately? Try removing these before losing hope.
Stop using centered text. It's bad for usability, accessibility, and eye scanning -- and nobody anywhere wants to read like that.
My review of Working in Public: The Making and Maintenance of Open Source Software by Nadia Eghbal
If you're dealing with Open Graph metadata for your site, and you can't figure out how to get your OG content to update after you make changes, this is your guide.
Put simply, gitignore.io is a tool that is so profoundly helpful that I've forgotten what life was like without it.
I added support for mdx to my site, and it's made life much bettter.
I fully switched my personal site from Google Analytics to Fathom - something that I had been considering for a while, and finally decided to go all in on.
On my walk this morning, I found myself wondering what it's going to be like when things go back to normal.
This post came from my work on Surviving Other People's APIs. I've been working on a chapter on Async - the content below came from that writing, but doesn't quite make sense in the context of the book. I didn't want to scrap it entirely, so it's found its way into a blog post. I'd love to know what you think!
My guess is that if you’re reading this, you’re a newly remote worker, due to the rapid and terrifying expansion of the COVID19 Pandemic. I’m not here share medical advice; if that’s what you’re after, there’s far better places to look.
If you follow me across the various other social networks I use, you'll likely stumble across my passion for cycling. For the past 8 or so years, road cycling has been my primary form of exercise. I love cycling; it keeps me sane, and helps me live a healthier life, while seeing the world. If you haven't been on a bike recently, you should give it a shot - I can't recommend it enough.
So, like all good things, the idea for this post comes from a tweet...
Dependabot is an automation service that will automatically create PRs to keep your projects' dependencies up to date, and it is really powerful.
This is an article about CSS and usability. The ch unit in CSS was a revelation for me, and I promise that if you don't know about it already, you're gonna love it.
This is a follow-up to my first post on the upcoming Promise.allSettled() function, coming soon to a node application near you.
Part 2 in a series of posts on destructuring syntax for JavaScript and Node.
Promise.allSettled() is a new API coming to the JavaScript / ES6 standard which can help you more efficiently build node applications that make simultaneous asynchronous API calls
If you're not careful, your node projects can start to fill all the spare disk space on your computer. This one weird trick (lol) can help avoid that.
Last week I posted about some stickers I designed and had put up for sale to benefit victims of the shooting in Christchurch, NZ. They sold out far, far more quickly than I ever would have guessed.
Destructuring syntax in es6 (or es2015, etc) JavaScript is a wonderfully useful bit of the language. It allows you to extract values from an Object and assign them to a new variable in one statement -- but it can be confusing to read.
Uninstalling Postgres database software from a computer running MacOS isn't super straightforward - this is what I found helpful.
Get yourself some of these eggtastic stickers - gun violence is intolerable, and we need sensible gun reform. 100% of proceeds go to charity!
An efficient workday is helped tremendously by having a handful of productivity boosters in your quiver. I use these extensions for Chrome to make my day a little nicer.
No, really, it doesn't work that way. It will sound loads better if you stop talking into the top of your Blue Yeti mic. It's an easy mistake to make.
Prettier.js is a fantastic way to systemize and automate your project's code style.
I've got some strong opinions on things - I hope that's okay. Thankfully, this is not just another 'hello world' post