JSON option request
@zedeus I used your edits to turn the search into a JSON API. and this is awesome and wish it was part of the core project sort of like how you implemented rss.....
I was going down the route of scraping the front end of nitter and was pleasantly surprised when I seen the JSON output and saw that all the replyid's and user fields were already in the JSON output so it didn't require clicking into additional endpoints. 

> ```diff
> diff --git a/src/routes/search.nim b/src/routes/search.nim
> index 02c14e3..b2ceefc 100644
> --- a/src/routes/search.nim
> +++ b/src/routes/search.nim
> @@ -11,6 +11,12 @@ include "../views/opensearch.nimf"
>  
>  export search
>  
> +import jsony, times
> +export jsony
> +
> +proc dumpHook*(s: var string, v: DateTime) =
> +  s.add $v.toTime().toUnix()
> +
>  proc createSearchRouter*(cfg: Config) =
>    router search:
>      get "/search/?":
> @@ -37,8 +43,7 @@ proc createSearchRouter*(cfg: Config) =
>          let
>            tweets = await getGraphSearch(query, getCursor())
>            rss = "/search/rss?" & genQueryUrl(query)
> -        resp renderMain(renderTweetSearch(tweets, prefs, getPath()),
> -                        request, cfg, prefs, title, rss=rss)
> +        resp tweets.toJson
>        else:
>          resp Http404, showError("Invalid search", cfg)
> ```