- Notes on Solopreneurship Engineering
- Posts
- Issue #42: A whole week of coding 🔥
Issue #42: A whole week of coding 🔥
So many things in the hoven for HeyEcho, I'm excited on how easy will be to plan and generate blog posts!
I dedicated the whole week to improving HeyEcho.
I know, I know, what you’re thinking.
“But what about distribution? What about customer acquisition?“ 🤦
A few weeks ago I shared how I use HeyEcho myself and how painful it still feels. How can I sell something that feels painful to me when I use it? I basically redefined the MLP (Minimum Lovable Product) version.
Table of Contents
A fun purely technical change
Since I started my solopreneur journey, I’ve relied on Render. It is super easy to set up, it has “deploy on merge”, and has a very straightforward in-house IAC. However, when it comes to infrastructure, I’m a bit of a control freak. 😅
I always want/need to understand what’s going on and why. I know, it has a cost. But if you have a decent knowledge and experience of cloud environments and system architecture I think it is worth it. It’s also something that I personally enjoy dealing with. 😄
Starting this week HeyEcho now runs on Kubernetes on DigitalOcean! 🎉
I have previous experience with Terraform, which I didn’t love, so this time, I decided to try Pulumi, which has been very fun to use. I’m not going to explain in depth the pros and cons of the two, but as a personal preference, given that Pulumi is about writing a Python program (it also supports JS and Go), it feels more friendly compared to Terraform’s HCL. You can also rely on old but gold programming concepts like reusability, abstractions, etc.
As an example, I defined a microservice class for each part of HeyEcho, the website, the web app, and the API and each class has its own DNS configuration, Deployment, Service, Secrets, etc.
I also love this Pulumi graph visualization.

Pulumi graph visualization of the infra resources of HeyEcho
Again, it’s not the best thing to do from a business growth perspective. Let’s say that I took a break by working on this. 😅
However, I feel more free and in control now! 😌
Relying on k8s also allowed me to ship a feature, more on this later, really fast by relying on k8s Jobs.
Despite Render being a great product, I also faced a few things that I didn’t like:
when a service is deployed it can take A LOT of time before it gets attached to the load balancer, and you can confirm it from the deployment logs. Sometimes it even times out and you need to retrigger it. They perform a port scanning to understand where your service is listening, and they have specific documentation on how to indicate the listening port to avoid this, but tbh it never worked for me. 😅 With k8s it’s way easier and I can also properly set up the startup probe and everything is ready to fly! 😎
DB migrations: maybe it’s a skill issue, but on Render, I’ve also never been able to set up to run a command before starting the application. So every time I have a DB migration I need to check the deployment log, wait for it to finish, SSH into the instance, and run the migration script. 😕 With k8s it’s easily doable with init containers! 😎
scaling the number of replicas: on Render to scale the number of replicas you need to pay for the “Profesional” plan. Basically on top of the resources, just to even scale the number of replicas manually to a fixed number you need to pay for 19$/month. Again, super easy to do in k8s. 😎
To be fair the transition was not painless because I didn’t know Pulumi, and I had some issues with DB connections dropping, etc.. But everything works now! 🥳
What’s new in HeyEcho?
Let’s move to the changes from a product perspective! As I mentioned, I’m addressing what makes it painful for me to use HeyEcho.
Async generation
Finally! 🥳

Async generation CTA
Now it’s possible to generate blog posts in the background and the content library will show the status.

Pending blog post
As I anticipated this is the feature that has been very easy to implement thanks to k8s. Initially, I was considering more complex solutions for handling the async jobs like Celery, or Airflow. In the end, I’m just submitting a k8s job using the same Docker image of the API and running a specific script. Easy! 👋 🎤
Blog post excerpt
This is another thing that was taking some back and forth between HeyEcho and ChatGPT when generating blog posts.
Once I have a blog post generated by HeyEcho I’d need an excerpt to use when listing the previews of the blog post. I’m talking about the text that you usually see below the hero image in blog posts listing pages.
Now HeyEcho provides that as well. 🎉

Blog post excerpt
With this change, I also redesigned the blog post library.

Redesigned blog post library
What’s cooking now?
If you remember, the other very painful point I have is thinking and planning the topics to write about.
And that’s what I’m currently working on! And I’m super excited about this! 🤩
I thought a lot about how to implement this. I did some research on how content could be organized, etc. I don’t wanna spoil too much, but there will be a “Content Hub” section that will help not only simply provide topic ideas but will help implement a more structured content marketing strategy by creating hierarchical topic ideas.
Anyway, I started today and I’m confident that in a few days, it will be ready, so you’ll just need to wait for next week's issue.
Conclusion
So many exciting changes! Once the Content Hub is done I’ll be more confident to resume selling and marketing more aggressively. 💪
On top of that, I’ll be able to dogfood more easily!
Reply