Back in February this thread asked why Crystal isn’t more widely loved, and a few concrete things came up: well-maintained example projects, an honest look at the web frameworks, and doing it collaboratively instead of everyone rebuilding alone. I’ve started on that.
Moving Motivators — a small, ephemeral, real-time team-ritual app in Kemal. It’s the first of a planned series where each app deliberately uses a different framework (Kemal here, Lucky next, Spider-Gazelle after) to make one point: framework choice should match problem size.
docker run -p 3000:3000 ghcr.io/jadekharats/motivators:latest
Two things I’d actually like this crowd’s eyes on. First, confidentiality: rankings stay hidden until reveal, and I enforce that by building each viewer’s payload in the domain rather than trusting any route handler — curious whether people would draw that boundary elsewhere. Second, I ran crytic on the domain and it caught a green-suite security gap (an empty facilitator token authorising anyone) that line coverage was blind to.
Lucky is next, for the kudos wall. If anyone with Lucky mileage wants to sanity-check that one as it comes together, I’d welcome it.
Recently, this has actually felt like the opposite to me!
Due to the extremely high-quality code in the Crystal community and the vast Ruby ecosystem, the quality of Crystal code written by AI is surprisingly high.
AI certainly blurs the boundaries between languages, but high-quality training corpora can allow Crystal to become an even more excellent language in the era of AI.
Returning to the subject of this post, I believe an undeniable reason is that Crystal enjoyed high visibility in its early stages (especially within the Ruby community). However, it failed to release version 1.0 at the most opportune moment (had it been released even slightly earlier, Crystal 2.0 might have already been out, and many features previously considered essential could have been deferred to 2.0). It clearly missed its prime window; as we say in Chinese, it “started early but ended late.”
As stated in the title of my previous post, Why people leaving crystal?, it is not that people never arrived, but rather that they arrived and then left.
Of course, this does not mean there are no opportunities. Although Anthropic entered the market later, they managed to overtake OpenAI in the massive AI market through pure merit (“good wine needs no busboy”).
The downside is that the programming language market is finite; once Crystal misses its window and fails to gain sufficient exposure, the investments already made in other languages will not easily switch back.
I think it will be very interesting to see how the agentic future evolves the adoption of Crystal lang. On the one hand, it’s now easier than ever to port an entire legacy codebase to another coding language. On the other, we are entering an age where software vulnerabilities will be exploited at a speed and rate which we’ve never seen before. Here I think the smaller community hurts crystal: less maintainers, less eyes on the shared packages and infrastructure used in live projects. However that means also smaller and less juicy targets for attackers, though part of the problem is these attacks can be setup to be entirely automated.
Highly suggest reading this post discussing patching a recent cohttp bug:
I rent a VPS and run OpenCode on it to search for bugs in Crystal. In 2026, new AI models are released almost every month. Their providers often offer free access or discounted prices. I use these offers to scan Crystal’s standard library.
I assume that data from free model usage is sent to the providers and used for model training or product development. In general, it is better to avoid such use when possible. However, in this case, I use these models deliberately. My purpose is to show the providers that Crystal users exist and to increase the amount of Crystal-related training data. This effort may have little practical effect.
When the models find a possible bug, I select cases that are simple and easy to understand. I reproduce each case myself and report it as an issue after confirming the behavior.