HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
dom96
jester
Nim2013–2023
dom96 / jester

jester

A sinatra-like web framework for Nim.

20Distinct people
28Mentions
0Explicit recommenders
1.6KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A sinatra-like web framework for Nim.

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:03:16 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year28 dated mentions

Observed mentions: 2013-05-21 14:58:38 UTC to 2023-08-02 08:39:09 UTC.

02462013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments20132014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 7 mentions; 1 submissions, 6 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20182019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2023

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC413
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC202
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC202
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC716
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC202
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC101
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC202
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC303
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC413
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
🃏 Jester 🃏 The sinatra-like web framework for Nim. Jester provides a DSL for quickly creating web applications in Nim. # example.nim import htmlgen import jester routes: get "/": resp h1("Hello world") Compile and run with: cd tests/example nim c -r example.nim View at: localhost:5000 Before deploying to production ensure you run your application behind a reverse proxy. This library is not yet hardened against HTTP security exploits so applications written in it should not be exposed to the public internet. Routes routes: get "/": # do something here. All routes must be inside a routes block. Routes will be executed in the order that they are declared. So be careful when halting. The route path may contain a special pattern or just a static string. Special patterns are almost identical to Sinatra's, the only real difference is the use of @ instead of the :. get "/hello/@name": # This matches "/hello/fred" and "/hello/bob". # In the route ``@"name"`` will be either "fred" or "bob". # This can of course match any value which does not contain '/'. resp "Hello " & @"name" The patterns in Jester are currently a bit more limited, there is no wildcard patterns. You can use the '?' character to signify optional path parts. get "/hello/@name?": # This will match what the previous code example matches but will also match # "/hello/". if @"name" == "": resp "No name received :(" else: resp "Hello " & @"name" In this case you might want to make the leading '/' optional too, you can do this by changing the pattern to "/hello/?@name?". This is useful because Jester will not match "/hello" if the leading '/' is not made optional. Regex Regex can also be used as a route pattern. The subpattern captures will be placed in request.matches when a route is matched. For example: get re"^\/([0-9]{2})\.html$": resp request.matches[0] This will match URLs of the form /15.html. In this case request.matches[0] will be 15. Conditions Jester supports conditions, however they are limited to a simple cond template. routes: get "/@name": cond @"name" == "daniel" # ``cond`` will pass execution to the next matching route if @"name" is not # "daniel". resp "Correct, my name is daniel." get "/@name": # This will be the next route that is matched. resp "No, that's not my name." Return values Route bodies all have an implicit request object. This object is documented in jester.nim and documentation can be generated by executing nim doc jester.nim. Returning a response from a route should be done using one of the following functions: One of the resp functions. By setting body, headers and/or status and calling return. redirect function attachment function There might be more. Take a look at the documentation of jester.nim for more info. Manual routing It is possible not to use the routes macro and to do the routing yourself. You can do this by writing your own match procedure. Take a look at example2 for an example on how to do this. Static files By default Jester looks for static files in ./public. This can be overriden using the setStaticDir function. Files will be served like so: ./public/css/style.css -> http://example.com/css/style.css Note: Jester will only serve files, that are readable by others. On Unix/Linux you can ensure this with chmod o+r ./public/css/style.css. Cookies Cookies can be set using the setCookie function. get "/": # Set a cookie "test:value" and make it expire in 5 days. setCookie("test", @"value", daysForward(5)) They can then be accessed using the request.cookies procedure which returns a Table[string, string]. Request object The request object holds all the information about the current request. You can access it from a route using the request variable. It is defined as: Request* = ref object params*: StringTableRef ## Parameters from the pattern, but also the ## query string. matches*: array[MaxSubpatterns, string] ## Matches if this is a regex ## pattern. body*: string ## Body of the request, only for POST. ## You're probably looking for ``formData`` ## instead. headers*: StringTableRef ## Headers received with the request. ## Retrieving these is case insensitive. formData*: MultiData ## Form data; only present for ## multipart/form-data port*: int host*: string appName*: string ## This is set by the user in ``run``, it is ## overriden by the "SCRIPT_NAME" scgi ## parameter. pathInfo*: string ## This is ``.path`` without ``.appName``. secure*: bool path*: string ## Path of request. query*: string ## Query string of request. cookies*: StringTableRef ## Cookies from the browser. ip*: string ## IP address of the requesting client. reqMeth*: HttpMethod ## Request method, eg. HttpGet, HttpPost settings*: Settings Examples Custom router A custom router allows running your own initialization code and pass dynamic settings to Jester before starting the async loop. import asyncdispatch, jester, os, strutils router myrouter: get "/": resp "It's alive!" proc main() = let port = paramStr(1).parseInt().Port let settings = newSettings(port=port) var jester = initJester(myrouter, settings=settings) jester.serve() when isMainModule: main() Github service hooks The code for this is pretty similar to the code for Sinatra given here: http://help.github.com/post-receive-hooks/ import jester, json routes: post "/": var push = parseJson(@"payload") resp "I got some JSON: " & $push
Read the full README on GitHub

