Remember this video from the beginning of an Apple keynote ten (omg) years ago? I still like it a lot because of its ambivalence between perfectionism and minimalism. It’s very hard to straddle that line. A thousand nos for every yes: Minimalism. Finding the essence of something: Perfectionism. Getting to a point where you’re able to balance both: Shipping!
I’ve been programming for a bit over a year now and I’m far from giving substantial advice on how to write good code. What I actually do know a bit about is the right mindset for shipping products.
Embrace the truth that wanting to ship something perfect is the same as not shipping anything. You’ll never(!) get to a point where everything is to your absolute liking. It’s impossible. It has nothing to do with how skilled you are either. You can be the very best designer and programmer ever, entropy doesn’t allow perfection. On the contrary: Entropy is perfection. Embrace the fact that “good enough” is a moving goalpost. It means that you don’t have to try to be perfect. How soothing is that!?
You’ll never be as good as you think you should be. I feel like human existence is a binary state. Either you’re overconfident or suffer from imposter syndrome. Both are problematic but the latter is easier to manage, in my opinion. Acknowledge the fact that your being capable of shipping something in theory is good enough to do it in practice. Worst case: Nobody will care about your project. The good news: That’s already what’s happening. There’s no chance anyone will ever truly care about your unreleased project and pre-release hype is not real.
Ideas are cheap. You don’t want to be one of those people that are stuck in “Wouldn’t it be cool if…” land and never get around to actually confronting their ideas with reality. Or reality with their ideas. The common pitfall is to think that you only have to cram enough ideas (read: features) into your product for it to be the very best out there. The opposite is the case: You need to get rid of all the features that don’t reflect the essence of what you’re trying to do. There’s a reason why basically everything ever written by people who ship reiterates this point over and over: it’s true. Confronting your ideas with reality can’t happen fast enough.
The right goals
This might be the most important point: The product isn’t the destination. Shipping is. If you think that your current idea is the be-all and end-all, you’ll most likely make the aforementioned mistakes over and over again. Good ideas, loosely held. Shipping must be the motivation because only shipping creates the positive mental feedback-loop that is required to keep shipping. If you’re somebody who shipped something once, you can do it a second time and the third time is even easier. That’s the process. You build, you ship, you keep building. A project fails? You don’t care because you’re in it for the process of shipping and iterating.
The status quo is the worst case. Ship yourself out of the status quo, everything else will follow automatically.
One of the most wished for features for Henlo is a way to save notes without adding an interaction. The next update will allow for exactly that. Stretch goal: Add a reminder to a note to not forget about that important work meeting they told you about.
Today I’ve been working on an archive feature for Henlo, my little personal CRM app. I noticed in my own use that I’d like to be able to save notes to people I don’t plan on interacting with regularly in the future.
Well, that’s not going to happen for now. I built the whole thing, and it’s impressive if I dare say so myself. It’s far better than Placescore was 10 years ago. It has a working user system, a somewhat complex server component, and it’s fun.
Unfortunately, I can’t come up with a pricing model that makes sense. My best idea was to add ads, but Google somehow doesn’t want me to. I get rejected from AdMob solely based on my personal data. I don’t know why; there doesn’t seem to be a way to find out, so I’m all out of luck on that front.
It is what it is. I’ve archived the project for now and might revisit it in the future, but right now, there are no plans to release it anytime soon. It was a great exercise, though. I learned quite a few substantial things while building this.
I’m nearly ready to invite people to Placescore’s TestFlight. If you want to test and play early, subscribe to the Tiptop Newsletter (no spam, ever) where I’ll drop the TestFlight link (with a limited amount of spots) in the next couple of weeks.
Because everything is cyclical, I’m back at trying to publish cringy content on YouTube again. This time: Short update videos for the apps I’m working on. The first one is not really short but it brings you up to speed with my current project: Placescore.
Long story short: My habit tracker app Peat is out now. You can download it for free. I think it might be the best habit tracking app on the App Store but you’ll be the judge of that seriously biased opinion.
Some people don’t get why building habits is so important for a happy life. Here’s my elevator pitch for why you would want to go through the hassle of sticking to a habit:
It literally changes your identity.
You become a different person. Just by deciding to do something regularly, you’re suddenly a person that works out, that flosses daily, that reads a new book every month. It doesn’t matter who you want to become, the fact is that building a habit stands between you and your future identity.
I love challenging myself like that but the current choice of apps didn’t fit my needs. All of them are needlessly complicated or cramped full of gamification features like streaks. As you know: I hate streaks. They create needless pressure and destroy any form of motivation as soon as they break.
That’s why I build Peat. It’s basically a tally list on steroids. You do what you want to do, you check it off. Every completion gets a green square. Over time you see your progress through the amount of green squares in each month.
You won’t get punished if you miss a day. Who cares! As long as you come back to it and try again, you’re on your way.
Here’s a list of what Peat can do right now
- Reminders: Set a customizable daily reminder for each habit you don’t want to forget about.
- Statistics: Keep an eye on overall trends or dive deep into specific habits.
- iCloud Sync: No matter if you’re on your iPhone or iPad, you can check on your progress and mark new completions.
- Widgets: Slap your habits right where you can keep them in mind. See your progress right on your home screen.
- Currently available in English and German
Peat is free to download and use. Some features require a subscription though. I’m trying to become an indie dev here, so please bear with me.
It happened. The switch flipped and I‘m now one of those people who believe that it‘s far more productive to design in code than to move boxes and text in some design software.
I spent the last decade not wanting to believe the people who praised designers who code, but I‘m convinced now.
It‘s been about a year since I worked through 100 Days of SwiftUI. I built four iOS apps and about 4-5 web projects using React since then. I‘m obviously still a coding-baby but it‘s already very clear to me that being able to code made me a better designer.
AR interfaces are going to take this up a notch.
Three years ago, when I had an epiphany and realized that AR/VR interfaces are going to be the future of computing, I wondered how current design software would ever be able to allow me to do a good job designing AR interfaces.
I came to the conclusion that it wouldn‘t. It couldn’t.Continue reading “Being a designer who doesn‘t code might make you a bad designer in 2024 and forward”
There’s this concept of self-efficacy in psychology that really resonates with me. I see a lot of life through this lens. Here’s Wikipedia’s definition:
In psychology, self-efficacy is an individual’s belief in their capacity to act in the ways necessary to reach specific goals. […] A strong sense of self-efficacy promotes human accomplishment and personal well-being. A person with high self-efficacy views challenges as things that are supposed to be mastered rather than threats to avoid.
I believe that you can choose to be self-efficacious and things you do can make you feel self-efficacious. Most people fail to recognize when these moments occur, and even fewer make a conscious effort to intentionally create such moments for themselves.
Changing the physical world does this to humans. That’s one of the reasons so many people daydream about gardening and why pottery feels a bit like therapy. You create something that wasn’t there before. You moved something and it stayed in place. You’ve literally made a teeny-tiny dent in the universe.
You won’t be able to describe to a person who never experienced anything like it, how gardening makes you feel. Starting with nothing, spending hours of work, accepting failures and imperfections to then see a result of something you made, tickles the core of what we are. Sure, you can explain all the steps of the process and tell them you felt “good” doing so but there’s no way to describe the intensity of that feeling.
Turning a rotary dial to call someone, pressing buttons to control a SNES video game character and swiping and tapping on glass to send an email did this to us with ever increasing amounts of directness. Every evolution of digital technology helped us feel more self-efficacy.
For better or worse.
I think AR interfaces are the inevitable next step in computing because they make us feel more self-efficacious. You won’t be able to properly describe how moving digital windows in the physical space of real life made you feel. It’s counter-intuitive to even think that the way you interact with the window your bursting inbox makes a difference, yet it does.
Spatial computing can’t be described. It must be felt to be understood.
I can’t get over the fact that Apple introduced an AR headset yesterday. Everybody, including myself, expected a VR headset with AR features. However, Vision Pro is clearly AR first with VR as an optional mode you deliberately have to activate if you feel the need for it.
It even seems like they nailed the interaction paradigm. Based on my experience with current VR (lame) headsets I wasn’t very happy with how hand tracking worked. You have to hold your hands in front of you for the sensors to see them properly. Apple knowingly showed people in several situations lounging on their couches with their hands by their sides, only making tiny gestures to interact with what’s being looked at.
If it were possible, I would order a Vision Pro right now.
I expected to be disappointed by The Legend of Zelda: Tears of the Kingdom. Its predecessor was my favorite game of all time, so how could it even come close? Well… it did. TotK is at least as good as Breath of the Wild, maybe even better. The sheer breadth of what’s possible and the number of interesting characters you get to meet are even larger than in BotW. It’s incredible.
I wonder why we don’t paint more things in pastel shades, given that it’s generally agreed upon that the world looks nicer in pastel.
A lot has happened in the last couple of weeks. I think I’m now a permanent member of the “web development is fun” club. It’s like a slightly more frustrating LEGO with an endless amount of ever changing parts. What’s not to love? That being said, here’s what I’ve been working on in the last couple of weeks.
My new portfolio: marcel.fyi
This one took me a while but I’m very happy with the result. It was harder than my other projects because “Ah fuck it, I’ll just leave it like that” is easier to achieve when it’s not about presenting you and your work but only about learning something new. I powered through and I’m quite happy with the result.
(I don’t understand why the domain was still available. Sorry other Marcels, it’s mine now.)
Next.js and React are still something I’m actively trying to wrap my head around but since it’s a known problem and I need ever changing challenges to keep me motivated, I wanted to spice it up a little.
Spline is a fantastic tool to add 3D elements to websites. I’m cheap, though, and paying $7/month seems crazy to me just to add a silly 3D avatar to the upper left corner of some random website. A couple of years ago, in one of my previous “let’s learn programming” bursts, I bought Three.js Journey, a fantastic course that I just wasn’t equipped to understand yet. Fast forward a couple of months of intense learning of basic programming skills later: No problem. I fired up Blender, built a 3D character of myself, found out how to hook everything up to Three.js and React Three Fiber and voilà. Not only am I saving $7 a month, I also learned valuable skills in the process.
Drawmatic is a little app that gives you a new drawing prompt each day. The rudimentary drawing tools and time limit are there to give you a little kick of non-perfectionistic creativity to start your day. Your allotted drawing time is only counted when you’re actually making lines.
Finished drawings are being saved to local storage. I even added a “Create an image from this HTML element and copy it to your clipboard or save it to your computer” feature! All of this is unfortunately slightly broken on mobile but what can you do.
I needed something to teach myself user auth and databases so I grabbed myself a copy of Supabase and build a… I guess… game…? There’s no gameplay loop and it doesn’t make sense and isn’t fun but it works. A user can sign up via magic link. When they come back to the site and haven’t added a username yet there’s a prompt for that and after that they can… fish. For those three items that I was willing to add to the database.
I implemented a working rarity system. A way to sell items. A lot of unnecessary Framer Motion fine tuning for the bucket button and, here’s the kicker: I won’t release it to the public because it’s obviously a piece of shit that has no right to exist except as a playground for me.
That’s it for now. Thanks for reading.
It took me something like eight hours to understand how to bring Next.js 13 Beta to let a user put text into an input field and use that text in a function. Here’s why:
- The component has to be client-side for a state driven input field to work.
- The function had to be invoked server-side because it uses an (OpenAI) API key that would have otherwise been exposed.
I tried for hours to somehow manage to take the string from the input field and throw it into the server rendered component. That doesn’t even make any sense and was always going to fail. It would be a paradox.
It took me only a couple of hours to come to that conclusion. That’s when I figured that Route Handlers, formerly known as API Routes might be the solution. There was only one problem: I didn’t really understand what they are, what they’re doing and what exactly they’re meant to be used for. After playing around with them for a while, I somehow lost my mind and went back to my initial approach: Trying to convince a server side component to dynamically render something based on data from a client side component.Continue reading “Adventures with Route Handlers & request methods”
You might remember my ramblings about how I’m starting to get the hang of web development and actually having fun with it, right?
Well, what can I say. I did what I set out to do when I cancelled my Webflow powered book blog because of their insane pricing: I learned how to program and built my own. It’s a lot faster, has more features and doesn’t cost me anything.
You can play around with it here: buch.fyi
I haven’t written any opinions for books read in 2022/23 but everything else should be there.
- After talking to friends about how I don’t understand how a React application can securely use API keys and secret data like that, they pointed me in the general direction of Next.js and explained server side rendering to me. I worked through the documentation and built buch.fyi on top of it. Since I love life on the cutting edge, I’m using Next.js 13 with the new /app folder structure.
- While doing so I discovered that I don’t need any API keys or databases at all. It’s all markdown files, baby!
- It’s all TypeScript! Look at me, writing typed code. All type saved up in here.
- I’m still using TailwindCSS for everything CSS related. It’s just fun to use, I’ll refresh my classic CSS knowledge when the time comes.
- Some transitions are using Framer Motion, which is as complex as it’s amazing.
- The book covers show up thanks to Open Library’s Covers API. That’s me, casually using an API to mix and match data!
- It’s all hosted on Vercel. I don’t understand why it’s free and how they manage to make everything as sleek as it is but I’m a fan. It’s incredible.
- I even learned how to create a RSS feed! Look at https://buch.fyi/feed and tell me this isn’t the best feed you’ve ever seen me create.
This may sound weird but I can’t wait to see what I’m doing next. So many possibilities! So much stuff to play around with!
Okay, hear me out. Web development is actually kind of fun. I mentioned that I worked through The Joy of React recently and while the course managed to transfer a lot of valuable knowledge, it didn’t do a great job at keeping me motivated.
I’m not one of those people waiting for motivation to magically hit me. I know that it’s something you create by actually sitting down and doing the work. Nevertheless, something about the course constantly trying to trick me into working on something it hasn’t taught me before, made me just watch the solution videos before actually trying to solve the problems. I knew that I could not possibly know the “right” solution, so I stopped trying. That resulted in me finishing the course without applying most of the things it covered.
100 Days of SwiftUI‘s approach worked far better for me. It covered a couple of concepts, then gave me a challenge and told me that I already know everything needed to solve it properly. I knew that it’s completely my fault if I don’t manage to come up with a solution and I also knew that I only had to re-watch the previous lessons to stumble upon the answer at some point. That’s motivating! Telling me that I’m theoretically able to solve the challenges gave me enough confidence to sit down and try until something worked.
So here’s how I got over my disgruntled and unmotivated “Web dev sucks” state:
I forced myself to build something.Continue reading “Maybe web development is kind of fun”
I bought the limited early access to The Joy of React the other day and worked through the whole course since then. Switching to web development while still being at the very beginning of my journey of becoming a Swift developer might not be the smartest choice but I never claimed to follow a thought-through master plan in regards to my learning, so whatever.
Before we get started: These are my current thoughts on getting into web development as somebody who has only a basic understanding of HTML and CSS. These thoughts will be different in a year from now. Cool your jets and consider this as something like a user test for the question of “How accessible is becoming a web developer?”.
Web development is a pain in the ass. You need to understand what a terminal is, what it’s used for and how to use it to even get to the point of asking yourself “What the fuck is NPM?”. Then NPM needs to be installed which feels like hacking the Matrix, since it does something somewhere but you won’t see anything but lines of text in your little terminal window into the soul of your computer that you’re afraid to touch because what if you sudo your SSD or something.Continue reading “Web development is a pain in the ass”
The other day I stood in a meadow, waiting for a puppy to poop when I somehow got involved in a conversation with an 83-year-old woman. It started by me asking her if it’s okay if we come closer so the still not pooping puppy can say hi and learn that there’s no need to bark at people.
She answered: “Sure, but I won’t pet him!”.
We chatted for something like 30 minutes and I found out that she not only doesn’t want to pet this specific dog but dogs in general. She even enjoys looking after her daughter’s dog sometimes (who likes to sleep at the end of her bed when he’s visiting) and still won’t pet him.
I didn’t ask why. It didn’t really matter. She told me her rule and I understood that this is one of the foundational truths of her life. She doesn’t pet dogs.
There’s something intriguing about people who set boundaries that you can’t understand, but you can respect.
In the end, there was no poo. We found an interesting stick that had to be gnawed on for a long time, though.
Unfortunately, things are made by people. People have the tendency to live for quite some time and go through several iterations of being while existing. This, combined with the fact that nearly all 8 billion of us are now permanently connected through a series of tubes, results in everything having the potential of being tainted forever.
Everything requires a disclaimer now.
So, you enjoyed watching Seinfeld? Did you know that one of the actors had a weird racist breakdown live on stage? Oh, you’re looking forward to what seems to be the best Harry Potter game ever? Please keep in mind that the original author of the books is transphobic! You’re enjoying the wrong thing! Please be entertained by products made by, with and based on less flawed people!
These things are wrong and absolutely worth criticising. No doubt.
However, I wonder if the dynamic of always watching out for the next bad thing, being on edge because everything has the possibility of being tainted, never being able to enjoy something for what it is, because it has to be dissected on a socioecological level, does something to us.
There must be a cost to always having to watch your back in case you’re enjoying something a little too much that others feel should not be enjoyed anymore. I don’t think that’s helpful for anyones mental health.
Not criticising wrong behaviour is obviously not the solution. Attacking ourselves and everyone else all the time, because things are made by people and people are inherently flawed, doesn’t seem like the way to a content life either.
I don’t know.