tohray - a microblogging application in Nim
writing code is the best way to learn a programming language
Created:
tohray
ತೊರೆ, pronounced “toh-ray” (with a dental ‘t’ sound), is a microblogging application to capture stream of thoughts inspired by Linus Lee’s Stream
The word ತೊರೆ in Kannada has multiple meanings, but most commonly as rivulet, forego, divest; which are indeed appropriate description for the intent.
You can see this in action at https://tohray.fly.dev, and the source code is on github/btbytes/tohray.
Currently, it runs on Fly, but it can be made to run on the metal with a simple compile or on docker as Nilesh’s PR, (the first contribution to this repo!) shows.
Writing this allowed me to be lot more confident in my abilities to write Nim code. Nim has always fascinated me because it is a very capable language (See Aditya’s “Nim Nuggets: Systems Programming & Metaprogramming Magic” talk.
The best, and the fastest way to learn is to do.
Features
- Write new posts
- In markdown
- Click on the date to see posts written during that month.
- Delete posts
- Supports multiple users, but I really wrote it for myself.
- You can allow users to sign up by giving them the
inviteCode
Non-Features
- There is no edit button. If you wan to edit a post, you first make a copy of the content. Say you want to edit the post with the slug
about
. So, go to https://yoursite.com/about?format=md and copy the whole text. The first line printsslug = about
, so that you know what post you are about to re-edit. - There is no “user management”
- There is no “password reset”
Technology Details
Linus wrote his stream app using a language he created himself - Oaklang. I wanted an excuse to use Nim for something “useful”, so I used Nim, and it was a great experience.
Nim is a fast, and friendly language that is statically typed, while looking like Python in Syntax. It compiles the source code into C (or C++, or Javascript), which allows the programs written in it to be very fast, small, and quite portable.
- Programming Language: Nim
- Framework: Prologue, which in turn uses Karax.
- Database: Sqlite
- CSS: Terminal
- Cloud: Tested on https://fly.io
- Editor: eh.. didn’t know you cared, but it was written on Zed which has decent support for editing Nim with
nimlangserver
.
Programming Notes
- The
views.nim
file way too long, but I’m not ashamed of it. It’s app I wrote for myself, and it fits into myhead perfectly fine. - The decision to compile secrets into the binary was made after realizing that managing secrets in the environment,
.env
files,consts.nim
.. multiple places is just busy work. Not how I would write a “production” application.. but this is a “hobby” application. And, whatever makes me happy to keep writing code will remain.