Posted on August 05, 2018


This blog is built on my own from scratch (e.g. server, database, backend and frontend) and the current version is 3.1. It's mainly based on Mysql, Bootstrap and Flask.

I started to build my blog in 2014 and it’s hosted on a VPS and online for about 8 years!

Here are some descriptions of the tech I used:

  • Server
    • A 24/7 online OpenVZ VPS with DDoS Protection (hosted on budgetvm bandwagon).
    • Auto-backup and auto-restart service using supervisor.
    • A reverse proxy (Nginx) to manage multiple servers for different websites.
    • A WSGI (uWSGI) proxy to accelerate the communication between the server program and Nginx.
    • A SQL (MySQL) database to store the data and database-migration information.
  • Backend
    • A server based on Flask with different configurations (i.e. deployment and development).
    • A command line interface (CLI) to test the backend and manage the database.
    • An authorization system with
      • Password Hashing and Salting.
      • A Password retrieval system through email (removed now since there is only one user).
      • User grouping and permission management.
      • CSRF Protection on the forms.
    • A file server that
      • With Hotlink protection (removed now)
      • With the size and type filter.
      • Stores/Manages/Sorts the uploaded files.
      • Automatically uploads the pasted images instantly in the editor.
    • A SQL-based data-schema with an object-relational mapping (ORM) definitions.
    • A database auto-migration component.
    • An analysis component based on Google Analytics.
    • A set of RESTful API that allows other applications to fetch the posts.
  • Frontend
    • A responsive design based on Bootstrap 3 4.
    • An editing tool that can dynamically load the content with AJAX.
  • Features
    • Editing
      • A rich text editor with CKEditor 4, which can edit images, formula, code, tables, embedded video and many other elements.
      • Customizable tags and categories.
      • A shared JavaScript management system (e.g. code-highlighting scripts).
      • Embeddable and Customizable Scripts (e.g. embed React code in the post).
      • An unsaved file warning when exiting.
    • Viewing
      • Auto-pagination.
      • Searching and filtering.
      • An auto-hiding navigation bar.
      • A timeline-based log.
      • A focusing effect when pointing the brief description of a post.
    • Streaming
      • Broadcast with SRS+FFMPEG via RTMP+HTTP
      • RTMP: Low latency (~5s)
      • HLS (HTTP): No flash needed

Updates in 3.5(Ongoing):

  • About me.
  • A twin site with the same piece of code
    • Redesign the frontend
    • Refactor a site-specific rendering system
  • fixed the spotlight bug
  • fixed the encoding problem
  • fixed the ulog clickable
  • Added online stream
  • Local timezone feature
  • Added pin logo in the post list
  • Enabled remember me
  • Updated the line height
  • Added highlight for log (anchor)
  • Supported login with timezone
  • [2020/05/23]: Support Reversed Timeline

Updates in 3.4:

  • New filter design.
  • Move to a new server (new IP).
  • Redesign the filter.
  • Move to a new server (at bandwagon)
  • A change log system.
  • Updates in 3.3 (Aug 2018)
  • New Features:
  • Backend-side updates:
    • Added a set of RESTful API routes.
    • Added an API Key table. 
  • Server-side updates:
    • Re-installed the server, upgraded the packages and moved to python3.
    • Used uWSGI emperor to manage different apps to make a better load-balance management (nginx cannot).
    • Switched the browsing UID to www-data to ensure the safety.

Updates in 3.1 (July 2018)

  • Refactored the backend.
  • Upgraded all flask-related libraries and move to Python3.
  • Upgraded from Bootstrap 3 to Bootstrap 4.
  • Separated the CSS from HTML entirely.
  • Re-designed the navigation bar.
  • Added the “focusing” animation.
  • Updated the CKEditor.
  • Added a “script” field to the Post table.
  • Simplified the post categorization.
  • Corrected the encoding of the database.


The 1.0 version of my blog. The domain was (deprecated now).