MoreRSS

site iconAdam Fortuna

A full-stack product developer living in Salt Lake City, UT.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of Adam Fortuna

My Second Term Plan

2024-11-07 07:06:52

Like many Americans, I woke up to a different world than I was expecting this morning. While I initially compared this feeling to 2016, it felt a lot more like 2004 for me. In 2004, Bush was reelected – a vote for his politics and brand of governorship that America wanted more of – even though I couldn’t stand him.

I spent over 12 hours watching the news, reading Reddit, and watching TikTok yesterday. It was the most I’ve doom-scrolled in quite a while, and it’s not something I’d like to make a habit of.

This comes immediately after my wife and I got back last week from a 16-day trip to Barcelona, Spain, and a cruise (Barcelona, Spain → Lisbon, Portugal → Porto, Portugal → Tangier, Morocco → Cadiz, Spain → Barcelona, Spain). During the cruise, I was utterly disconnected from the internet. I couldn’t remember the last days I had zero internet use.

Whenever I get back from a trip, I try to change my routine immediately. Fortunately, it coincides with when I want to turn off the news.

I’ve found the best times to change are when I have no clear routine in the first place. When I got back from my two-week Korea trip earlier this year, I started working with an online personal trainer, which was an incredibly beneficial change.

During the trip, I started brainstorming changes I wanted to make in my day-to-day life. Here’s what I came up with:

Redefine My Relationship with News and Social Media

For me, this means Reddit and TikTok. Both are platforms I can scroll on for hours. It’s unhealthy even in the best times. Now, in the time after the election, I know it’s going to be rough.

The time leading up to the 2016 election, and pretty much his entire first term, was a slow boil to see how much news and information I could take in. I’m following Kamala’s advice and not going back to that.

The goal of this would be:

– Completely stop using Reddit, TikTok and The New York Times (Only use TikTok for Hardcover).
+ More time reading books. I’m excited about this one! I read 2.5 books during my vacation and already feel my ability to focus for long stretches increasing.
+ More time writing blog posts
+ More time in general for other things

I’m not sure how I’ll keep myself informed about the news in a healthy way (any recommendations for that). I aim to spend more time on other social media (Mastodon, Facebook, Instagram, Threads). I suspect I’ll hear enough about what’s happening through those without relying on Reddit/NY Times.

Continue Learning Japanese

I fell out of this habit sometime last year, partly because I lacked a clear goal. I no longer wanted to live there or pass the NL1 proficiency test, which left me without a clear motivation.

After some reflection on this, and after watching Perfect Days, I came up with a goal (still very new, I’ll see if it sticks 😅): In 2026, work from Japan for a month to celebrate Hardcover’s 5-year anniversary. That’s still a year and a half away, which gives me a lot of time to learn and anticipate this. It also checks about 4 of my goals.

The goal of this would be:
+ Learn how to read Japanese at a basic level
+ Learn basic conversational Japanese, focusing on what would be needed to survive there for a month
+ Prepare to live in Japan for a month!

Right now my plan includes WaniKani (for learning kanji), Pimsleur’s Japanese course (for speaking) and Japanese the Manga Way (for grammar and structure).

If you have something that worked for you to learn Japanese, I’d love to hear about it!

Change to Maintenance Mode for Health and Fitness

In the last six months, I have focused a lot on my health. I tracked all of my calories (using LoseIt), went to the gym three times a week, and did cardio three times a week (usually Peloton or a run). I rarely had any alcohol. I minimized my desserts and didn’t eat out much. I targeted 1900 calories a day.

I lost 17 pounds (171 lbs → 154 lbs) while putting on 5 pounds of muscle (!).

At no time during this did it feel like I was depriving myself, but by the end it felt like I was spending too much time focused on tracking every calorie rather than just enjoying food.

I want to switch to a more relaxed approach to health while maintaining my current weight. This will mean less time focusing on the how and more time enjoying food and my current fitness level.

The goal of this would be:

– Stop tracking my foods
+ Continue with daily weigh-ins. Those will help verify if my exercise === calories in a similar way as tracking.
+ Switch from 6 exercise days a week down to 5.
+ Focus on getting 6k steps daily on weight training and Peloton days and 10k steps on all other days. (exceptions allowed if it’s rainy/snowy).
+ Whenever I go grocery shopping (about every other week), make a plan to get ingredients for a new recipe

Do a Weekly Review

I’ve written about weekly reviews before. I’ve tried weekly task organization too. This is a chance to check in with myself and see how I’m doing.

Lately, I’ve let these reviews swing entirely too much toward productivity and away from overall happiness. I want to switch more in that direction – using these as a chance to see if what I’m doing is making me happy or not.

The goal of this would be:

+ Conduct a weekly personal review. I do these in Notion in a folder for personal > reviews > 2024.
+ Focus on personal happiness and my relationship, not productivity.

Aggressively Say No

I was reading Slow Productivity by Cal Newport during my vacation and a number of things stuck with me. The TLDR of the book is this on page 8:

A philosphy for organizing knowledge work efforts in a sustainable and meaningful mannerm based on the following three principles:

  1. Do fewer things.
  2. Work at a natural pace.
  3. Obsess over quality.

My weekly review is a chance to verify I’m doing #2. I tend to obsess over speed more than quality while also taking on more than I often should.

The solution to this is to get better at saying no. That can mean saying no to working on a new Hardcover feature. Saying no to myself when I say, “I should build <insert new idea here>.” It can mean saying no when I say, “This barely works, but it’s good enough,” and instead write some damn tests (or, more likely, let Claude write them 😂).

The goal of this would be:

+ Be happy with whatever my output is – both in scope and depth
+ Create a sustainable pace for knowledge work

Focus on What You Can Change

The theme of all these is taking a step away from the news and distracting myself from *gestures broadly* everything.

I want to miss out on a constant barrage of destructive decisions by politicians, grifts to extract money, agencies gutted, courts packed, and everything else that will surely happen over the next 4 years.

Being able to tune this out daily and instead only look at the news occasionally is a privilege. I fully understand that. I still plan to support all the same politicians and politicians as before. I’ll be out holding signs at rallies protesting against whatever new right is being taken away. And who knows what else.

But what I won’t do is let myself drift into a doom-scrolling cycle that lasts a presidential term.

Make My 40s My Best Decade Every: Year 2 Update

2024-07-29 05:16:33

Two years ago when I turned 40 I set out some ambitious goals for the next 10 years.

The highlight was the line:

I want to make my 40s my best decade of my life (so far).

No pressure right. 😂

In the first 3 months of my 40s I tore my ACL, had surgery, had to let someone go from the Hardcover team and our 14-year old dog passed away.

It was a rough start.

Fortunately things have improved since then. I’ve tried to concentrate on not stressing myself out with additional pressure. I tend to put the most pressure on myself, and by it’s been amazing just dialing that down a little bit and noticing that I’m happier and less stressed.

I’ve also started drinking a lot less. Probably down from 8 drinks a week to more like 2-3. This was a result of two changes: not drinking at home and only having one drink when I’m out with friends or on a date with my wife.

By the time I’m 41…

Here are some of the goals I set out for my first year.

✅ I want to be able to hike the mountains of Utah (again)

After months of physical therapy after my ACL tear & surgery, I eventually recovered enough to hike again! In year 1 I didn’t hike all that much. One hike I did complete was Black Mountain – a 10 mile hike to the highest mountian we can view from our apartment window.

I attempted this same hike a few years ago in May, but there was too much ice in the scrambling part to complete it at that time. Doing it in July, on the 1-year anniversary of my ACL surgery, felt cathartic. Like I was finishing a book I’d left 95% completed.

✅ I want to get back to the point where I’m physically fit

“Fit” can mean a lot of things. My intention when I wrote this was that I wouldn’t want to use my knee as an excuse for not doing something. I’m not sure if I reached this in year one, but I’ve for sure reached it now. I’ve been skiing again, stood for hours at music festivals and concerts, run long distances (well, 10k 😅), and overall just haven’t worried about not being able to do something.:

❌ I want to grow Hardcover to pay for my food & housing

This one was always going to be a long shot. Hardcover did grow to over $1k in revenue per month, but our costs have grown too. We’re very close to breaking even. With over 1,600 users active each week, it’s a very lively place! We have some plans to increase revenue that we’re working on for this year.

By the time I’m 45…

I also set a few longer term goals.

🔜 I want to learn how to build mobile apps

Earlier this year I spent some time learning SwitftUI. Alongside a group of random people from Discord, we launched SpaceTube, YouTube for Spatial videos on the Apple Vision Pro. It was a fun, quick project.

However I wouldn’t say I learned how to build mobile apps as part of this.

I did learn that perhaps SwiftUI isn’t the path I want to go. Instead I’ve started learning React Native instead. I’m already comfortable with React, and it works on both Android and iOS. It’s likely we’ll move Hardcover to React Native someday – but I have a lot to learn first.

My hope right now is to switch Line of Thought from a web app to a mobile-only app using React Native and HealthKit. I have such a clear idea of the app I want to build – I just need to build it! 😅

❓ I want to go on a 6-week (or longer) international trip

This is a tricky one logistically. We’re planning to adopt a dog later this year. I wouldn’t want to leave our new family member alone, or with a stranger for that long a period of time. I’m unsure how this will work into actual plans.

We did spend two weeks in Korea in April 2024 which was amazing though! It reminded me how much I love being in a new city, eating new food and having new experiences every day.

Where would I/we go? I’m not sure. I’d love to spend more time in Japan. I could see many parts of Asia being amazing for an extended trip. I’ll keep thinking about this one for now.

Or maybe we’ll just decide to leave the US altogether based on the next election. 🤷

🔜 I want to grow Hardcover into a successful business

We’re making good progress on this. If Hardcover continues to grow 10x a year then I feel like this is only a matter of time. If our momentum slows down we may have to change course, but we’re not there yet.

For now it’s more about continuing to do what we’re doing! Listen to users and build what they want. Get the word out to more people. Find new people to work with. Repeat.

By the time I’m 50…

These were long-term when I set them. I have 8 years left. 😂

❓ I want to give away $1 million

This is dependent on Hardcover (or another business) generating revenue. There’s only so much money anyone needs, and it’s not as much as most people think.

🔜 I want to visit all 50 states by the time I’m 50!

This is only three trips away:

  • Take an Alaskan Cruise. We have a bunch of friends in Seattle that might be up for this one too.
  • Take a trip to Hawaii. With the fire and deluge of tourism lately, it feels like going there would be adding to the problem locals face rather than helping. I’d still like to go – and not stay in an Airbnb).
  • Take a road trip to the midwest. All the states in the US I haven’t been to are all grouped together (Wisconsin, Minnesota, Iowa, North Dakota, South Dakota, Nebraska). We have some friends that moved to the Chicago area it’d be fun to road trip out to.

❓ I want to figure out where to live long-term

Every year when our lease is up in our apartment we have the same discussions about where we should move. For the last year years we’ve been very happy here in SLC. The longer we stay here the more we love it!

To stay anywhere long-term we do like the idea of buying a house. What we could afford today would be a major step down from our apartment. That’s led us to be happy where we are.

If Hardcover ends up growing and providing some income, then I could see us having the ability to make a buying decision here. Until then, and until we know what direction our country is headed in, we’ll wait and see.

✅ I want to fitness to be on autopilot

