Term::Reader - Pure Crystal Readline implementation

Well that's the best way I can describe it anyway. In reality, Term::Reader makes no attempt to be like GNU Readline other than the obvious similarities between the two. What it does provide is a cross platform (minus Windows of course) way to receive user input, manage history, and more.

For now you can check it out here, but I do plan on either making a video or writing a full blog post about it later this week.

Finally getting some videos up!

I'm finally getting some Crystal related videos recorded and posted to my YouTube channel. Unfortunately the first video was plagued by a terrible echoing issue, but the second is better. Both I still think are worth watching though.

Eventually I'll get some actual Crystal language tutorials up, but I need to plan a little more for that. For now, here are the two videos I got up today:

Are You Feeling Lucky: Getting Started with the Lucky Framework https://youtu.be/qM7uKADQClw

Telegram Bot Development with Tourmaline: Getting Started https://youtu.be/vS9XB5LQ7wU

Announcing Marionette: It's like Selenium, but not

This is a project I've been working on for weeks and I'm very excited to finally have it to a point where I can announce it to the community.

Marionette was inspired by Puppeteer, and actually started as an attempt to port Puppeteer to Crystal. I learned after about a week of struggle that Node is much better adapted to an async workflow than Crystal. The lack of a good event system and promises made working with WebSockets in the way I needed quite difficult. I thought Marionette was doomed to failure until something changed in Crystal or the ecosystem, but then I learned about the actual Marionette protocol from Firefox.

The Marionette protocol is a TCP protocol built on top of WebDriver and is similar to what Selenium WebDriver uses. It allows near complete control of Firefox using TCP and JSON; including the ability to navigate, take screenshots, simulate pointer events, open and close dialogs, execute javascript, and more.

You can check out the project at https://github.com/watzon/marionette. The API is incomplete, but usable!

Subnet: Making working with IP addresses in Crystal easy

In Ruby there are a slew of different options for working with IP addresses, including the built in IPAddr class, but up till now Crystal has been lacking such functionality.

But no more! Subnet is a shard that makes working with IP addresses in Crystal not only possible, but extremely simple. It allows addresses to be used in Range literals, the creation of subnets and supernets, and many other things.

You can check out the readme documentation here or check out the api documentation here. And don't forget to give it a star if you like it!

Sorry for bombarding you with projects ;)

Announcing Arachnid: A powerful web scraper for Crystal

I love Crystal and have been using it for years, but one of the things I've felt like was missing for a long time was a good web scraper. So, because I definitely don't have enough personal projects, I decided to start building one myself.

Arachnid is based heavily off of the Spidr Ruby gem, with the main difference currently just being Crystal (and Spidr probably works better at the moment). The whole goal of Arachnid is to provide an easy to use DSL for scraping the web, whether you're looking for html pages, javascript, zip files, images, or anything else.

You can see some examples in the README and more will be coming very soon, as well as full documentation.

Announcing Strange: A more powerful logger

I know what you're thinking, "why another logger?!" I'll tell you why. Nothing out there currently has the features that I'm looking for in a logger. It seems like every logger in the Crystal ecosystem is super opinionated and lacks support for custom formatting and transports, so I created Strange.

Strange is a logger for those who want to do more with logs than just print them to the console. It supports all of the levels outlined in RFC5424, custom transports that allow you to define exactly where your logs go (whether that be the console, a file, or an external service), and custom formatters that let you format the output exactly how you want.

Strange is inspired by Winston, a powerful logger for NodeJS.

Please check it out and make sure to visit the issue tracker if you have any questions, a feature request, or just want to tell me I suck 😝

Cadmium: A pure Crystal NLP library

I've been working on a library to provide useful NLP (natural language processing) functionality in Crystal. The library is called Cadmium and is still in alpha with new features being added daily. Currently it provides functions such as tokenization, string distance, stemming, inflecting, n-grams, tf-idf (term frequency-inverse document frequency), and transliteration; with many more features coming in the near future.