[HN Gopher] Marten: a Crystal web framework ___________________________________________________________________ Marten: a Crystal web framework Author : ellmetha Score : 68 points Date : 2022-10-30 20:22 UTC (2 hours ago) (HTM) web link (martenframework.com) (TXT) w3m dump (martenframework.com) | dom96 wrote: | It's quite amazing how many web frameworks are built for Crystal | (in comparison to other languages of the same size, for example | Nim) | wheels wrote: | I'd love to hear stories about actual Crystal use. | | Of all the languages I've seen emerge in recent years, it was the | one I was most conceptually fond of. | | It's basically (progressively-) statically typed Ruby, but fast | (compiled). I enjoy writing Ruby, but I hate maintaining it. | noaheverett wrote: | We use it in production for our products at https://ark.fm and | are actively working to move all of our Rails apps over to | Crystal which ironically this framework looks great and may be | a good choice for us. (Thank you to the author!) | | Our email service runs an image proxy (to hide your IP from | email trackers) with probably about 30-50 lines of code in | Crystal that's been in production for multiple years and it | just works. | | Current project (in the cloud hosting space) that will heavily | use Crystal for backend management and WASM which was recently | introduced into Crystal and is a game changer for our use-case. | | Also wrote a command-line tool with it and it feels like I'm | cheating at how easy it is to do so. | | Coming from the Ruby/Rails world where you have to cap | deploy/bundle etc to push to a production server and hoping | nothing breaks on dependancies makes Crystal's single binary | deploy a breath of fresh air...not to mention the performance. | We run our own hardware so being able to (eventually once we've | moved over fully to Crystal) run the same workloads on LESS | hardware with electric prices spiking is financially | attractive. | | As you can tell I'm a fan boy. I'm betting heavily on Crystal | and going all in with our stack. | | Did I mention it is fast? | shafyy wrote: | Kagi (the search engine) is built on Crystal. | fdr wrote: | The Crunchy Bridge CLI is written in crystal: | https://github.com/CrunchyData/bridge-cli/. The program that | monitors databases is likewise a crystal program. There are a | few other crystal programs rolling around. | | My biggest grievance with Crystal is the lack of incremental | compilation. I understand why it's difficult to achieve given | the language model, and some of the conveniences of that model. | I've been watching the Crystal Interpreter with interest, it | would be pretty cool if it could speed up my `M-x crystal-spec- | line` interactions, along with all the other usual benefits of | an interpreter. | | On the other hand, there's a lot to like about Crystal: it has | a convenient yet powerful type system, good error messages, | good support for invoking C subroutines in libraries, and | generates efficient object code in a straightforward manner. | compumike wrote: | My side project https://totalrealreturns.com/ is now about 5k | lines of Crystal. There are some rough edges: in particular I | think it could use a better templating solution (a port of HAML | would be ideal!), and there are some failure modes with the | Redis connection pool that have required workarounds. | | This includes unit tests: the built-in spec framework is great | and much like rspec. https://crystal- | lang.org/reference/1.6/guides/testing.html | | I'm now starting to use Crystal for internal backend | infrastructure and microservices. | | For anyone who wants to kick the tires on Crystal, I built a | crystal-docker-quickstart project template: | https://github.com/compumike/crystal-docker-quickstart works | without having to install anything locally. (Assuming you have | docker.) You can have your own, home-built "Hello world" static | binary in under a minute: git clone | https://github.com/compumike/crystal-docker-quickstart.git | my_app && cd my_app && ./d_dev # in the shell that | appears: make && out/my_app | | Then just edit src/main.cr and you're off and running :) | paulgb wrote: | That is one fast-loading page, especially for (what looks to | be) dynamic data! | | Are you doing anything special or just using a good CDN? | compumike wrote: | Thanks :) No CDN actually -- it's just a side project | served straight from a single VPS at the moment. | | You're probably just seeing the speed of response caching | (which I've written in Crystal too, using Redis and local | disk as storage backends). If you request a new ticker | symbol that isn't already cached, or specify custom date | ranges, it will recompute or even have to fetch data from | upstream data provider, and those requests will take a bit | longer. | | Also, the whole site is currently served up as a single | HTTP request, except for a few external JS and CSS files | (Bootstrap, uPlot) which are served from public CDNs. | karol wrote: | Nice project, learned a bit from it about some Vanguard funds | I didn't know about previously. | nerdponx wrote: | I enjoyed poking around at Crystal, but its library ecosystem | seems heavily oriented towards web development (understandably, | because its creators are a web dev consultancy), and I don't do | much web development for my hobby programming. | | Also, I found that its static analysis tooling (eg LSP server) | was really slow. Compiling small programs was also rather slow, | and it generated large binaries. | | I also had some difficulty understanding the documentation | related to importing and including modules and classes; it | seemed written from a perspective assuming that the reader | already knows Ruby, which I do not. | | At the time, I was also curious about Common Lisp and Nim, so I | spent a bunch of time learning the former, and have lately been | writing small personal scripts/tools using the latter. | | My experience using Python for backend web development has been | mixed. If I had to do work like that professionally in the | future, I would be happy to do it in a language like Crystal. | It seems a lot more comfortable to me than Go, less | intimidating than a JVM language (Kotlin?), and less "weird" | than Common Lisp or a functional language like OCaml. | | It doesn't seem like a bad choice for a company willing to | invest in engineers while they learn the language, and maybe | invest in writing some of their own libraries while the | ecosystem is still young. I felt like I was able to get | productive fairly quickly. | | I think an interesting project would be to write a fairly | simple web server (maybe some basic REST CRUD thing using | idiomatic code) in several languages and frameworks, and | compare their performance, ease of getting started, and | complexity of the code. I had started working on this myself at | one point, and it seems like it could be worthwhile to pick up | again, especially now that all of the language ecosystems I had | in mind have matured a little bit. | mhenders wrote: | Regarding different languages and frameworks, I found this | informative: https://www.youtube.com/watch?v=FQPlEnKav48 | hamandcheese wrote: | > I enjoy writing Ruby, but I hate maintaining it. | | Sorbet helps immensely in this regard (though it does perhaps | make writing ruby a bit less joyful). The Sorbet language | server works great (at least with VSCode) - I have pretty | reliable go-to-definition and intellisense. | | I would imagine that if crystal had a decent language server | the experience would be even better than Ruby+Sorbet. | wheels wrote: | Refactoring tools are nice (I guess; I've honestly only used | them in Java; I'm mostly an Emacs person), but my main gripes | with Ruby maintenance are harder to fix with type | annotations: | | - In duck-typed languages you have to write a lot of tests to | do verify things that the compiler does for you in statically | typed languages. That neuters much of the benefit of the | concision of such languages. Crystal shoots for the best of | both worlds. (Static type checking, but usually without | explicit signatures.) My main refactoring tool in statically | typed languages is the compiler: if I break something, it'll | tell me. | | - Monkey-patching, open classes, etc. I do it too. Pretty | much every Ruby-ist does. But it makes it damn near | impossible to track down bugs sometimes, because even finding | out what file the relevant code is in isn't trivial. Again, | Crystal seems to mostly side-step that pitfall. | | - Speed. I don't even attempt to write fast code in Ruby | (though I have written a few C++ extensions for Ruby in a | pinch). But if I could get near-to systems-language level | performance out of something that was almost Ruby, that'd be | pretty amazeballs. | galaxyLogic wrote: | > My main refactoring tool in statically typed languages is | the compiler: if I break something, it'll tell me. | | That really helps. But what's even better in practice is if | compiler is integrated into an IDE which can highlight | type-errors already while you are editing the code, before | you explicitly invoke the compiler. For instance Eclipse | IDE does that for Java code. | | If you need to run the compiler by hand before you get any | error-messages it becomes a huge delay and you lose the | immediate feedback which is needed to keep your focus on | the code, not on compiler error-messages. | pmontra wrote: | > In duck-typed languages you have to write a lot of tests | to do verify things that the compiler does for you in | statically typed languages | | Would you give some examples? I think I'm testing only | functionality but maybe I'm not realizing that I'm testing | the types of arguments. | wheels wrote: | Sure. | | Ruby: def foo(a) raise | ArgumentError unless [ :bar, :baz, :quux ].include?(a) | return 1 end def test_foo | assert_raise(ArgumentError) { foo(1) } | assert_raise(ArgumentError) { foo(:moo) } | assert_instance_of(foo(:bar), Integer) end | | In C++ I'd write: enum class Value | { Bar, Baz, Quux }; | int foo(Value a) { return 1; } | | In a strongly typed language you don't need to do any of | the input validation. I'm not sure that I'd do that level | of granularity of tests in an application, but I spend a | lot of times writing libraries, where it's pretty | important. | | You also _have_ to call all code paths with your tests in | Ruby because otherwise you won 't hit errors. Just basic, | "this thing runs, the methods it calls exist, it returns | a value, and it's of this type" is all guaranteed in a | strongly typed language and doesn't need to be explicitly | tested. | wheels wrote: | Actually, here's another example: def | foo(a) if a == 1 bar else | baz end end def test_foo | foo(1) foo(2) end | | In the C++ equivalent there's no need to test those | values because the compiler will tell you that the | methods exist. In Ruby you need to test them so that you | catch those paths in refactoring. void | foo(int a) { if(a == 1) bar(); | else baz(); } | freediver wrote: | The backend for Kagi Search is powered by Crystal. | cutler wrote: | Rails clone? | joshmn wrote: | What's your definition of Rails clone? MVC? If it is, sure, | yeah, this and a whole bunch of other frameworks are Rails | clones. Laravel is a Rails clone. Django is a Rails clone. | We're all Rails clones! | | Does the design of some of the logic look heavily-inspired by | Rails? Sure, and I think it's a great choice. | | But in reality, calling it a Rails clone is a disservice to | Rails. Rails is much more than MVC and patterns implemented | from Patterns of Enterprise Application Architecture. The power | of Rails isn't in any single one of the patterns -- sure, it | may have started that way when it was common to ship PHP copy- | pasted from php.net and deployed using Filezilla (or | explorer.exe!) -- but since, what, 2.3? the power of it has | been it's ecosystem: nothing can come close to the vastness and | maturity of Rubygems. | Scarbutt wrote: | I don't know, the vastness of the JS ecosystem seems bigger | to me? I have come across many third party service providers | that do not offer Ruby SDKs but do for JS,Java,Python etc... | 0xblinq wrote: | I think the Laravel ecosystem is pretty comparable, if not | better, than the rails one. | jbverschoor wrote: | Yeah, I never like it when they don't simply state that's the | case. | gortok wrote: | Not to be confused with the C# document database built on | Postgres. | | https://martendb.io/ | mtrycz2 wrote: | All I want form a framework is for it to be boring. | | Am I the only one? Am I crazy? | jstummbillig wrote: | I certainly don't mind if a framework is boring, if it comes | with qualities I am interested in. Being boring is not one of | them - but neither is being exciting. | [deleted] | jbverschoor wrote: | Congrats with the release and docs. Curious about: | | Refresh/compile times, esp with more models and controllers | | Do you get a single binary for deployment which includes all | assets, such as a .war? | | Is there debugger, similar to the one in rails? | wazbug wrote: | Not a Crystal expert, but the Marten tutorial mentions a | `crystal play` command that will run a web-interface with an | interactive "playground" that you can interact with your | program's functionality in: | https://martenframework.com/docs/getting- | started/tutorial#in.... | chrisseaton wrote: | > Do you get a single binary for deployment which includes all | assets, such as a .war? | | I think they mean such as an .exe | | > Is there debugger, similar to the one in rails? | | What debugger are you using for Rails? In my experience Rails | has been significantly lacking in a debugger (it's improved | recently with the debug gem.) | | (Not an expert.) | mfkp wrote: | My company has donated thousands of dollars to the crystal | development budget. Always excited to see new additions to the | ecosystem! | | This framework is looking very nice if you're looking for a | rails-style framework. I'll definitely give it a shot on my next | project. | viraptor wrote: | I'd love to see two docs there: | | - What's different from Lucky https://luckyframework.org/ | | - What's different from Amber https://amberframework.org/ | | There's probably something exciting there, but finding out the | differences in features for yourself... please don't make me do | that. | prh8 wrote: | Love Crystal and love seeing it here more. Ruby has been day job | for years, but Crystal is so much fun for side projects and | random things to build. Easily approachable, especially for Ruby | devs. ___________________________________________________________________ (page generated 2022-10-30 23:00 UTC)