I’m surprised to say I can actually check this one off already! Well, it’s not solved for good. Every plan needs to adapt to whatever life throws at it.

For now, my fitness plan includes:

  • Go to the gym Monday, Wednesday and Friday.
  • Peloton or run Tuesday, Thursday and Saturday.
  • Take Sundays off.

Fitness-wise I’m happy when where I’m at. I could walk a bit more, but that’s really it.

The hardest part was changing my morning schedule. Previous I’d sleep in as late as I wanted, then get up and have breakfast with my wife every day. In April I started workout out with an online personal trainer and waking up early for a morning workout 3x a week. Most days I end up waking up before my alarm and looking forward to going to the gym! It’s a chance to listen to audio books and wake myself up for the day.

What’s Changed?

30 Days From Learning to Launching a Swift App on Apple Vision Pro

2024-01-30 15:02:06

I have a confession to make: I’ve tried multiple times to learn iOS development and each time I’ve failed.

Let’s rewind to 2007. The very first iPhone was just released. When it initially came out, there was no App store or way to create apps. Apple’s workaround was simple: just build everything as a website (as long as there’s no Adobe Flash).

A year later in 2008 the App Store launched and developers could start creating apps using Objective-C.

I graduated college in 2005 and was working my first job making websites. In a few years I went from PHP to ColdFusion to ActionScript to Ruby on Rails. In each case I was building for the web – not for mobile.

When the App Store launched, I had to made a career decision: do I continue trying to learn how to build for the web and become really good at Ruby, do I try to switch to iOS development (from scratch), or try to do both.

I think many people have a point like this in their learning journey. They don’t learn something new until they need it. My jobs used web technology and I didn’t need to know iOS development.

There were a few times I tried to learn iOS development. I took the Stanford iOS course and learned some Objective-C basics. I read Head First iPhone and iPad Development and gained a better understanding of how components communicate. I took a course on iOS development at a local community college (and even made some friends). I worked on multiple Code School courses about Objective C and iOS development. I even went to WWDC and was even interviewed by a Brazilian newspaper with my coworkers Eric and Jon.

Throughout all of this I never dedicated the time needed to get good as iOS development.

Over the years I’ve set goals for myself to learn more about iOS development but each time I don’t dedicate enough time to make an impact. I’ve told myself that anything I create isn’t going to be as good as what seasoned developers can make. Or that a new solo dev can’t compete with people with a decade of expererience.

The sad part is if I’d continued learning a decade ago, that’d be me!

As part of my goal to make my 40s my best decade ever, I want to break out of this pattern and learn how to build apps using Swift. With the release of the Apple Vision Pro, I’m more excited about Swift development than I’ve ever been before.

I have no idea what the future holds for AR and VR, but in my gut I feel it’s a new medium that’s going to revolutionize the way we interact with computers – similar to how the iPhone did. I don’t imagine that’ll happen immediately, or even with the current iteration of AR/VR, but when it does I want to be able to build the apps that I dream about on it.

With that in mind, I’ve decided to keep a learning journal of my experience learning SwiftUI development with the goal of building apps for the Apple Vision Pro in 2024.

My goal is to ship an app on the Apple Vision Pro in February (!). Let’s go! 🙌

Day 1: January 28, 2024

Where to start! There’s no shortage of iOS development resources out there. Many educational resources start at the very beginning, which would be perfect for people wanting start from scratch.

I’ve never programmed in Swift before. Initially I thought, “OK, I’ll learn Swift first”. I watched a few Swiftful Thinking videos and quickly realized this is too basic for what I’m looking for. Swift as a language isn’t anywhere near as confusing as Objective-C.

Next step: let’s look for a course to start learning SwiftUI!

The two courses I found that looked the most promising are Design+Code and Kodeco. Kodeco was formerly raywenderlich.com, which has been a pillar in iOS education for a decade. Back at WWDC I even went to a party they threw!

Before jumping into a paid course, I decided to check out what the official Apple resources were for learning how to build apps. I was fortunate to stumble on the Sample App Tutorials, which were exactly what I was looking for!

Starting with the About Me app, these tutorials are amazing. You download a sample application that you can run locally. The website goes through the code file by file explaining the key parts and giving recommendations on some parts I can change to see how it impacts the app.

This was an ideal app to learn the basics. It’s a navigation bar, 4 static pages and some content that’s set in a single source of truth. Super straightforward and understandable from the code and description alone. This one showcases a bunch of concepts:

  • Navigation Tabs
  • Horizontal and Vertical stacks for organizing content
  • Text and Images
  • Looping over arrays
  • Scrollviews
  • Performing an action when a button is clicked
  • Various other styling options for corner radius, padding, fonts, aspect ratio and more.

A very solid start that already opens up a bunch of possibilities.

The next app they showcase is the Choose Your Own Story app. This one uses a NavigationStack to create a “choose your own adventure” story. You’re presented with a story and a number of choices for your next step. Clicking on one takes you to the next page by pushing a new view on the NavigationStack.

As a web developer, I’ve always wondered how some apps have a separate history for each tab in their navigation (like Letterboxd for example). Turns out the answer is that each tab likely has their own NavigationStack. That explains why clicking on a new tab clears the back button, and yet clicking back to a tab brings you to the last view you clicked on in that stack. 💁‍♂️

One thing I don’t fully understand is where an app starts. 🤔

Day 2: January 29, 2024

Before starting today I went back and started this blog post. I’ve found that when I write about what I’m learning I end up retaining much more of it. Might as well learn and share while I’m at it!

Before jumping to the next sample project, I wanted to figure out why the start file for the two projects was different. I noticed that the start files have a @main decorator and extend from App.

@main
struct AboutMeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

On to the next project: Date Planner! This application is a nested todo app. You create a new Event with multiple todos associated with it. This app touches on a bunch of new concepts.

