Repos / hi.imnhan.com / eb73ff6802
commit eb73ff68025967a90a130723dcee302e3ee5f611
Author: nhanb <nhan@nerdyweekly.com>
Date:   Thu Jul 25 22:27:37 2019 +0700

    moved to new domain and some housecleaning
    
    Using pyenv-virtualenv + poetry now.

diff --git a/Makefile b/Makefile
index 6e96153..f55c243 100644
--- a/Makefile
+++ b/Makefile
@@ -105,6 +105,6 @@ cf_upload: publish
 
 github: publish
 	ghp-import $(OUTPUTDIR)
-	git push git@github.com:nhanb/nhanb.github.io.git gh-pages:master -f
+	git push origin gh-pages:gh-pages -f
 
 .PHONY: html help clean regenerate serve devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github
diff --git a/README.md b/README.md
index e8b5e91..5248403 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,29 @@
 # My blog
 
-This is the source code for http://www.nerdyweekly.com using
+This is the source code for https://hi.imnhan.com using
 [Pelican](http://github.com/getpelican/pelican)
 
 # Dev environment
 
-This repo targets Pelican 3.7 on python3. Initial setup on Ubuntu with virtualenvwrapper looks
-something like this:
+This repo targets Pelican 3.7 on python3. Initial setup on Arch Linux with
+`pyenv-virtualenv` and `poetry` looks something like this:
 
-```bash
-mkvirtualenv -p `which python3` pelican
-pip install --upgrade pip
-pip install -r requirements.txt
+```sh
+pyenv install 3.7.4
+pyenv virtualenv 3.7.4 imnhan.com
+pyenv activate imnhan.com
+poetry install
 ```
 
 Then use:
 
 - `make devserver` / `make stopserver` for local dev at port 8000
-- `make github` to publish to www.nerdyweekly.com
+- `make github` to publish to hi.imnhan.com
 
 Alternatively, if you find the `make dev/stopserver` workflow clumsy, manually run `pelican -r` and
 simple python http server to keep everything in the foreground:
 
-```bash
+```sh
 pelican -r content  # in 1 terminal
 cd output && python3 -m http.server 8000  # in another terminal
 ```
@@ -35,7 +36,7 @@ # License
 ```
 The MIT License (MIT)
 
-Copyright (c) 2013-2015 Bui Thanh Nhan
+Copyright (c) 2013-2019 Bui Thanh Nhan
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/content/extra/CNAME b/content/extra/CNAME
index e3bde0e..0b261f1 100644
--- a/content/extra/CNAME
+++ b/content/extra/CNAME
@@ -1 +1 @@
-www.nerdyweekly.com
+hi.imnhan.com
diff --git a/content/extra/README.markdown b/content/extra/README.markdown
deleted file mode 100644
index 4e719ff..0000000
--- a/content/extra/README.markdown
+++ /dev/null
@@ -1,3 +0,0 @@
-# Static content for blog.nerdyweekly.com
-
-This repo contains generated HTML only. For markdown sources visit https://github.com/nhanb/blog
diff --git a/content/pages/about.md b/content/pages/about.md
index ab3ec84..d3388a4 100644
--- a/content/pages/about.md
+++ b/content/pages/about.md
@@ -13,7 +13,7 @@ ## About me
 
 ## About this blog
 
-My mind is a sad mess that cannot hold much important/interesting information after a couple of
+My mind is a sad mess that cannot hold much information after a couple of
 months or so. This blog is where I write down interesting things I discover. On occasional bad days
 I might throw all my ramblings here too, but hopefully those will be rare.
 
@@ -24,22 +24,9 @@ ## About this blog
 I always appreciate feedback and further discussion on my posts, so feel free to point out if you
 think I said something stupid. :)
 
-### What's with the domain name?
-
-I watched [Triumph of the Nerds][8] at a very impressionable age and _thought_ the word was cool.
-Now... you know what they say about unfortunate v1 naming decisions--they stick.
-
-## Want to hire me?
-
-I try to keep [my résumé][4] as concise and up-to-date (and pretty) as possible, but if you're into
-full-blown CVs, [here it is][6].
-
 
 [1]: http://getpelican.com
 [2]: https://github.com/nhanb/motherfucking-pelican-theme
-[3]: https://github.com/nhanb/blog
-[4]: http://resume.nerdyweekly.com
+[3]: https://github.com/nhanb/imnhan.com
 [5]: http://www.stepmania.com/
-[6]: http://nerdyweekly.com/cv
 [7]: http://www.sirlin.net/ptw
-[8]: https://en.wikipedia.org/wiki/Triumph_of_the_Nerds
diff --git a/motherfucking-pelican-theme b/motherfucking-pelican-theme
index 9e27407..77b73ea 160000
--- a/motherfucking-pelican-theme
+++ b/motherfucking-pelican-theme
@@ -1 +1 @@
-Subproject commit 9e274072dd32f6aef3f908f8076945360f87bb96
+Subproject commit 77b73ea810f2f8a1a82830096b0d0a1810e5f464
diff --git a/pelicanconf.py b/pelicanconf.py
index 317704c..a83093e 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -1,17 +1,15 @@
 #!/usr/bin/env python
-# -*- coding: utf-8 -*- #
-from __future__ import unicode_literals
 
-AUTHOR = u'Bùi Thành Nhân'
-SITENAME = u'Nerdy Weekly'
-SITESUBTITLE = u'Musings on the joy of computing... or lack thereof'
-SITEURL = ''
+AUTHOR = "Bùi Thành Nhân"
+SITENAME = "Hi, I'm Nhân"
+SITESUBTITLE = "and this is my humble corner on the interwebs."
+SITEURL = ""
 
-THEME = u'./motherfucking-pelican-theme'
+THEME = "./motherfucking-pelican-theme"
 
-TIMEZONE = 'Asia/Ho_Chi_Minh'
+TIMEZONE = "Asia/Ho_Chi_Minh"
 
-DEFAULT_LANG = u'en'
+DEFAULT_LANG = "en"
 TYPOGRIFY = True
 
 # Feed generation is usually not desired when developing
@@ -19,67 +17,63 @@
 CATEGORY_FEED_ATOM = None
 TRANSLATION_FEED_ATOM = None
 
-STATIC_PATHS = ['images', 'extra']
+STATIC_PATHS = ["images", "extra"]
 
 EXTRA_PATH_METADATA = {
-    'extra/CNAME': {'path': 'CNAME'},
-    'extra/README.markdown': {'path': 'README.markdown'},
-    'extra/favicon.ico': {'path': 'favicon.ico'},
-    'extra/favicon.png': {'path': 'favicon.png'},
-    'extra/404.html': {'path': '404.html'},
-    'extra/google3f40dbd543a603fa.html':
-    {'path': 'google3f40dbd543a603fa.html'}
+    "extra/CNAME": {"path": "CNAME"},
+    "extra/favicon.ico": {"path": "favicon.ico"},
+    "extra/favicon.png": {"path": "favicon.png"},
+    "extra/404.html": {"path": "404.html"},
+    "extra/google3f40dbd543a603fa.html": {"path": "google3f40dbd543a603fa.html"},
 }
 
-ARTICLE_PATHS = ['posts']
-ARTICLE_URL = 'posts/{slug}/'
-ARTICLE_SAVE_AS = 'posts/{slug}/index.html'
-ARTICLE_LANG_URL = 'posts/{slug}-{lang}/'
-ARTICLE_LANG_SAVE_AS = 'posts/{slug}-{lang}/index.html'
+ARTICLE_PATHS = ["posts"]
+ARTICLE_URL = "posts/{slug}/"
+ARTICLE_SAVE_AS = "posts/{slug}/index.html"
+ARTICLE_LANG_URL = "posts/{slug}-{lang}/"
+ARTICLE_LANG_SAVE_AS = "posts/{slug}-{lang}/index.html"
 
-PAGE_PATHS = ['pages']
-PAGE_URL = ('pages/{slug}/')
-PAGE_SAVE_AS = ('pages/{slug}/index.html')
-PAGE_LANG_URL = ('pages/{slug}-{lang}/')
-PAGE_LANG_SAVE_AS = ('pages/{slug}-{lang}/index.html')
+PAGE_PATHS = ["pages"]
+PAGE_URL = "pages/{slug}/"
+PAGE_SAVE_AS = "pages/{slug}/index.html"
+PAGE_LANG_URL = "pages/{slug}-{lang}/"
+PAGE_LANG_SAVE_AS = "pages/{slug}-{lang}/index.html"
 
-AUTHOR_URL = ('author/{slug}/')
-AUTHOR_SAVE_AS = ('author/{slug}/index.html')
+AUTHOR_URL = "author/{slug}/"
+AUTHOR_SAVE_AS = "author/{slug}/index.html"
 
-CATEGORY_URL = ('category/{slug}/')
-CATEGORY_SAVE_AS = ('category/{slug}/index.html')
+CATEGORY_URL = "category/{slug}/"
+CATEGORY_SAVE_AS = "category/{slug}/index.html"
 
-TAG_URL = ('tag/{slug}/')
-TAG_SAVE_AS = ('tag/{slug}/index.html')
+TAG_URL = "tag/{slug}/"
+TAG_SAVE_AS = "tag/{slug}/index.html"
 
 DEFAULT_PAGINATION = False
 
-AUTHOR_NAME = u'Bùi Thành Nhân'
+AUTHOR_NAME = "Bùi Thành Nhân"
 AUTHOR_SLUG = "nhanb"
 
-THEME_STATIC_PATHS = ['static']
+THEME_STATIC_PATHS = ["static"]
 
-MENUITEMS = (
-    ('Blog', '/'),
-)
+MENUITEMS = (("Blog", "/"),)
 
-PLUGINS = ['minify']
+PLUGINS = ["minify"]
 
 MINIFY = {
-    'remove_comments': False,
-    'remove_all_empty_space': False,
-    'remove_optional_attribute_quotes': False
+    "remove_comments": False,
+    "remove_all_empty_space": False,
+    "remove_optional_attribute_quotes": False,
 }
 
 FEED_DOMAIN = SITEURL
-FEED_ALL_ATOM = 'feeds/all.atom.xml'
-FEED_ATOM = 'feeds/atom.xml'
-CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
+FEED_ALL_ATOM = "feeds/all.atom.xml"
+FEED_ATOM = "feeds/atom.xml"
+CATEGORY_FEED_ATOM = "feeds/%s.atom.xml"
 
 # ========= Theme-specific settings follow =============
 
-MOTHERFUCKING_DEFAULT_THUMB = 'images/nhan.jpg'
-MOTHERFUCKING_GREETINGS = '''
+MOTHERFUCKING_DEFAULT_THUMB = "images/nhan.jpg"
+MOTHERFUCKING_GREETINGS = """
 Why hello there, source viewer. Here's a dragon for no particular reason:
 
        ^                       ^
@@ -108,4 +102,4 @@
   VVV  V        VVV  V
 
 (ripped off from http://www.retrojunkie.com/asciiart/myth/dragons.htm)
-'''
+"""
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..d78627b
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,340 @@
+[[package]]
+category = "main"
+description = "Fast, simple object-to-object and broadcast signaling"
+name = "blinker"
+optional = false
+python-versions = "*"
+version = "1.4"
+
+[[package]]
+category = "main"
+description = "Docutils -- Python Documentation Utilities"
+name = "docutils"
+optional = false
+python-versions = "*"
+version = "0.15"
+
+[[package]]
+category = "dev"
+description = "Discover and load entry points from installed packages."
+name = "entrypoints"
+optional = false
+python-versions = ">=2.7"
+version = "0.3"
+
+[[package]]
+category = "main"
+description = "Standalone version of django.utils.feedgenerator"
+name = "feedgenerator"
+optional = false
+python-versions = "*"
+version = "1.9"
+
+[package.dependencies]
+pytz = ">=0a"
+six = "*"
+
+[[package]]
+category = "dev"
+description = "the modular source code checker: pep8, pyflakes and co"
+name = "flake8"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "3.7.8"
+
+[package.dependencies]
+entrypoints = ">=0.3.0,<0.4.0"
+mccabe = ">=0.6.0,<0.7.0"
+pycodestyle = ">=2.5.0,<2.6.0"
+pyflakes = ">=2.1.0,<2.2.0"
+
+[[package]]
+category = "dev"
+description = "Clean single-source support for Python 3 and 2"
+name = "future"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "0.17.1"
+
+[[package]]
+category = "dev"
+description = "Copy your docs directly to the gh-pages branch."
+name = "ghp-import"
+optional = false
+python-versions = "*"
+version = "0.5.5"
+
+[[package]]
+category = "main"
+description = "An HTML Minifier"
+name = "htmlmin"
+optional = false
+python-versions = "*"
+version = "0.1.12"
+
+[[package]]
+category = "dev"
+description = "Read metadata from Python packages"
+name = "importlib-metadata"
+optional = false
+python-versions = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3"
+version = "0.18"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[[package]]
+category = "dev"
+description = "An autocompletion tool for Python that can be used for text editors."
+name = "jedi"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "0.14.1"
+
+[package.dependencies]
+parso = ">=0.5.0"
+
+[[package]]
+category = "main"
+description = "A small but fast and easy to use stand-alone template engine written in pure python."
+name = "jinja2"
+optional = false
+python-versions = "*"
+version = "2.10.1"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[[package]]
+category = "main"
+description = "Lightweight pipelining: using Python functions as pipeline jobs."
+name = "joblib"
+optional = false
+python-versions = "*"
+version = "0.13.2"
+
+[[package]]
+category = "main"
+description = "Python implementation of Markdown."
+name = "markdown"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
+version = "3.1.1"
+
+[package.dependencies]
+setuptools = ">=36"
+
+[[package]]
+category = "main"
+description = "Safely add untrusted strings to HTML/XML markup."
+name = "markupsafe"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "1.1.1"
+
+[[package]]
+category = "dev"
+description = "McCabe checker, plugin for flake8"
+name = "mccabe"
+optional = false
+python-versions = "*"
+version = "0.6.1"
+
+[[package]]
+category = "dev"
+description = "A Python Parser"
+name = "parso"
+optional = false
+python-versions = "*"
+version = "0.5.1"
+
+[[package]]
+category = "main"
+description = "Static site generator supporting reStructuredText and Markdown source content."
+name = "pelican"
+optional = false
+python-versions = "*"
+version = "4.1.0"
+
+[package.dependencies]
+blinker = "*"
+docutils = "*"
+feedgenerator = ">=1.9"
+jinja2 = ">=2.7"
+pygments = "*"
+python-dateutil = "*"
+pytz = ">=0a"
+six = ">=1.4"
+unidecode = "*"
+
+[[package]]
+category = "main"
+description = "An HTML minification plugin for Pelican, the static site generator."
+name = "pelican-minify"
+optional = false
+python-versions = "*"
+version = "0.9"
+
+[package.dependencies]
+htmlmin = ">=0.1.5"
+joblib = ">=0.9"
+pelican = ">=3.1.1"
+
+[[package]]
+category = "dev"
+description = "plugin and hook calling mechanisms for python"
+name = "pluggy"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "0.12.0"
+
+[package.dependencies]
+importlib-metadata = ">=0.12"
+
+[[package]]
+category = "dev"
+description = "Python style guide checker"
+name = "pycodestyle"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.5.0"
+
+[[package]]
+category = "dev"
+description = "passive checker of Python programs"
+name = "pyflakes"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.1.1"
+
+[[package]]
+category = "main"
+description = "Pygments is a syntax highlighting package written in Python."
+name = "pygments"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.4.2"
+
+[[package]]
+category = "main"
+description = "Extensions to the standard Python datetime module"
+name = "python-dateutil"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "2.8.0"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+category = "dev"
+description = "JSON RPC 2.0 server library"
+name = "python-jsonrpc-server"
+optional = false
+python-versions = "*"
+version = "0.2.0"
+
+[package.dependencies]
+future = ">=0.14.0"
+
+[[package]]
+category = "dev"
+description = "Python Language Server for the Language Server Protocol"
+name = "python-language-server"
+optional = false
+python-versions = "*"
+version = "0.28.0"
+
+[package.dependencies]
+future = ">=0.14.0"
+jedi = ">=0.13.2,<0.14.0 || >0.14.0,<0.15"
+pluggy = "*"
+python-jsonrpc-server = ">=0.1.0"
+
+[[package]]
+category = "main"
+description = "World timezone definitions, modern and historical"
+name = "pytz"
+optional = false
+python-versions = "*"
+version = "2019.1"
+
+[[package]]
+category = "main"
+description = "Python 2 and 3 compatibility utilities"
+name = "six"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*"
+version = "1.12.0"
+
+[[package]]
+category = "main"
+description = "Python with the SmartyPants"
+name = "smartypants"
+optional = false
+python-versions = "*"
+version = "2.0.1"
+
+[[package]]
+category = "main"
+description = "Filters to enhance web typography, including support for Django & Jinja templates"
+name = "typogrify"
+optional = false
+python-versions = "*"
+version = "2.0.7"
+
+[package.dependencies]
+smartypants = ">=1.8.3"
+
+[[package]]
+category = "main"
+description = "ASCII transliterations of Unicode text"
+name = "unidecode"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.1.1"
+
+[[package]]
+category = "dev"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+name = "zipp"
+optional = false
+python-versions = ">=2.7"
+version = "0.5.2"
+
+[metadata]
+content-hash = "6bd1286fee9e5bf28284fd5d107a8238514ba464c754ea5d7a3e08e20ff875bd"
+python-versions = "^3.7"
+
+[metadata.hashes]
+blinker = ["471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"]
+docutils = ["54a349c622ff31c91cbec43b0b512f113b5b24daf00e2ea530bb1bd9aac14849", "ba4584f9107571ced0d2c7f56a5499c696215ba90797849c92d395979da68521", "d2ddba74835cb090a1b627d3de4e7835c628d07ee461f7b4480f51af2fe4d448"]
+entrypoints = ["589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", "c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"]
+feedgenerator = ["5ae05daa9cfa47fa406ee4744d0b7fa1c8a05a7a47ee0ad328ddf55327cfb106"]
+flake8 = ["19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", "8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696"]
+future = ["67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8"]
+ghp-import = ["3e924ea720e4e1f82d56753db2154bfb86067472c5830732159c3a4c4fbc75d7"]
+htmlmin = ["50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178"]
+importlib-metadata = ["6dfd58dfe281e8d240937776065dd3624ad5469c835248219bd16cf2e12dbeb7", "cb6ee23b46173539939964df59d3d72c3e0c1b5d54b84f1d8a7e912fe43612db"]
+jedi = ["53c850f1a7d3cfcd306cc513e2450a54bdf5cacd7604b74e42dd1f0758eaaf36", "e07457174ef7cb2342ff94fa56484fe41cec7ef69b0059f01d3f812379cb6f7c"]
+jinja2 = ["065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", "14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"]
+joblib = ["21e0c34a69ad7fde4f2b1f3402290e9ec46f545f15f1541c582edfe05d87b63a", "315d6b19643ec4afd4c41c671f9f2d65ea9d787da093487a81ead7b0bac94524"]
+markdown = ["2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a", "56a46ac655704b91e5b7e6326ce43d5ef72411376588afa1dd90e881b83c7e8c"]
+markupsafe = ["00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", "09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", "24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", "62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", "6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", "7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", "88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", "8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", "98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", "9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", "9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", "ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", "b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", "b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", "b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", "ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", "e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"]
+mccabe = ["ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"]
+parso = ["63854233e1fadb5da97f2744b6b24346d2750b85965e7e399bec1620232797dc", "666b0ee4a7a1220f65d367617f2cd3ffddff3e205f3f16a0284df30e774c2a9c"]
+pelican = ["8049fb2411d902659ddc15c142a13f2c342e05f7f4a205f210a27e2ae8b8a81e", "d2bff36b9dd1bd3b70874b9ac06fafcd2620b16c0a21adb5051c48055a2b6f80"]
+pelican-minify = ["a0ffa9b1f15089bc4aec4692c5feba87356d427a7946ffd8b6222ac4c7758773", "fcefce477d4a24c8972ec8871738100f144e329201ab2b45aab8b5d3b7ba8e65"]
+pluggy = ["0825a152ac059776623854c1543d65a4ad408eb3d33ee114dff91e57ec6ae6fc", "b9817417e95936bf75d85d3f8767f7df6cdde751fc40aed3bb3074cbcb77757c"]
+pycodestyle = ["95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", "e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"]
+pyflakes = ["17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", "d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"]
+pygments = ["71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127", "881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297"]
+python-dateutil = ["7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", "c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"]
+python-jsonrpc-server = ["59ce9c9523c14c493a327b3a27ee37464a36dc2b9d8ab485ecbcedd38840380a"]
+python-language-server = ["3a5b2a980ea124361ab65bbbe963039d3bad4cbf4713eccfbc0cdb5cb5335609"]
+pytz = ["303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", "d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141"]
+six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"]
+smartypants = ["8db97f7cbdf08d15b158a86037cd9e116b4cf37703d24e0419a0d64ca5808f0d"]
+typogrify = ["8be4668cda434163ce229d87ca273a11922cb1614cb359970b7dc96eed13cb38"]
+unidecode = ["1d7a042116536098d05d599ef2b8616759f02985c85b4fef50c78a5aaf10822a", "2b6aab710c2a1647e928e36d69c21e76b453cd455f4e2621000e54b2a9b8cce8"]
+zipp = ["4970c3758f4e89a7857a973b1e2a5d75bcdc47794442f2e2dd4fe8e0466e809a", "8a5712cfd3bb4248015eb3b0b3c54a5f6ee3f2425963ef2a0125b8bc40aafaec"]
diff --git a/publishconf.py b/publishconf.py
index 43c3f00..0de997f 100644
--- a/publishconf.py
+++ b/publishconf.py
@@ -1,16 +1,16 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*- #
-from __future__ import unicode_literals
-
-# This file is only used if you use `make publish` or
-# explicitly specify it as your config file.
-
 import os
 import sys
 sys.path.append(os.curdir)
-from pelicanconf import *
 
-SITEURL = 'http://www.nerdyweekly.com'
+from pelicanconf import *  # noqa
+
+
+# This file is only used if you use `make publish` or
+# explicitly specify it as your config file.
+
+SITEURL = "https://hi.imnhan.com"
 RELATIVE_URLS = False
 
 DELETE_OUTPUT_DIRECTORY = True
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..09a8dbb
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,25 @@
+[tool.poetry]
+name = "imnhan.com"
+version = "0.1.0"
+description = ""
+authors = ["nhanb <nhan@nerdyweekly.com>"]
+
+[tool.poetry.dependencies]
+python = "^3.7"
+pelican = "^4.1"
+markdown = "^3.1"
+typogrify = "^2.0"
+pelican-minify = "^0.9.0"
+
+# temporary workaround for
+# https://github.com/sdispater/poetry/issues/1194#issuecomment-514974670
+docutils = "=0.15"
+
+[tool.poetry.dev-dependencies]
+flake8 = "^3.7"
+ghp-import = "^0.5.5"
+python-language-server = "^0.28.0"
+
+[build-system]
+requires = ["poetry>=0.12"]
+build-backend = "poetry.masonry.api"
diff --git a/requirements-src.txt b/requirements-src.txt
deleted file mode 100644
index 2ea13b1..0000000
--- a/requirements-src.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-pelican
-pelican-minify
-markdown
-typogrify
-
-flake8
-ghp-import
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 2ff72f9..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-blinker==1.4
-docutils==0.13.1
-feedgenerator==1.9
-flake8==3.3.0
-ghp-import==0.5.5
-htmlmin==0.1.10
-Jinja2==2.9.6
-joblib==0.11
-Markdown==2.6.8
-MarkupSafe==1.0
-mccabe==0.6.1
-pelican==3.7.1
-pelican-minify==0.9
-pycodestyle==2.3.1
-pyflakes==1.5.0
-Pygments==2.2.0
-python-dateutil==2.6.0
-pytz==2017.2
-six==1.10.0
-smartypants==2.0.0
-typogrify==2.0.7
-Unidecode==0.4.20