Sign in

Adam Fortuna

@adamfortuna.com
982 followers 647 following 3.3K posts

Full-stack product developer (Rails/React) in Salt Lake City, UT. I love enlivening experiences, visualizing data, and making playful websites. 📚 Founder @hardcover.app 🎧 Developer @libro.fm ✍️ Blogger @ adamfortuna.com

PostsRepliesMedia
Adam Fortuna @adamfortuna.com · 03/10/2026
Tried out the hand prototype to product line today, and it went pretty well on the first pass with Opus 5.5. Data wise everything is right, but needs some more polish to _feel_ right.
Book club card design with arrows pointing to places that explain what each part is. includes book club event details, a next event area, recent and future reeads. Hand drawn on dotted moleskin paperBook club card screenshot. includes book club event details, a next event area, recent and future reads.
441
Adam Fortuna @adamfortuna.com · 22/09/2026
Hardcover has been hit hard by bots over the last 2 months, including distributed hits from residential IPs around the world. It's been a game of whack-a-mole all week. New CloudFlare rules stop them, then a few hours later they get by them. Upgraded to CF Business yesterday, so we'll see 🤞
Chart of total pageviews on hardcover over the last 5 years. Goes from 1m to 2m in august and 2m to 4m in September.Pageviews per hour over the last week with sudden jumps.
330
Adam Fortuna @adamfortuna.com · 16/09/2026
Oof, bot attack at the same time. A bot from India started crawling every book page on the site, roughly 1k at a time. Fortunately able to split them out and stop that one.
Plausible chart showing increase from 20k to 120k visitors in a day (due to bots)Cloudflare chart of blocked requests from bots
010
Adam Fortuna @adamfortuna.com · 10/09/2026
Hadn't checked on my old site minafi.com in a while. Got an email from Google Analytics (it was started in 2017 - it was a different time), and looks like the bots have found it. Unless sure 5,800 people from Singapore are really into minimalism, mindfulness and financial independence.
Chart showing 5800 current users.
030
Adam Fortuna @adamfortuna.com · 09/09/2026
Bit of a fun one in Alpha: Vibes for Book Clubs. These are book recommendations based on all the members of a book club. Related note: Most Wanted shows number of book club members who have that book on their Want to Read list.
Vibes page with book suggestions based on people in a book club.
000
Adam Fortuna @adamfortuna.com · 08/09/2026
You know the Discussions prototype for Hardcover has been created by a developer by counting the rings in the nested information architecture. 😂
Screenshot of hardcover app on mobile on the book page with tabs for high level book info (reviews, book info, discussions), sub nav for discussions, mentions, mod and buddy read, and another nav for all, discussions and mentions.
110
Adam Fortuna @adamfortuna.com · 30/08/2026
Excited to hit 1,000 paid supporters on Hardcover today! 🥳 Building anything in the book space requires a _lot_ of patience. It's taken just over 5 years to get to this point – and we're still far from able to pay full salaries for us working on it (~1.5-2 full-time). Very exciting milestone 📈
Paid supporters gauge chart at 1000Revenue per month spiking above 5k for August 2026.
2180
Adam Fortuna @adamfortuna.com · 24/08/2026
Lately I've been jumping around between a bunch of Conductor PRs. I'm curious how others have handled this. What's helped me is creating Chrome Tab Groups that match the name of name of the Conductor workspace, with colors depending if I'm waiting on an agent to build, CI to run, or agent review.
Chrome tabs with titles like "3732 - Journal" with different colors indicating status and PR number.
011
Adam Fortuna @adamfortuna.com · 24/08/2026
On Friday we switched from a 3-day window to confirm email addresses to immediate confirmation. That closes a gap where users could be using the site without a valid email. So far our stats have been roughly the same for email confirmations, and much lower for support requests. Captcha next? 🤔
A table of hardcover registrations per day around 500-700 with 60% email confirmed.

Full table text: 

Signups, last 14 days
618/day average · 61% confirmed · UTC
Day	Signups	
confirmed
unconfirmed
Mon Aug 24 today, partial	587	
344/587 59%
Sun Aug 23	746	
436/746 58%
Sat Aug 22	709	
394/709 56%
Fri Aug 21	613	
358/613 58%
Thu Aug 20	544	
340/544 63%
Wed Aug 19	573	
344/573 60%
Tue Aug 18	594	
373/594 63%
Mon Aug 17	635	
388/635 61%
Sun Aug 16	725	
447/725 62%
Sat Aug 15	640	
393/640 61%
Fri Aug 14	570	
346/570 61%
Thu Aug 13	598	
365/598 61%
Wed Aug 12	618	
425/618 69%
Tue Aug 11	499	
311/499 62%
021
Adam Fortuna @adamfortuna.com · 15/08/2026
"Sexy cop" has really struggled since 2008.
Google trends for Sexy Cop, showing a decline by 80% since 2008.
000
Adam Fortuna @adamfortuna.com · 11/08/2026
The Hardcover team has been using a super-basic GitHub + Claude integration with the ability to work on issues, create PRs and conduct code reviews. (coding & PR review are Claude skills in the repo). Working on V2 of this system now with a timeline, multiple agents, and cost estimates.
Issue #3609 timeline. Starts with my assigning it to @jules-hardcover. Then it's worked on by another bot, a PR is opened, another bot reviews it.
010
Adam Fortuna @adamfortuna.com · 02/08/2026
Hardcover hit 7k weekly active users this week - a new high! Some API improvements we made last month sped up the site a bunch, along with a number of server tweaks and site optimizations. The site has been faster with less downtime as a result. Only 1 slow response time incident in 3 weeks!
Active users a week graph starting at 0 in 2022 and up to 7k now in 2026.Uptimerobot screenshot of a graph with a bunch of downtimes and spikes, but leveling out to fewer downtime and faster load speed in the past month.
160
Adam Fortuna @adamfortuna.com · 01/08/2026
After meeting with a bunch of arborist, I finally felt safe (for the trees) to cut some roots in our basement. Each one I talked said "I've never seen something like this before". That's ~9 times people we work with have said that. The joys of owning an old house. 😅 Bucky for scale.
50lb Black dog on the grass with roots about 4x the size for the dog.
000
Adam Fortuna @adamfortuna.com · 28/07/2026
Great article about how fragile masculinity and the manosphere have impacted politics. Going from almost having the first woman president to this is, well, sad. www.theatlantic.com/ideas/2026/0...
Screenshot of article with text:

What kind of program has this internet-brain-rotted masculinity brought us? A public-health official who neglects fatal outbreaks of preventable diseases because he seems to believe that only the strong should survive. A Department of Defense, renamed the Department of War, that launches a needless war of choice in the Middle East. A government that props up the fossil-fuel industry (manly) while deliberately suppressing green alternatives (girly), leading to a catastrophic rise in energy prices when that war doesn’t go as planned. A president who imposed tariffs to bring back “manly jobs,” but only drove up inflation instead.
000
Adam Fortuna @adamfortuna.com · 24/07/2026
It’s Pioneer Day today, Utah’s campy holiday that’s a combination of Independence Day and Columbus Day. For non-LDS folks like myself, it’s also called Pie and Beer Day. Picked up 4 mini pies to celebrate. 🥧
020
Adam Fortuna @adamfortuna.com · 23/07/2026
It took a day to clear the queue after these updates! Processed some of the most jobs in a day too. 😅
Sidekiq job with a jump to 3m.
000
Adam Fortuna @adamfortuna.com · 08/07/2026
My talk for UtahJS was accepted! This is the first one I've given in the age of AI, and it's completely changing how I'm creating and teaching topics. What someone needs to "know" to create something using LLMs is so completely different than it was even a year ago.
Partial screenshot with title "Teaching Example: D3.js Axis". with an axis shown and a <svg viewbox example with draggable handles under some of the numbers.
030
Adam Fortuna @adamfortuna.com · 04/07/2026
Reading @elevateutahpac.bsky.social s email about things to love about America and its spot on 👌
Email screenshot with text:

So here are a few reasons I still believe in this country, even when it is testing me personally.