One concept I’ve interacted with a bunch in other apps is a List. A list contains rows components, each of which can be swiped left for additional actions (like delete). Recreating this kind of interaction in JavaScript would be a pain, yet in Swift it’s just this:

ForEach(eventData.sortedEvents(period: period)) { $event in
    NavigationLink {
        EventEditor(event: $event)
    } label: {
        EventRow(event: event)
    }
    .swipeActions {
        Button(role: .destructive) {
            eventData.delete(event)
        } label: {
            Label("Delete", systemImage: "trash")
        }
    }
}

These few lines do a lot! The EventRow is the component that shows up each row of the List. When the row is clicked, the EventEditor component is shown. And lastly you can swipe left to see the delete action. Here’s what that ends up looking like.

I learned a bunch from this app. The List, View and swipe controls are all concepts I’d love to implement on a native Hardcover App.

Day 3: January 30, 2024

To start, I realized I didn’t read everything about the Date Planner project. That made me realize that the view on the iPad was completely different than the iPhone app. Looking at the code to understand this I’m still a little fuzzy on how this is done, but it’s good to have an example of how it works.

The next app, Organizing with Grids, is simple in comparison with only two files (whew, I needed that after the 13 files from the last one). This one showcases a grid and updating the current state to change the title color based on what’s clicked. It’s simple, but it’s a good example of how grids work.

The grid from Organizing with Grids is hardcoded to be a single column. Editing Grids makes this concept dynamic with a Stepper.

One concept that I wish React.js had that was used in this demo used is the idea of an @binding variable:

@Binding var symbol: Symbol?

This allows a variable to be passed into a component, it to be reassigned in that component then for the calling context to get that updated value. So, a two-way binding.

Day 4: January 31, 2024

Day 6: February 2, 2024

It’s time: I picked up my Apple Vision Pro!

Ever since I watched the Hyper Reality video years ago, I’ve been excited about the possibilities offered by augmented reality.

Building an app for the AVP is one of my top motivations to work on this now.

I did the demo at the Apple store, which showcased some immersive videos and instructions on how to interact with the device. If you end up getting the device yourself, you can watch the same video from the AppleTV app, but the spatial video examples are only available through the demo.

Today we had some friends coming over for a party, and took the opportunity for everyone to go through a demo of their own. 😂

The results were a lot of people saying “wooooow”.

Day 7: February 3, 2024

Continued reading through more sample swift code from the Apple website. I think I’ve finished everything from the Sample Apps section that’s relevant to the type of apps I’m hoping to build.

Day 8: January 4, 2024

Through the AVP Subreddit I joined the Apple Vision Pro Discord. I found some recommendations on apps. One that I’d love to see is a way to share or find spatial videos. The ones in the demo were incredible, but I haven’t been able to find many other examples.

Day 9: February 5, 2024

I tried an experiment today of working on Hardcover using the Apple Vision Pro and posting about in realtime on Mastodon.

You can read the full thread if you’re curious. The takeaway was that everything was possible, but I was about 75% as productive and 100% more exhausted after 3 hours.

As far learning goes, I decided to switch from Apple’s sample code to videos with Kodeco. I watched the first course in the SwiftUI path, Your First iOS & SwiftUI App: An App from Scratch. It was a very gentle introduction without lingering on the basic syntax.

I ended up watching a bunch of these lessons from the AVP while my wife slept on my lap. 🤗

Day 10: February 6, 2024

Met up with a developer I found from the AVP Discord with the idea of building a YouTube for Spacial Videos.

I registered the spacial.tube and spacial.garden domains for this, but not sure if I’ll use either. For now I setup a Rails site on here from a template that’s a YouTube clone from a starter codebase.

Day 11: February 7, 2024

More developers are involved in the project now – we’re up to 6 in fact! Moved from space.tube to spacetube.app, as a Next.js app landing page.

Day 12: February 8, 2024

Had the kickoff meeting for the group of us building SpaceTube. We’re aiming to launch something by early March 2024.

I’ll be mostly working on the backend, but this’ll be a great chance to understand how the SwiftUI side works as it’s built out by some developers with a lot more experience than my 11 days. 😅

From a technical standpoint, the app will be a SwiftUI app for the Apple Vision Pro, using Supabase for the database, and Next.js for the few backend actions and a landing page. I initially put it in Rails, but this tech stack means less code overall – and less that any one person has to support.

There’s a Swift library for Supabase that’ll allow us to read and write directly from it.

Day 13: February 9, 2024

Someone joined the Hardcover Discord interested in creating an iOS app. We’re going to work together and build something while we’re learning. 🙌

They shared two in depth articles about Swift design that I was able to understand about 40% of.

Day 14: February 10, 2024

Spent most of today working on non-iOS stuff: SpaceTube newsletter setup and and updating this blog post.

Why You Should Add a List of Projects You’ve Built To Your Blog

2024-01-07 08:18:41

I’m going to pitch you an idea: if you have a personal blog, you should create a Projects listing page.

Beyond the regular blog post pages and listing pages, many sites also have an About page.

Over the years many bloggers have added /now pages, popularized by Derek Sivers at Nownownow.com.

Recently there’s been a spike of bloggers listing the apps they use, popularized by the Hemispheric Views podcast episode. As of this writing, there are already 330 blog posts of peoples apps. Not bad for two months!

One other page I personally love to see is a Goals page. Any time I find one I devour it and update my own with new dreams.

While Goals look forward, I liked the idea of creating something that looked back. For that I decided to create a Projects page.

What is a Projects Page?

A Projects page is where you list all projects you’ve worked on in your area of expertise. If you’re a programmer this could be all programming projects. If you’re a woodworker, this could be all of your creations. If you’re an artist, this could be your body of work.

The important part is to include everything. Your successes, your failures, your works in progress, projects that have been retired, projects that never launched and anything else you can think of that you did enough work to consider it significant.

What you consider significant will be subjective. There are projects I prototyped out and wrote a few lines of code but never made significant progress on that I added because I spent a lot of time on them. Only you will know what’s significant.

What you decide to show, and how you want to show it, is up to you. This could be a single new post you create with a full list that you update. It could be a folder of Markdown files or a new addition to your CMS (more on how I did mine later). In my case, I added all of them to WordPress as a new Post Type (Project) and list them all on my Projects Page.

A Celebration of Your Success

A lot of us don’t get to celebrate our successes enough. It can come off as bombastic or bragging if taken to extremes and that can sometimes prevent us from taking that time to enjoy what we’ve done.

For me, creating this Project listing was rewarding. It was a celebration of projects I completely forgot about, yet thinking of them made me smile.

Some of these are weekend creations like NG Guess, an Angular app where people could when the new version of Angular would come up. Many (17) are Code Schools courses I worked on in various roles. Some projects never launched, liked Seek Adventures, an site that would turn AllTrails hikes into a beautiful interactive map.

Some of my favorites are the earliest websites I ever made. A Dance Dance Revolution community. A Settlers of Catan league. A marketplace that showed the in-game cost over-time for digital items in the game Ragnarok Online. An fan site for an anime IRC Channel.

As of today I just added my 100th project to this page, The Hardcover 2023 Year in Books! 🥳

Some projects never launched. The most were seen by 10s of millions of people (the free Code School courses for Try jQuery and Angular were linked from the homepages of those frameworks, making them the most widely viewed projects I’ve ever worked on).

I absolutely love seeing other peoples Projects, and I’d love to see yours! If you’ve created one comment on this post with the link

Technical Breakdown of My Projects Page

In late early 2023 I migrated this blog from using Middleman, a Ruby static site generator, to using Next.js backed by a headless WordPress CMS. Like a lot of indie creators, I’ve used this site to experiment with new technology over the years.

The most significant change when switching from Middleman to headless WordPress is where data is stored. Rather than having posts in Markdown files, they’re now stored in a database that I can update from a website.

That worked well for posts, but less well for other content. When I started my Projects page, it didn’t cross my mind to put that content in WordPress. It was structured completely different and didn’t match up with a traditional post.

A few weeks ago, while prototyping an idea I couldn’t get out of my mind, I found a solution I didn’t even know I needed.

Advanced Custom Fields

WordPress has always has had an option for “custom fields” for as long as I can remember, but it always felt hacky – until I found Advanced Custom Fields.

Advanced Custom Fields, or ACF for short, allows for two incredibly useful additions to WordPress.

First, you can create new Post Types. A Post type is a high-level concept of a post that you want to have multiple of. For my Projects page, I created a new post type of Project. On Hardcover, we recently created a new type of “Live”, which we’re using for Hardcover Live episodes.

Second, you can create groupings of custom fields which are attached to a post type. For Hardcover Live, we created an “Episode Info” group with fields for Episode Number, YouTube ID, Podcast URL and more. For Projects I used this same approach to set links, dates and more. My favorite part was being able to upload an icon from the WordPress admin.

ACF Settings for a Project

With this group created, it can be attached to posts of a specific type – in this case Projects.

With that combination in place, each Project will include a form at the bottom of it with each of those fields.

Some of these fields are freeform, others are drop downs with a predefined list of options.

For technologies, I used WordPress tags. That also means if I tweak any single tag in one place it updates them everywhere.

Free ACF Limitations

All of this can be done completely for free. Advanced Custom Fields Pro starts at $49/year, a little much for this blog. Fortunately everything I needed for the Projects page was available for free.

There is one thing that isn’t: repeating fields. For Projects, sometimes I wanted to add a dynamic number of links. ACF Pro has a solution for this: Repeater fields. Repeater fields allow you to create a group and then, well, repeat them.

Instead of paying the extra cash, I added a bunch of optional fields for “link 1”, “link 1 text”, “link 2”, “link 2 text” — all the way up to link 5.

It’s hacky, but it’s free.

GraphQL ACF Access

ACF gets the data into WordPress, but you’ll still need a way to get it out. To my amazement there’s a plugin that does everything we need: WPGraphQL for Advanced Custom Fields.

With this plugin installed, you get a brand new option for each section.

ACF Section option added by WPGraphQL for Advanced Custom Fields

Now, you’d think this would be everything you’d need to do. However, this only works if the Post type is a Post. In this case the post type is a Project. Fortunately, there’s a quick fix. We need to register this post type in GraphQL in our theme file.

They way I prefer to do this is updating the functions.php file for my theme and adding the following line:

// Require all custom code
require get_template_directory() . '/../custom.php';

Then create a file at wp-content/themes/custom.php. By splitting this code out into a non-theme specific file it’ll be a lot easier to change the theme later on. This file registers projects in GraphQL

<?php
// Show Tools in GraphQL
add_filter( 'register_post_type_args', function( $args, $post_type ) {

  // Change this to the post type you are adding support for
  if ( 'project' === $post_type ) {
    $args['show_in_graphql'] = true;
    $args['graphql_single_name'] = 'project';
    $args['graphql_plural_name'] = 'projects'; # Don't set, and it will default to `all${graphql_single_name}`, i.e. `allDocument`.
  }

  return $args;

}, 10, 2 );

I’m no expert in WordPress, so finding this took some trial and error. I knew it was working when the GraphiQL IDE in WordPress showed these new fields.

With that, the data was now available!

Accessing ACF Data from Next.js

If you’ve already setup Next.js to pull down posts, then pulling down Projects will be a breeze.

import { getClientForProject, parseProject } from '@/lib/wordpressClient'
import { Project } from '@/types'

export const findProjects = `
query GetProjects {
  projects(first: 10000) {
    nodes {
      projectInfo: project {
        category
        compensation
        dateEnded
        dateStarted
        employed
        employer
        fieldGroupName
        link1
        link1Text
        link2
        link2Text
        link3
        link3Text
        link4
        link4Text
        link5
        link5Text
        link6
        link6Test
        role
        size
        state
        stateDescription
        yearsActive
        icon {
          sourceUrl
          mediaDetails {
            height
            width
          }
        }
      }
      excerpt(format: RAW)
      title
      slug
      tags {
        nodes {
          name
        }
      }
    }
  }
}
`

export const getProjects = async (): Promise<Project[]> => {
  const result = await getClientForProject('adamfortuna')({
    query: findProjects,
  })

  return result.data.projects.nodes.map((node: any) => parseProject(node))
}

The parseProject method is doing some heavy lifting of converting the WordPress format into a Project type that my front-end relies on.

React.js & User Experience

The actual front-end is standard React. In fact, it’s probably bad React. Sorting happens entirely on the front-end, there are some flickers, it’s the minimum needed to work.

It’s the kind of code you’d expect – looping over projects and showing them. Nothing fancy.

The “Organize By” part sets state a level higher and toggles which components and fields are used to render the projects. That combination of different listing components + sort field allows for a ton of flexibility. Start date, end date and technology (WordPress tags) were the most useful to me.

Other Blogs Projects Pages

Have you created a project page? Let me know in the comments or on Mastodon and I’ll add a link to it here! I’d love to see a bunch of peoples Projects pages.

  1. Adam Fortuna’s Projects
  2. Your project here.

My 2023 Year in Review

2023-12-29 08:33:25

I’ve written a “year in review” post for the last thirteen years. I highly recommend you try it. It’s a time capsule that lets you reflect on the past year, appreciate parts of it that were great, and develop a plan for the next year. You can view any of the past 13 years’ posts here: 2010,  2011,  2012,  2013,  2014,  2015,  2016,  2017,  20182019, 2020, 2021 and 2022.

We fixed Marilyns moms record player that’s as old as us and listened to it a bunch this year.

2023 might just be my favorite year so far. When I reflected on this year that came as a surprise to me. We didn’t travel much this year, I didn’t have any massive professional success, and our family stayed the same – we even kept most of our plants alive all year 😅.

My top themes of the year were Hardcover, physical therapy, and having fun with friends.

It was a year of little enjoyments.

On the personal health side, I started going to the gym 6 months after my ACL surgery. I turned in my calloused CrossFit hands for a more low-key Planet Fitness membership and a Peloton. I’ve enjoyed walking to the gym, listening to audiobooks while I work out, and being on my own schedule. I went on a few hikes, but most of my exercise was relaxed – much easier than the multi-day hikes of years past.

Rather than spreading myself thin with too many projects, I spent most of my time this year working on Hardcover. This involved a MAJOR revamp from Next.js 12 -> 13 14, a redesign of over a dozen pages and an update from client-side rendering to server-side. We launched on ProductHunt, released a 2023 Year in Books and grew from 1,300 members to over 5,000! I’m continuing to love working on this project and it’s getting close to being profitable.

Marilyn and I developed a few new routines that we’ve fully embraced. Coffee and breakfast and bed together, Thursday date-days out (often using MoviePass) and takeout Friday nights. When sitting down to program I discovered a love for tea, and embraced warming myself up with it while thinking through various problems.

This year had a few down notes well. In August Marilyn caught COVID after a trip to Florida (which seems pretty on brand for the state). We quarantined in separate rooms, watched movies together remotely and played a bunch of Mario Kart until she was better. Fortunately I didn’t catch it. We adopted a dog only to have to return him to the shelter the next day after an awful allergic reaction. We went to urgent care once for an injury. Most of the rest of the stress from this year was self-imposed anxiety from trying to do too much, or negative reactions online to things I’ve built (which is rare, fortunately).

The news this year focused on a few stories on repeat. Trump’s trials, Twitter’s fall and Israel’s war with Palestine. I can’t wait to see him in jail, for evey one leave Twitter and peace & sovereignty for Palestine.

My 2023 Month By Month

I started doing a monthly breakdown last year and loved being able to look back and see what I thought was most important each month.

January: We started the year in Orlando visiting family then flew home for Video Games Live. We watched (and became obsessed with) RRR. We volunteered at the Sundance Film Festival where I saw another 21 movies and shorts – The Eight Mountains being my favorite.

February: The Hardcover iOS App was approved in the App store (after about 5 tries 😭). I published a few posts on this blog, and learned a bunch about AI Art which I used to generate a Valentines day gift for Marilyn. Signed up for Planet Fitness and started going to the gym for the first time since before COVID lockdown.

March: Went to a fun crawfish boil at a friend of ours place, went to Las Vegas to see Six (the broadway show), checked out Area 51/Omegamart and ate all the things. Played some Ragnarok Online for the first time in years which was nostalgic.

April: I track my happiness and everyday in April was a 7 (out of 9 max) or higher. Started a guys board game group. Marilyn and I went on a historic house tour of a local mansion. Saw Spirited Away live. Watched Love is Blind on Netflix and John Wick 4, finished playing It Takes Two, saw Evanescence and Muse with friends, had a friends birthday in an escape room, and played group rock band. It quite a social month.

May: Got a shiny new monitor, started updating Hardcover to Next.js 13, implemented a whole new search using Algolia (which would later be redone in Typesense). Went for my first hike since ACL surgery (Ensign peak shown above). We took a trip to Boulder, CO for my 41st birthday where we went on some hikes, ate & drank all around and explored MeowWolf Denver (2 MeowWolf’s in one year!).

June: Went to a Minor League Baseball game with friends, gave a talk about FIRE to a college, gave a talk about Hasura, had a crazy busy day where I went to a friends BBQ, went to a speed-friending event and saw a movie (Perfect Blue). Went to see Cake, Barenaked Ladies and Semisonic in concert and played a BUNCH of Final Fantasy XVI. And worked a bunch on Hardcover.

July: Started the month with a 2-night camping trip with friends that’s becoming a yearly occurrence. Introduced some friends to Ethiopian cuisine & Indian Jones (“he punches nazi’s, hates snakes and loses his hat” 😂). Continued working on Hardcover. Went on a week long vacation with friends to Lake Tahoe where we did a murder mystery game (with costumes above) and went through multiple bottles of champagne a day. 🍾🍊

August: Saw Smashing Pumpkins, gave Marilyn her birthday present (1st class tickets to South Korea!) and saw The Flaming Lips perform my favorite album in it’s entirety (Yoshimi Battles the Pink Robots). Launched the new Hardcover after almost 4 months of work – and no major bugs! Ended the month with Marilyn returning from her Florida trip with COVID.

September: Busy month! Marilyn recovered from COVID, and we adopted a dog for a night before returning him due to my allergies (we weren’t able to tell what breed he was). Went to FanX. Avenues Street Fair, Social Histomap project, switched from Imgix to Imaginary on Hardcover. Ended the month by launching Hardcover on ProductHunt for our highest signup count days yet!

October: Recovered from the launch, saw Lily Tomlinson live, went to urgent care for a bump to the head (we’re ok), went to Hoogle Zoo & a friends party in costume as Beetlejuise and Lydia and started playing Baulders Gate 3.

November: Fully embraced Date-Thursdays, compulsively worked on a project for a week before abandoning it, went to Dragonsteel – a huge Brandon Sanderson convention. Watched and loved Loki Season 2. And we got our record player back from the repairman after 14 months (!).

December: Went to see my wife’s artwork hung up in a art show. Underwent an allergy pin test and started planning for allergy shots (new dog, `24?). Went to a boozy brunch with friends, had game nights, released the Hardcover 2023 Year in Books, and launched the Hardcover Live podcast.

Yearly Favorites

Favorite Spot I Visited: Lake Tahoe was a lot of fun. I’m realizing I haven’t had enough trips with friends where we just hang out together, have fun and play a bunch of games while drinking mimosas far into the afternoon.

Favorite Meal: Susuru in Orlando! This was on January 1, 2023 too. Urban Hill in SLC for Marilyns Birthday and Flagstaff House in Boulder for mine were our most “upscale” tasty meals. The crawfish boil complete with crawfish sausage was delicious too. We had a bunch of tasty food in Vegas, but eating take out Dim Sum from the Venetian in our room stands out.

Favorite Video Game I played: You might expect me to say Baulders Gate 3, but honestly it was Final Fantasy XVI. I loved the storyline and was always left wanting more. I do enjoy the strategy of Baulders Gate 3 much more.

Favorite Board Game I played: Concept with friends in Tahoe was a blast. Wingspan was consistently fun. I’d like to play more Terraforming Mars. I don’t think I bought any new board games this year – which is saying something.

Favorite Concert: The Flaming Lips hands down. This is the second time we’ve seen them and both times it’s been incredible. They’re my favorite band to see live.

Favorite Live Event: Either seeing Six in Vegas or Lily Tomlinson. Or seeing Spirited Away live – that was incredible.

Favorite Hike: On the 1-year anniversary of my ACL surgery I went on a 9-mile hike that I’d previously been unable to finish due to icy conditions. That hike, Black Mountain, is visible from my bed. It’s nice to look out at the mountains and be able to say “I climbed that”.

Favorite Movies: RRR, Barbie, The Eight Mountains, Guardians 3 and The Artiface Girl were my new 5 ⭐ watches from this year.

Favorite Shows: We watch so much there’s no way I can remember everything. A few that stand out: The Gilded Age S2, Lessons in Chemistry, Foundation S2, Star Trek: Strange New Worlds S2 (watched it twice!), The Bear S2, Star Trek Picard S3, The Last of Us S1, Silo S1, One Piece S1 (live action), Loki S2, Jury Duty, Bodies.

Favorite Podcasts: I mostly listened to audiobooks or one-off episodes this year. The few that came up multiple times were Search Engine and Syntax.

Favorite Books: Fourth Wing, Data Sketches, The Will of the Many, Court of Thornes and Roses, The Time Travelers Wife, Tomorrow and Tomorrow and Tomorrow, Paper Girls. (see all of them here)

Favorite new programming discovery: React server components, Next.js App Directory and react-instantsearch are all up there. I’m very excited about Svelte and a project to use it on next year. Setup a WordPress site using Advanced Custom Fields, which basically turns it into a CMS with whatever data you want to store in there.

Favorite Project: Hardcover! It feels like this year the quality of the code switched from “just-alright” to “this is actually good”. Combined with interface updates, an iOS and Android app and improved SEO it’s been making great progress.

Favorite Course or Education Experience: Better Data Visualizations with Svelte! After banging my head against a wall trying to use D3.js with React.js, I made the switch to Svelte. I’ve only created one thing with it (The Social Histomap), but it was a fun experience.

Noteworthy Changes this Year

I’ve started to realize how much a little bit of ceremony can help me focus on a task. Sitting down to work on a project, even one I usually enjoy, can sometimes be tough to get started on. Having a teapot with a tea light right there on my desk to refill for a few hours has helped me concentrate. Thats now become part of my routine, and something I look forward to when I switch to focused work.

In October I tried an experiment where I stayed off social media, didn’t drink any alcohol and didn’t consume any THC. With the abundance of free time I exercised a bunch – often a 45 minute walk + a high-intensity workout. I had some of the best sleep I’ve ever had this month and lost 8 pounds in 6 weeks. Sadly I didn’t end up feeling much happier overall. Easing back into some of those habits since has allowed me to enjoy them more in moderation. I’ve since been experimenting with weekends being less strict but trying to focus on keeping weekdays productive. I don’t know how long that’ll stick, but we’ll see.

When it comes to creating an exercise routine I’ve tried a lot of scheduled. Alternating days on/off, 2x a day, MTRF, 2 on/1 off – just to name a few. I’d love to say I’ve solved this and found what works, but I’m not there yet. I’ve realized how much little decisions impact others. If I stay on my phone after 11pm, I’m less likely to go the gym. I’m more likely to stay on my phone late if I had some THC that evening. I’m still trying to identify those cause and effect triggers and learn from them.

I’ve started reading more books in bed in the morning rather than browsing social media. It’s a lot easier to switch from reading to working than from social media to work. The less I can look at phone in the morning or late at night the better.

Having repeating events with friends is a great way to stay in contact. This could be having a scheduled game night, a repeating video call or an drinks out at night.

I felt organized for a lot of this year. This spans so many aspects of my life and positively influenced all of them. This includes having an organized apartment, a clean desk, optimized kitchen, and even an organized computer. The only thing not organized is my finances. 💸

How’d I Do On My 2023 Resolutions?

For my 40th birthday I set out a goal for the next decade of my life:

I want to make my 40s the best decade of my life (so far).

Personal Goal

This is the one theme I remember most. It’s been a guiding thought that influences everything else.

While I don’t always live up to this, I think it’s helped me grow in a few ways I wasn’t expecting. I do worry that by not defining “best”, I can scapegoat whatever I want into it. “Sure, I’ll sleep in and skip the gym – I’m living my best life!” 😅 I believe I’m honest with myself about this for the most part.

During my weekly planning sessions, I’ve picked out a few other themes I’m working on. Some of these I swap in and out. I’ve been focusing on these since I choose Routine as a monthly theme in March.

2023 Themes

  • Routines I Want to Start
    • Understand expenses – D – Start a routine of categorizing and understanding expenses each month on the 5th of each month (or first weekday thereafter).
    • Evening routine – C – Start a new evening routine. Right now from when I get back from my evening walk until I go to bed, there’s nothing that I tend to do each night.
    • Creative routine – C – Start a routine that inspires me to create more. I used to write and program for one hour five days a week. It was kind of crazy. I want to figure out some way to write more than I do now. This could be on Hardcover or here.
  • Routines I Want to Continue
    • Morning Routine – B – Continue working out 5x a week and reading in the morning.
    • Evening Walks – C+ – Continue going on 45-minute evening walks every weekday.
    • Tracking Calories – A- – Continue using LoseIt to track what I eat. It’s worked great so far, and I’ve gotten used to it.
  • Routines I Want to Stop
    • Decluttered Spaces – A – Stop jamming more things into cluttered spaces in my life (our apartment’s storage unit, closet, clutter drawer).
    • Social Media Mornings – A – Stop opening social media in the morning for any reason.
    • Working on Weekends – A – Stop working on Hardcover at all on the weekends. It’s easy to stop working on projects, but it’s more difficult to not want to chime in when people have issues or there are conversations on social media.

Some of these I’ve done a better job of than others. In December I’ve allowed myself to mostly take a break with the idea that I’ll regroup in January.

What’s Next for 2024?

I have a feeling this next year is going to be an exciting one. There are already three big things I’m planning for:

Getting a dog! We’ve been talking about getting a dog a lot this year and we plan to add a new family member soon. I’m going to start taking allergy shots as well.

Traveling to South Korea! I’m very excited about this trip. As we’ve traveled more we’ve gotten better at not being as stressed out or over-planning. I think we’re reaching that sweet spot and can’t wait for this trip.

Hardcover is growing! I can’t guess when we’ll hit a turning point in growth, but I theorize that we’re going to reach profitability in 2024. Perhaps we might even make enough to start taking a salary! We’ll see.

I love to set goals for myself. This year I’ve mostly focused on routines, mindsets and structures for productivity – rather than specific goals. Things like “lose 10 lbs” don’t motivate me anywhere near as much as “be able to run a 10k in under an hour”.

I plan to continue on with my high level goal (“I want to make my 40s the best decade of my life (so far)“). Beyond that there are three areas of my life I’d like to improve on. How I do it is up to 2024 to figure out.

Make fitness fun – There have been times when I’ve looked forward to exercise. Those are the times when I make some of the best improvements to my health. I want to continue experimenting with different things with a goal of keeping this making this fun.

First goal: “be able to run a 10k in under an hour” 😂 I used to be able to before my ACL injury, and I’d like to get to that point again.

Balance consumption, creation and movement – Everything I’ve ever read about productivity mentions how you need downtime. Rather than trying to minimize it, I want to enjoy it! When I take a break after a productive day I feel amazing. When I spent an entire day reading Reddit without so much as a walk outside I don’t.

First goal: Don’t check social media before noon or after 11pm M-R, read a book/comic or watch a course in the morning, do something that’s fun after 5pm (if it’s productive, that’s a bonus – not a requirement).

Plan for fun – Sometime in 2023 between planning game nights, planning dates with my wife and even planning times to play games I realized that if I don’t plan for fun I’ll often just spend time on social media or something else mindless. Planning has helped me set aside time for one purpose – having fun.

First goal: Continue having weekly date days on Thursday and monthly game nights with friends. Add one more reoccurring get together with friends in January.

There will be more goals, themes, routines and topics – I have no doubt. These are the ones that are at the top of my mind right now.

That’s where I’ll leave it for now. I’m looking forward to seeing what 2024 brings!