What Hacker News says

28 sources
One of the reasons for choosing Nim was the ease of getting a production ready web backend. For the core part of managing the backend we are using existing Nim libraries [1], and they are easy to expand and work with. I cannot give you a comparison with Go since I haven't managed that large Go projects - but for Nim we are all into the async and threading. I think the channels within the threading is hardest part in Nim, but work is being done it. [1] https://nimble.directory [1a] https://github.com/dom96/jester/ [1b] https://github.com/planety/Prologue [1c] https://github.com/guzba/mummy
In Nim 2.0
I don’t know about other web-guides. Nim’s official website is made with Nim and available at Github[0], but it has become at bit more complicated after they switched to Karax[1]. Jester’s tests gives a good view on the routing procedures[2]. The official tutorials[3] are pretty good, when you get the grab on how to ”decode” them. For web development with websockets and microservices I would suggest you to have a look at the Redis package[4], and @treeform’s Websocket[5] and JsonParsing-packet[6]. [0] https://github.com/nim-lang/nimforum/ [1] https://github.com/karaxnim/karax [2] https://github.com/dom96/jester/blob/master/tests/alltest.ni... [3] https://nim-lang.org/docs/tut1.html [4] https://github.com/nim-lang/redis [5] https://github.com/treeform/ws [6] https://github.com/treeform/jsony
In Set up a website with Nim (2019)
I'm glad you liked it! We have been using Nim from 0.18.x to now (1.6.x) with a minimal work with breaking changes - so no warning signals from here. My advice would be to use the current stable version since 2.0.0 is just around the corner :) ! We are quite happy with the performance and system load using jester[1] with httpbeast for routing, but there are a couple of alternatives in the package repository[2]. [0] https://nim-lang.org/install_unix.html [1] https://github.com/dom96/jester/ [2] https://nimble.directory/
In Set up a website with Nim (2019)
How to run those benchmarks? At that Nim release page: https://nim-lang.org/blog/2021/10/19/version-160-released.ht... Is link to this benchmark: https://web-frameworks-benchmark.netlify.app/result Where nim is 2nd with 200k req/s, but it is using httpbeast: https://github.com/dom96/httpbeast That says it would be more useful to use jester: https://github.com/dom96/jester Jester has 150k req/s. But, when looking at these: https://www.techempower.com/benchmarks/ drogon, actix etc has about 600k req/s . Also redbean has about 600k req/s, when I tested: https://redbean.dev/ I tested like this: git clone https://github.com/wg/wrk.git cd wrk make ./wrk -H 'Accept-Encoding: gzip' -t 12 -c 120 http://127.0.0.1:8080/ When I tested https://caddyserver.com v2, it did show about 800k req/s. It would be very helpful to know how those benchmarks are a
Read the rest
ctually done, so that I could compare what is actually fastest in real world, and not just use some for benchmark tested winning non-realistic code.
In Nim 1.6
Well no language is perfect, but Nim can be used in almost every domain because of it's compilation targets(C, C++, JS) and it's fast compile times(who needs interpretation when compile times are that fast!): * Shell scripting, I still assume most people will just use Bash tho: https://github.com/Vindaar/shell * Frontend: https://github.com/karaxnim/karax or you could bind to an existing JS library. * Backend: For something Flask-like: https://github.com/dom96/jester or something with more defaults https://github.com/planety/prologue * Scientific computing: the wonderful SciNim https://github.com/SciNim * Blockchain: Status has some of the biggest Nim codebases currently in production https://github.com/status-im?q=&type=&language=nim&sort= * Gamedev: Also used in production: https://github.com/pragmagic/godot-nim and due to easy C
Read the rest
and C++ interop, you get access to a lot of gamedev libraries! * Embedded: this is a domain I know very little about but for example https://github.com/elcritch/nesper or https://github.com/PMunch/badger for fun Nim+embedded stuff! Most of the disadvantages come from tooling and lack of $$$ support.
In Nim 1.6
> Go has certain things out of the box that I think attributed to it's success: Yes, Google's backing. :) > I think if Nim could have a usable web server in the std lib (same with Rust and D) it would be a game changer. Nim does have an HTTP server in its stdlib[1], but I wouldn't go as far as to say that this is a game changer. > The first thing I test when I try any language is the web frameworks You should give my web framework, Jester[2], a try :) 1 - https://nim-lang.org/docs/asynchttpserver.html 2 - https://github.com/dom96/jester
In Show HN: Dali – A pure-Nim indie assembler for Android dex and apk files
webdev https://github.com/dom96/jester Nim's standard lib also has sockets and http. Nim's niche is clean and fast code, with strong C/C++ interop and metaprogramming. Run 'nimble search game' to get a list like this (I did not copy and paste the whole list): libtcod-nim: url: git://github.com/Vladar4/libtcod-nim/ (git) tags: roguelike, game, library, engine, sdl, opengl, glsl description: Wrapper of the libtcod library for the Nim language. license: zlib website: https://github.com/Vladar4/libtcod-nim nimgame: url: git://github.com/Vladar4/nimgame/ (git) tags: game, engine, sdl description: Simple 2D game engine for Nim language. license: MIT website: https://github.com/Vladar4/nimgame sfml: url: git://github.com/fowlmouth/nimrod-sfml/ (git) tags: game,
Read the rest
library, opengl description: High level OpenGL-based Game Library license: MIT website: https://github.com/fowlmouth/nimrod-sfml enet: url: git://github.com/fowlmouth/nimrod-enet/ (git) tags: game, networking, udp description: Wrapper for ENet UDP networking library license: MIT website: https://github.com/fowlmouth/nimrod-enet fowltek: url: git://github.com/fowlmouth/nimlibs/ (git) tags: game, opengl, wrappers, library, assorted description: A collection of reusable modules and wrappers. license: MIT website: https://github.com/fowlmouth/nimlibs nimrod-glfw: url: git://github.com/rafaelvasco/nimrod-glfw/ (git) tags: library, glfw, opengl, windowing, game description: Nim bindings for GLFW library. license: MIT website: https://github.com/rafaelvasco/nimrod-glfw chipmunk: url: git://github.com/fowlmouth/nimrod-chipmunk/ (git) tags: library, physics, game description: Bindings for Chipmunk2D 6.x physics library (for backwards compatibility) license: MIT website: https://github.com/fowlmouth/nimrod-chipmunk chipmunk6: url: git://github.com/fowlmouth/nimrod-chipmunk/ (git) tags: library, physics, game description: Bindings for Chipmunk2D 6.x physics library license: MIT website: https://github.com/fowlmouth/nimrod-chipmunk nim-glfw: url: git://github.com/EXetoC/nim-glfw/ (git) tags: library, glfw, opengl, windowing, game description: A high-level GLFW 3 wrapper license: MIT website: https://github.com/EXetoC/nim-glfw linagl: url: https://bitbucket.org/BitPuffin/linagl (hg) tags: library, opengl, math, game description: OpenGL math library license: CC0 website: https://bitbucket.org/BitPuffin/linagl
In Nim Programming Language v0.16.0 released
Webdev and games are fairly well covered, not sure about IOT but as far as embedded goes I know people are using it on arduino & RPi. Check out the stdlib: http://nim-lang.org/docs/lib.html Some interesting projects related to the above: Webdev frameworks: https://github.com/dom96/jester https://flyx.github.io/emerald/ https://github.com/onionhammer/nim-templates.git Gamedev: Urho3D game engine wrapper: https://github.com/3dicc/Urhonimo Nim GLSL framework (allows writing GLSL in Nim, meaning you can use metaprogramming in GLSL): https://github.com/yglukhov/nimsl Roguelike api: https://github.com/Vladar4/libtcod-nim/ SFML lib: https://github.com/BlaXpirit/nim-csfml SDL lib: https://github.com/PMunch/SDLGamelib High level glfw wrapper: https://github.com/ephja/nim-glfw Chipmonk wrapper: https://github.com/fowlmouth/nimrod-chipmunk/ Blog on
Read the rest
writing a 2D platformer in Nim: https://hookrace.net/blog/writing-a-2d-platform-game-in-nim-... Blog on making a JS NES emulator in Nim: https://hookrace.net/nimes/
In Nim Programming Language v0.16.0 released
Hi Marcus, have you ever taken a look at Nim? It's quite similar to Swift in several respects, but it has a primarily Python-like syntax (including indentation by blocks rather than braces) with bits of Ruby & others mixed in. Useful links: http://nim-lang.org/ , http://nim-lang.org/docs/tut1.html , https://nim-by-example.github.io/ , http://nim-lang.org/docs/manual.html At work, we use Python as our interpreted language & Nim as our fast, strongly-typed, compiled language. We created Nim-Pymod to enable Nim code to be compiled into Python modules: https://github.com/jboy/nim-pymod There's also a web-framework in Nim called Jester, which describes itself as "a Sinatra-like web framework": https://github.com/dom96/jester
In Ask HN: As a Python developer, what am I missing for not using Ruby?

Showing the 15 most recent of 28 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.