Hot dogs exist
People are still welcoming to strangers, despite what our government seems determined to prove.
Air conditioning
The World Cup (even though we’re the first host to bomb a country that’s participating in it while it’s happening)
Hollywood still has it. Going to see a movie in a theater remains one of the best things in the world.
Tex-Mex. Read this Japanese fan’s take on being in America for the World Cup (bottomless chips and salsa slap)
Going to Target
Portion sizes
A road trip or driving coast to coast, seeing the vastness of our country
However far apart our politics get, most people still want roughly the same things for their kids
There are still people trying to make it better despite everything
The list could be much longer, and honestly, I would love to hear what is keeping you hopeful right now.
010
Adam Fortuna @adamfortuna.com · 04/07/2026
First time ever grilling ribs today! Calcifer, our new Ninja FlexFlame grill, has a very useful app. Able to see the temperate of the grill and the meat, and have some custom timers. Doing one rack as maple bourbon, one as Carolina bbq. Let’s see how it goes. 🤞
Screenshot of ninja iPhone app set to 250 degrees f, with pork ribs set to 203, currently at 116.
030
Adam Fortuna @adamfortuna.com · 03/07/2026
When hacking on one feature turns into 4 😅
Dropdown screenshot with discussions, groups, events and locations.
010
Adam Fortuna @adamfortuna.com · 02/07/2026
Wow, Fable absolutely eats up credits. I've never before hit the limit in the last year using Claude Code.
Claude use at max
210
Adam Fortuna @adamfortuna.com · 01/07/2026
Working on something on Hardcover that I’ve wanted for a while: Filter Lists. Think BlueSky’s moderation lists and labels, but for books and authors. Add to your own block list, create a public, private or following only list, or subscribe to someone’s else’s. Choose to hide or label them. 👀
Screenshot of Hardcover with books highlighted red with a label to indicate a filter list. Ability to hide/show them anyways.
241
Adam Fortuna @adamfortuna.com · 24/06/2026
The free little library on my block knows me too well.
Designing data intwnsive applications book in my hand
0100
Adam Fortuna @adamfortuna.com · 22/06/2026
One of my favorite AI hallucinations is how if you ask some models to generate a version of the Mona Lisa (ex: "Mona Lisa in Van Gogh's Starry Night style"), the person genreated might have two heads. ...because so much of the training data is people taking selfies with The Mona Lisa. 🖼️
Framed generated image of "Mona Lisa in Van Gogh style", with two mona lisa heads and stary night style sky.
041
Adam Fortuna @adamfortuna.com · 10/06/2026
One guess where I’m at.
Wood chipper
000
Adam Fortuna @adamfortuna.com · 05/06/2026
Exciting to see these prototypes we created almost 2 years ago (!) finally coming together. We're saving all references in a join table used for Mentions and hydrating the review, but it can also be used for showing All Mentions. In Discussions, this should allow for "Show Mentions" too!
Figma prototype of a review with Mentions below, which list out all books/authors/etc mentioned in the post.Review form with autocomplete for references.Discussions diaglog, inspired by Reddit, with a "Only Show" dropdown with "Mentions" as an option.
010
Adam Fortuna @adamfortuna.com · 05/06/2026
These notifications require a new kind of mentions feed. Inspired by BlueSky's this will be a separate "mention" feed whether you have notifications on or off. All of these are stored with just reference type + id in JSON Slate, and are hydrated at runtime.
Prototype of the Notification Mentions page that show a bunch of mentions of me or things I own in Hardcover.
100
Adam Fortuna @adamfortuna.com · 04/06/2026
I've been rebuilding the Hardcover Editor to use Plate.js ( platejs.org ) and it's been really neat! As part of this, we're also adding references to other entities in the system (books, authors, users, lists, etc). Lists can be Private or Follows only, which means they need to show up differently.
Review with links to other entities (book, list, etc) with one of them not shown.
140
Adam Fortuna @adamfortuna.com · 02/06/2026
Updated Hardcover's network diagram for the new Rust Search Proxy. About 20% of our API traffic passes through it. If I knew how Rust worked I'd be very excited about this. Claude Code built it and it seems to work super well, despite looking alien to me. 😅 Only 1 API req/s hits the main app. 📚
An architecture diagram of how Hardcover runs. Everything lives on Digital Ocean, with most of it inside a Kubernetes cluster.
A visitor hits a load balancer, which sends them either to the main Ruby on Rails app at hardcover.app or to the Rails API proxy at api.hardcover.app. The API proxy talks to two Hasura instances — one read-only, one read/write — that sit in front of our Postgres databases. There are four of those: a primary, a follower, a dedicated cache database, and a separate one for analytics. Redis is in there too, and a Sidekiq process chews through background jobs.
Search runs through Typesense, with a little Rust search proxy in front of it. Images get resized by Imaginary at img.hardcover.app, and there's a separate service that generates the OpenGraph screenshots you see when a link gets shared. Plausible handles our analytics, and a Digital Ocean Space hosts Rails assets.
Down in the Cloudflare layer: CDNs for images and static JS/CSS, plus an R2 bucket that mirrors our Google Cloud Storage (where book covers, avatars, and CSV imports/exports live). Off to the side, a headless WordPress site, and Loops handles transactional and newsletter email.Chart showing requests per second for API queries (42 req/s), mutations (1/s) and search (10/s).
020
Adam Fortuna @adamfortuna.com · 26/05/2026
Welcome! Not quite, but getting closer 😂
Text 99.1k users
020
Adam Fortuna @adamfortuna.com · 26/05/2026
We're getting close to a major milestone for @hardcover.app - 100k users! 👏 Launched: 2021 2022: 200 2023: 1,300 2024: 5,000 2025: 23,000 2026: 59,500 On pace to hit over 200,000 by 2027. 🫨 We're already starting to shift focus from acquisition to focusing on retention & engagement.
Text showing "99k users"
3180
Adam Fortuna @adamfortuna.com · 25/05/2026
Finally got Conductor working for Hardcover! 11 services are in a shared docker-compose file, with 4 more in a conductor one that starts up on new ports per workspace. Much easier to test multiple things locally & merge. Next step: switch the test database per worktree to avoid conflicts.
Screenshot of the Conductor app with 4 active workspaces showing one per issue. Showing 4 ports per workspace.
010
Adam Fortuna @adamfortuna.com · 23/05/2026
Finished 2 infrastructure updates to Hardcover in 2 days! 🥳 1. Auto-rotate our client-side TypeSense keys to prevent bad actors from hitting search directly 2. Convert the API Search (45-70% of total traffic) from hitting Rails to a lightweight Rust service internal to K8s Rails traffic 📉!
Grafana chart with search-proxy hitting 40-65 requests from 0. And Hardcover Rails changing from 400-800 req to around 200.Chart of Search Request percentage to the Rails site over time.
150
Adam Fortuna @adamfortuna.com · 21/05/2026
New use of AI that was handy this week is a custom Claude Skill that’s helped: /grafana 2h Will connect to Grafana’s MCP server for Hardcover that collects all logs for that timeframe, analyze them and generate biggest points of improvement. Runs in a growing context, written to md.
Response time chart spiking may 16 and resolving may 21.
120
Adam Fortuna @adamfortuna.com · 18/05/2026
Money - This section is a bit broad. It contains: - Spending by month, by category (pulled from Tiller) - Investments with values over time and asset allocation tiller.com is super-neat, and syncs to a Google Sheet this pulls from. Somewhat anonymized screenshots for some of these.
Spending and income by monthNet worth chart over timeDonut chart with asset allocationText showing:

Net worth
As of May 17, 2026
 
$100
in equities
+
$50
in cash
=
$150
Investable
+
$200
in home equity via Redfin
=
$350
Net worth
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Daily Checkin - I've been tracking my happiness level (1-9) for a while. I added an X/Y graph to set my gut feel on two areas: Calm to Anxious Drained to Energized Tracking this alongside a happiness level has been fascinating. I've been having back pain and are also tracking that daily.
x/y graph of calm to anxious, drained to energized, with the selected item of a little calm and higher energized.Energy change over the last weekCalendar over timeNote for the day with Eurovision party! comment
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Theme - This one is just fun. I created a few themes. Sometimes I'll suggest a new theme with a link and it'll generate one. I really like the colors from Mario Brothers 2 (NES), and have a theme just for that. 😂
Some themes for system, light, dark, subcon, focus, arcade, candy, shire garden
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Learn - Building this out today. I drop a topic in here, and it'll generate a 5-level plan to become proficient in it with examples based on my projects and personal interests. I have a separate repo (called wired), that has a skill to create a new lesson with code samples running in Docker.
What i'm learning list.example lesson for local embeddingAppend notes, check yourself on this topic, advance, regenerate or continue on the same level
200
Adam Fortuna @adamfortuna.com · 18/05/2026
Recipes - The recipes section is pretty nifty. I can either drop a URL or a photo of a cookbook, and it'll generate a note in my Obsidian vault. I can set dates I made each recipe, and keep track of what I'm planning to make. These are all just stored in markdown files with frontmatter.
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Goals: Fitness. I've been trying to focus a bit more on my health lately - namely getting more exercise and eating better. Seeing these helps keep it on my mind. Weight syncs from Withings scale → Apple Health → Exist.io → Rails Steps go Apple Health → Exist.io → Rails Exist has an awesome API.
Personal weight over time chart.Bar graph with bars for steps a day in different colors for days I've walked 8k steps.
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Goal: Grow Hardcover to $10k/month. What get measured gets improved right? Since switching to part-time in my job, growing Hardcovers revenue is a high-priority for me. Seeing this daily is good motivation.
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Goal: Read more books - This one is basic - it pulls in books from the Hardcover API and shows them. Same thing I'd see in my Hardcover goal, but nice to see on my personal homebase.
read more books goal with all the books i've read this year.
110
Adam Fortuna @adamfortuna.com · 18/05/2026
Goals - This section has about ~10 things I'm currently working towards. I'm still iterating on these, but seeing them helps me make progress. I mark them as done manually or skipped for the day (inspired by everyday.app ). Some of these pull data from Hardcovers DB, API or Exist.io.
Goals for hardcover, cookbooks, books, and other things.Goals for staying off social media, and exercise.
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Daily Briefing - A Scheduled Sidekiq job generates a daily briefing for me. This includes local news, calendar, todo list, topics I've mentioned to watch, it knows my lifes goals and yearly goals and suggests things based on those to help nudge me towards them.
Daily briefing page with todays calendar and temperature and AQI.
100
Adam Fortuna @adamfortuna.com · 18/05/2026
Homebase - This is my Rails/Postgres/Mastra/SideKiq setup that everything else is a part of it. Run on my Mac Mini. Nothing too crazy, other than how it's able to run some things using external LLMs or local LLMs. Accessible via a CloudFlare Tunnel. Inspired by Basecamp with "Spaces" for projects.
Main nav of a website with links for :

