Today is a big day for us. Finally we break $500 milestone. We have been trying really hard with customer supports. Email forwarding space is really competitive with many services offer free tier where we focus on paid subscription.
We have been tailor to give best experience and onboard customers, instead of winning the mass, we try to win over customers with high demand and have real business that demand important of email delivery.
We talk with customers, listen to what they want and eventually improve our maillog and webhook.
Until next time for $1000 milestone.
At Hanami, we move fast and focus more on the email forwarding side to make our core feature which is email forwarding super fast and amazing.
Due to the size of our team, we didn't have time to focus on the accounting aspect of the site.
For awhile, we did not have the ability to view invoices directly in the dashboard. We usually email the receipt to our user but they cannot view it in dashboard. We now support exactly that so our customers can view/download/print their invoices .
Head over to hanami dashboard to check your invoices and let us know how you think.
Happy email forwarding. Don't forgot to give hanami.run a try
We're already support bulk import for users with a lot domains to import domains into our system. But once the domains are expired and our users no longer wish to hold the domains, they have to delete it one by one or use our API to batch delete domain
We hear and feel the pain, so this week we rolled out a feature to allow simply entering a list of domains to be deleted. Once domain per line. A single click and there we go, all unused/expired domains are removed :-).
If you have domains laying around, hook them into hanami to start forward email :-).
Today I checked our metric and we reach more than 7M emails. I'm thankful for users who trusted us with their email to let hanami handle their email forwarding.
7M is a milestone to say that we have the ability to scale this system even further to serve our user. We still have a lot to do but the foundation block is there.
7M is just a number at the end of day. But it reminds me that our users really put this system into good use.
Looking forward to 10M emails.
This is story of how a simple oneline hack bring 100-1000x performance from user perspective.
When an user add a domain into our system, we immediately perform a DNS query for MX records to see if they point their DNS to mx1.hanami.run and mx2.hanami.run. Besides that we have a job that run every 2 minutes to find domains that is missing DNS and check again.
We were at a point where Cloudflare rate limit it due to our heavy usage - for every incoming connection we check the reverse dns and a bunch of DNS query for spam filtering -, so we bump that to 5 mins to make it do less work.
That's the first issue with thing become slower. But within 5mins window, it should auto refresh. Many users has MX records TTL set to 5mins anyway, so it isn't that bad.
Then a few user told us it take forever for the DNS to refresh, and they have to refresh themselves. We have a button say 'Recheck DNS" .
We chime in and indeed, it's was very slow.
Our code is very simple
Domain.find_each do |domain| update_dns domain unless domain.dns_ready? rescue StandardError => e Bugsnag.notify e end
This essentially iterate the domains in batch, in asc order, and attempt dns. the issue is right there. "in asc" order. We have so many domains now, and apparently a lot of them was missing DNS (a lot of users own many domains) so the system were checking the oldest one first.
Our online fix is
Domain.find_each(order: :desc) do |domain| update_dns domain unless domain.dns_ready? rescue StandardError => e Bugsnag.notify e end
So that it check the newst one first and it works suprisingly well.
The lesson to me is that, though we didn't improve anything in general, we did make user the impression that the system is faster. As a solo-founder, I think this is a great hack so I can focus on other component of system.
Until next time we will write about how we make this really faster, for real.
If you need email forwarding, give us a try at https://hanami.run
At haanmi.run we used Golang as our back-end language. Today we our logging to this library https://github.com/rs/zerolog
It supports JSON so we don't have to use regex to parse log and can dump JSON directly to ElasticSearch to query log.
It also support sublogger so you can inherit a certain trais without repeatedly log them.
We include "request_id" which is a UUID in all of our log to help us trace requests end to end and detect problem easiser.
Highly recommend any founders who use Golang to use that library for logging.
We recently have a few users come from our competitors. I don't know how they find us because we didn't have good SEO yet and instead focus on reddit/hacker/twitter/cloudflare answering support to attract traffic.
One of cool thing about email forwarding is that I can look at history of MX records to know what they used before. If it's empty or domain is new, it means they never used anyone.
Today is an awesome day because out of no where a few new users from my competitors join https://hanami.run :-)
"It looks like you focus on the right thing" One of my users told me that.
Hanami is commited to build the best email forwarding service with open api. Hit me up if you need help setup and want to give us a try
When I started hanami.run I don't know if anyone will use it. I think it'll just be a simple product. it's just "email forwarding" at the end of date. then I'll be done with it.
How wrong I was. The app evolve, I started to see thing I didn't see before. We shipped many useful features that I myself wished for.
Today I made a commit and realize I have reached 1,111 commits on out Git repository.
Still a journey ahead but pretty impressive at least to myself.
Keep pushing everyone.
If you want to start a SaaS and don't know how email me [email protected]
We have a custom mail server which sit on top of Postfix. The spam scanner is done in Postfix, at that time we lost a certain information such as incoming IP that rspamd see is our IP address. We also signed the email b y the time it reached postfix.
We eventually integrate with rspamd using its HTTP Protocol at higher layer so we can tell rspamd the incoming IP address and the raw email. BY doing that, rspamd can work more effectively and by the time email reached Postfix, the email is legitimate to send out and Postfix only need to send email out.
We finally released Two Factor Authentications that are compatible with any OTP app such as Google authenticator, Authy to add one more protection layer to your account.
Head to Profile > Security > Enabled MFA to activate this features.
This is a feature that has been asked a lot and we're excited to finally release it today.
Every time I'm working on a new product, the first thing is buy a domain. The second thing is email. I don't want a full bloated email product like gsuite/zoho. All I need is to receive email send to my own domain.