DEV Community

Pradeep Gowda
Pradeep Gowda

Posted on

1

tohray - microblogging application in nim

ತೊರೆ, 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; the source code is on github.com/btbytes/tohray

Features

  • Write new posts
  • In markdown
  • Edit posts
  • Delete posts
  • Click on the date to see posts written during that month.
  • Supports multiple users, but I really wrote it for one user.
  • You can allow users to sign up by giving them the inviteCode
  • Export all the feeds from /export endpoint.
    • default format is JSON
    • append ?format=md to export in markdown format ie., /export?format=md. The entries are returned with a File Seperator (ASCII 28) after each entry.
  • Calendar view by month at /calendar to see all the posts belonging to a month.

Non-Features

  • 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.

Installation

  • Clone this directory
  • Have nim installed on your computer
  • copy example-consts.nim to consts.nim and set the variables
  • NOTE: The config is compiled into the binary. There is no "config file"
  • Compile the app with $ nim compile toray.nim
  • Launch the program with ./tohray, and the program will start on port :8080 - http://localhost:8080
  • Go to http://localhost:8080/register (not visible on the web page itself)
  • Use the inviteCode you set in consts.nim along with your name and password
  • Click on Write to start writing. I recomment writing a post with slug about so that the about link on the top nav actually goes to the about page.
  • The data is stored in a sqlite databse given in the consts.nim file
  • NOTE: if you want to see how the blog looks with some entries in it, you can run sqlite3 tohray.db < test.sql to see some lorem ipsum content.

Installation on fly.io

I wrote this so that I can run it fly.io. Study the Dockerfile and fly.toml.

Observe how I copy fly-consts.nim to consts.nim in the Dockerfile. This allows you to have a
local copy (on the computer) with the secrets etc, but will be compiled into the binary on deployment.

To create the volume where the database is stored (/mnt/db in fly.toml), you have to use this
command: fly volumes create db -r atl. Here, atl stands for Atlanta, where I launched the app.
The app and the volume should be in the same zone.

Todo

  • [x] Export all the posts in a JSON file (and markdown)
  • [x] Add a calendar view
  • [x] Edit Posts. Don't hold your breath
  • [x] Add calendar and export links
  • [x] RSS Feed
  • [ ] Fix Broken Search
  • [ ] Fix "Next Page" and "Previous Page" navigation
  • [ ] Implement /import
  • [ ] Deploy on other PaaS platforms like unicraft etc.
  • [ ] Make a static build of this docker image. Currently, it is using a full sized Ubuntu Normal image. bleh.
  • [ ] Make it Apple podcast compatible

Image of Datadog

The Future of AI, LLMs, and Observability on Google Cloud

Datadog sat down with Google’s Director of AI to discuss the current and future states of AI, ML, and LLMs on Google Cloud. Discover 7 key insights for technical leaders, covering everything from upskilling teams to observability best practices

Learn More

Top comments (1)

Collapse
 
sbalasa profile image
Santhosh Balasa • Edited

Super Kanri neevu 😅

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay