--- title: 'Crystal: A Disappointing Story of Hope' description: I had a lot of hope for Crystal, but it wasn't as great as I thought it would be image: src: /images/crystal-a-disappointing-story-of-hope.webp alt: 'Crystal: A Disappointing Story of Hope' date: 2025-11-03T00:00 tags: - crystal - programming --- I really wanted to like Crystal; the idea is amazing. “Imagine Ruby’s syntax with a static type system, and a compiled executable”, that could give you an outstanding first class developer expeirence, but in reality, it's not as simple as that, and it never is. Crystal is a language I’ve been following and interested in for quite some time now. Crystal’s core idea has always really interested me. When I first heard of Crystal, I was getting into Ruby, and I really like its philosophy of “Ruby but statically typed and compiled”, ideally providing a more comprehensive developer experience, a faster runtime, and more portability since executables can be statically linked. I really wanted to like it, I really did, but its story isn't that of an underrated language, but an underwhelming one. The syntax of crystal is nice, it’s basically Ruby but with a static type system, and I like Ruby’s syntax, and I like static types, it typically allows for a much better developer experience and you dont end up with [md5('240610708') equaling md5('QNKCDZO')](https://stackoverflow.com/questions/22140204/why-md5240610708-is-equal-to-md5qnkcdzo) due to values being cast to superfluous types for no good reason. You can also get better IntelliSense, usually, and often type errors and other things before runtime. Despite the promising features, playing around with Crystal quickly revealed a different story. ## Why Crystal failed me ### Tooling Failure Crystal’s dev experience is less peachy than you would expect, given everything I’ve told you so far. I write most of my code in VSCode, for lots of reasons, since it’s just a web app means I can literally run a web server on a container and have an instant dev environment available from anywhere as long as I have an internet connection (and preferably more than 10” of screen). However, Crystal’s tooling negates most of its usefulness. For anything that matters, Crystal's support in VSCode is terrible, and this is **with the crystal-lang-tools VSCode extension installed**. Without it, there is no native support for Crystal _at all_, which isn’t terribly surprising if I’m being honest. The crystal tooling seems to be largely community-driven, which can be a good thing, but the vscode-crystal-lang extension on their GitHub organization has almost no activity, with the latest code change being 3 months ago and the commit before that being 9 months old at the time of writing. This lackluster tooling extends into its LSP as well. ### LSP Limitations The LSP often gives you outdated errors, and it starts to give me headaches after using it for any period of time. Its hints on hover are also not amazing, they are slow to appear, and 99% of the time, it gives you no more useful information than the type of the variable, in fact, most of the time, it gives you no hints whatsoever, and it makes you wonder if the problem is the LSP being unbelievably slow, or if the LSP _just sucks_. ![Crystal complaining about invalid code that no longer exists, reading “expecting identifier ‘end’, not ‘in’”](/images/crystal-a-disappointing-story-of-hope/Capture-20251022123246-1isu4s3.png) There is **no autocomplete whatsoever**; you won't get recommendations for functions ever, not even built-in functions, _nothing_. The syntax highlighting is often lacking, and once again, it has no idea of functions that have been registered, leaving them un-highlighted. The only things that get highlighted are primitives and reserved keywords, aka basic functions, though you just have to know they exist without autocomplete. Which is definitely possible, autocomplete is not necessary, that’s the whole point of writing code on paper is to prove you _can_ write code without your nice IDE sugar and spice, but writing code on paper is generally an exercise to prove you _can_ do it. Imagine writing code like that _forever_; that’s what writing Crystal is like. In the modern development ecosystem, this is unthinkable for many devs. Crystal has an ERB replacement that is nice to use and is nearly identical to ERB. However, while _sometimes_ it may be nice to use, _it often pains me to write_. Crystal tags in ECR files are not parsed or highlighted or anything really, and they often **break syntax highlighting of the entire file**, with no option for recourse other than to just give up or do something completely differently. ![an embedded crystal tag in a style tag completely destroying all syntax highlighting.](/images/crystal-a-disappointing-story-of-hope/highlight-20251022123336-idkrtky.png) Here, I'm putting a crystal tag in a style tag, and that just breaks everything. The reason for putting a crystal tag in a style tag is to embed the CSS for the page, so there is no FOUC. The solution would be to print the entire