How (and Why) I Built my Website

One of the most common questions I get is how I built my website. I haven't written about it until now, because frankly it's a little embarassing. However, you asked, so I will answer how, and why I built my website, and why you may, or may not also want to build your own website.

Why I built this website

The primary goal of this website is to serve as a public place where I can share writing, ideas, and projects I have worked on - especially after I deleted all my social media accounts making this the only way I can share things with the public in an informal way. This along with serving as an online resume appear to be common reasons for making a personal website. If you have other reasons, please let me know.

A good alternative would be to use one of the many writing platforms such as Medium, Dev, or Hashnode. All of these platforms offer a great user experience, and way better discovery experience. Before, creating a custom website it's worth exploring other options to see if they meet your requirements better.

I wanted full control over the presentation, so using a publishing platform was out of the question, and I was willing to give up the discoverability. However, there might be a way you can get both. Many publishing platforms allow for cross-posting content from your own website, and even allow you to set a canonical link referencing your website. I also wanted the ability to create special one-off pages with custom interactive content using arbitrary HTML and Javascript making relying solely on publishing platforms impossible.

Perhaps the most important reason I choose to build a custom website instead of using the many alternatives is to learn how to build a website. I think this is the point I succeeded the most on. Although, I made a lot of mistakes, and the codebase is a mess, I became a lot more comfortable using the languages and frameworks. And importantly I learned a lot about what not to do when building a website, so if I had to do it again, I can avoid making those same mistakes. If you're interested in learning web development, I think this reason alone is enough to justify creating a custom website.

One unexpected, but positive, side-effect of having a personal website is having received many emails from people who have found the website and taken an interest. Moreover, employers have commented positively on the website having a positive impression of me before we even met however unfair that is, and how much I may dislike it, it seems that it can be a professional advantage as well. At least when you don't have a lot of professional experience.

How I built it

The backend is written in Python using the Django web framework. I write the articles as Markdown in Visual Studio Code, but export it to and store it as HTML (I know, I know. This is a bad practice), however, this lets me embed interactive custom components. I admire what Josh Comeau has been able to do with MDX, but until I have the time to significantly rework the site, this method works well enough.

I chose Django because I already had some familiarity with Python, and wanted to use a framework that was mainstream and robust. Django is both and more. It is very feature-rich and supports many common features out of the box. It also has a very thorough documentation making it relatively easy to learn. Initially, I did however find it to be quite opinionated and had a bit more "magic" going on than I was comfortable with at the time even though they explicitly try to minimize the amount of magic. However, as I have grown more comfortable with both Python and Django, I have come to appreciate the shortcuts it provides.

The front-end is written using vanilla Javascript and CSS without any supporting frameworks. The website is mostly static, so there is not a lot of Javascript, and if I was to include any library the overhead of the library would almost certainly not be worth the added functionality. Some interactive pieces uses small helper libraries for example for making graphs. The initial version was built in 2016-2017, but has undergone several iterations as the requirements have changed and my skills have improved.

I'm not a particularly competent designer, so what might pass as design has come from fumbling around until I found something that didn't look completely terrible. For the little design direction I could muster, I aimed for a minimalistic timeless design. To some extend I think I have succeeded, but I think some components such as the cards are very trendy which I dislike.

If you want a shortcut, you can consider using Wordpress or Ghost which are both great blogging platforms with very easy setup. They're different from other platforms in the way that they are completely customizable, and you're still completely in control. They act more as a shortcut to set up your backend and frontend to be ready for a blogging-like website. Moreover, particularly Wordpress is very popular with some estimates of 30% of all websites running Wordpress, it has a very rich plugin ecosystem, so you can get a lot of functionalities without even having to write code. If you are a bad designer like me, but still want a beautiful website, so want a shortcut for your frontend only you can use the Distill Template which is very powerful yet beautiful and is what is powering the now on hiatus distill.pub. There are also many powerful static site generators such as Gatsby which is kind of like a shortcut for your backend which lets you focus on the frontend. However, they do limit your database model, and are typically not a great fit for websites that consume a lot of dynamic data.

Conclusion

Having a personal website can be a great professional asset especially for people entering the job market without a lot of relevant professional experience. It can give you an independent platform to share your thoughts and ideas without having to give in to the addictive anti-patterns of social media. And it can be a great opportunity to learn a new skill. But before jumping into building a custom website from scratch, it may be worth it to explore other options to see if they fit your requirements better.

Addendum

One problem that I have run into is that some people (maybe you?) might want to read more essays; maybe even essays I write in the future. However, currently, there is no good way of knowing when I write something new short of checking in on the page to see if something is changed - which there usually isn't. I used to have an email-based newsletter where I would send out an email whenever I wrote something new.

However, it made me feel pressured to write things regularly lest you forget about me, so eventually removed it which gave a sense of relief. I wanted to replace it with something else less formal, and less intrusive, but couldn't come up with a good solution.

Push notifications felt like too much and are too difficult to manage - the last thing I want is to disturb someone's important meeting or sleep, and I don't really know other ways.

If you know of a good solution, or have any ideas, feel free to let me know.