Today, Spaces, Goals, CAlendar, Skills, Clippings.
Right nav has links for weekly checkin, theme, chat with ai agent, daily checkin and my avatar. 

under spaces there are sections for All, Personal, Hardcover, Linafi, Money and Lain
100
Adam Fortuna @adamfortuna.com · 09/05/2026
I shared some major personal news in the May Hardcover Report ( hardcover.app/blog/hardcov... ) & wanted to share it here too: Yesterday was my last day full-time at Libro.fm! I'm switching to part time (25 hr/mo) + focusing on HC. HC's had an amazing year & I can't wait to see what happens next.
Activities per week on Hardcover with a major spike in 2006 from 25k to 125k.
4161
Adam Fortuna @adamfortuna.com · 08/05/2026
The phishing site had a screen that made it appear someone had access to my account that looked real - down to the A-avatar. This screen was to scare me into thinking they had access, mentioning on the call "Have you logged into any new sites with Google lately?". 9/11
Fake Google Third Party access screen
100
Adam Fortuna @adamfortuna.com · 08/05/2026
By this time I'd logged into that real-looking sites.google.com login, which looked like a real Google page at a real google URL. This was my big mistake. This page was the phishing link to get my password, and they succeeded! However, the page claimed something I knew was scammy... 5/11
Fake Google "Case in Progress" phishing scam
100
Adam Fortuna @adamfortuna.com · 06/05/2026
We've had some really heavy bot days on Hardcover (some bots must really want book data). We ended up turning on all of Cloudflare's bot protections and haven't seen a notable spike since then.
Graph of pageviews on hardcover, with baseline between 14-50k/day, with a spike to 700k.
020
Adam Fortuna @adamfortuna.com · 02/05/2026
Hardcover's search, done through our API, is currently 54% to 68% of the total requests to our main server. 😱 That doesn't even include people searching from the website. Crazy this endpoint was a 1-day spike & now it's the most used feature on Hardcover by volume.
Line chart of search use on Hardcover ranging from 54% to 68%
080