Skip to content

Tourmaline Changelog#

I will do my best to keep this updated with changes as they happen.


  • Added full support for Bot API 6.3
  • (breaking change) All is_ prefixed properties in models have been replaced with ? getters. For instance, is_anonymous is now anonymous?.
  • (breaking change) Client#default_parse_mode and Client#default_command_prefixes have been made class properties instead of instance properties.
  • Fixed issues with missing priority and group properties on event handlers.
  • (breaking change) extra/paginated_keyboard no longer extends InlineKeyboardMarkup.
  • Added methods Client#send_paginated_keyboard, Chat#send_paginated_keyboard, Message#reply_with_paginated_keyboard, and Message#respond_with_paginated_keyboard. Requires import of extra/paginated_keyboard.
  • Fixed broken parts of extra/routed_menu.
  • Fixed broken parts of extra/stage.
  • Handlers no longer require an instance of Tourmaline::Client.
  • Added several new UpdateActions including ThreadMessage, ForumTopicCreated, ForumTopicClosed, ForumTopicReopened, VideoChatScheduled, VideoChatStarted, VideoChatEnded, VideoChatParticipantsInvited, and WebAppData.
  • Bot examples have all been fixed
  • More, see the official Bot API changelog for a complete list of changes.


  • Added sender_type method and SenderType enum to Message, allowing the user to easily figure out what type of user or channel sent the given message.
  • Updated docs


  • Removed Container class which was being used to maintain a global instance of Client.
  • Added finish_init method to all models, allowing them to contain an instance of the Client that created them.



  • Added full support for Bot API 5.1 - 5.3
  • Fixed some dependencies.
  • Added additional classes ChatInviteLink, VoiceChatStarted, VoiceChatEnded, VoiceChatParticipantInvited, VoiceChatScheduled, MessageAutoDeleteTimerChanged, InputInvoiceMessageContent, and BotCommandScope.
  • Added scope and language_code options to set_my_commands and get_my_commands.
  • Added method delete_my_commands.
  • More, see the official Bot API changelog for a complete list of changes.


  • Added support for TDLight.
  • Added user_token argument to to support the TDLight user API.
  • (breaking change) All arguments to are now keyword arguments.
  • (breaking change) Removed async argument from event handlers. All events are now async by default. Async events can be disabled with the -Dno_async flag.
  • UpdateHandler now accepts an array of UpdateAction, or a single one.
  • Fixed an issue where poll always deletes a set webhook. Now it will only delete the webhook if delete_webhook is true.


  • (breaking change) Removed the filters, replaced with new handlers
  • (breaking change) Removed Granite specific DB includes from models (also commented out; next update should make persistence better)
  • (breaking change) Renamed PagedInlineKeyboard to PagedKeyboard
  • Added RoutedMenu class for easy menu building


  • Replace broken Int in unions with Int::Primitive
  • Make Helpers.random_string actually return a random string, not just a number
  • Change the first run logic in Stage


  • Added support for Passport
  • Added animated? to Sticker
  • Added several new filters including InlineQueryFilter and CallbackQueryFilter
  • Added connection pooling to fix concurrency errors
  • Events are now async by default
  • Added a new helper class PagedInlineKeyboard
  • (breaking change) Moved KemalAdapter to tourmaline/extra
  • Added proxy support based on mamantoha/http_proxy
  • Added support for multiple prefixes with commands
  • Allow changing the log level using the LOG environment variable
  • Added an InstaBot example
  • (breaking change) Disabled (commented out) DBPersistence for now
  • Updated for bot API 4.9
  • Added support for the 🏀 emoji, including methods Client#send_basket, Message#reply_with_basket, and Message#respond_with_basket
  • Added via_bot field to Message
  • Added Stage (importable from tourmaline/extra) for conversation handling


  • Added ameba checks
  • Replaced Halite with HTTP::Client, resulting in a major speed boost
  • Rename persistent_init and persistent_cleanup to init and cleanup respectively
  • Remove handle_error in favor of Error.from_code


  • Updated polls for Quiz 2.0
  • Added new send_dart method


  • KeyboardMarkup
  • (breaking change) Replace Markup class with KeyboardBuilder abstract class and extend it with ReplyKeyboardMarkup::Builder and InlineKeyboardMarkup::Builder.
  • Add .build methods to ReplyKeyboardMarkup and InlineKeyboardMarkup.
  • (breaking change) Replace QueryResultBuilder with InlineQueryResult::Builder.
  • Update examples with new Builder classes being used.
  • InlineQueryResult
  • (breaking change) Replace QueryResultBuilder with InlineQueryResult::Builder.
  • Add .build method to InlineQueryResult.
  • Update examples with new Builder classes being used.
  • Persistence
  • (breaking change) Made Persistence a class rather than a module and updated HashPersistence and JsonPersistence to use it.
  • Add persistence instance variable to Client
  • Add NilPersistence and make it the default persistence for new Clients
  • Add DBPersistence


  • Add support for Filters.
  • Add users methods to Update and Message to return all users included in the same.
  • Replaced usage of the strange logger with the new Crystal Log class.
  • Log all updates with Debug severity if VERBOSE environment variable is set to true.
  • (breaking change) Renamed File to TFile to avoid conflicting with the builtin File class.
  • (breaking change) removed the Handler class and all subclasses. Update handling is now done exclusively with the EventHandler class and Filters.


  • Fix bug with event handler that was causing On handlers to run on every update.
  • Add CNAME file for
  • Update the logo.
  • Add DiceBot example.


Updated to bot API 4.7

  • Add send_dice method to client.
  • Add BotCommand model along with get_my_commands and set_my_commands methods.
  • Add new sticker/sticker set methods.
  • Add Dice update action.