# TinyGSM: one Arduino library holding AT commands for a dozen modem families

> A header-only C++ library that turns SIM800, SIM7000, u-blox, Quectel and XBee modems into one Arduino Client interface, with per-module limits documented honestly.

**vshymanskyy/TinyGSM** — A small Arduino library for GSM modules, that just works

- Repository: https://github.com/vshymanskyy/TinyGSM
- Stars: 2,221 · Forks: 797
- Language: C++
- License: LGPL-3.0
- Published: 2026-10-07 · Updated: 2026-10-07 · Language: en
- Canonical page: https://hysenlabs.com/projects/vshymanskyy-tinygsm

## The problem this solves: AT commands differ per modem family

A cellular module is a serial device that speaks AT commands, and those commands are similar but not identical across manufacturers. SIMCom, Quectel, u-blox, SIMCom's AI-Thinker cousins and Digi's XBee modules all accept a command to open a TCP socket, and then they disagree about the response format, the asynchronous notification syntax, and how you read the payload back out.

If you have ever written that layer yourself, you recognise the shape of the problem: a `Client` subclass, a ring buffer, a parser for `+CMTI` style unsolicited messages, and a lot of code that is specific to one module on your desk. TinyGSM is that layer, written once, with the variations moved into per-module headers.

The library is C++, header-only in practice, and licensed LGPL-3.0. The repository tree is what you would expect from an Arduino library: `src/` for the library itself, `examples/` for sketches, `tools/` for helper scripts, plus `library.json`, `library.properties`, `keywords.txt` and a `CMakeLists.txt` for PlatformIO and CMake consumers. There is also an `extras/` directory holding documentation assets such as the logo.

The topics list reads like the modem catalogue, including `sim7000`, `sim800`, `sim900`, `quectel`, `ublox`, `xbee`, `esp32`, `esp8266` and `neoway`.

## Memory footprint measured on an Arduino Uno

The README makes a size argument with concrete numbers rather than adjectives, using the WebClient example compiled for an Uno over Software Serial:

```
Sketch uses 15022 bytes (46%) of program storage space. Maximum is 32256 bytes.
Global variables use 574 bytes (28%) of dynamic memory, leaving 1474 bytes for local variables. Maximum is 2048 bytes.
```

The comparison given right after is against the Arduino GSM library in a similar scenario, which the README puts at 15868 bytes of Flash and 1113 bytes of RAM. So on that example TinyGSM uses slightly less Flash and roughly half the RAM.

The RAM figure is the interesting one, because on an Uno you have 2 KB and no way to add more. The README explains the reason as pulling data gently from the modem whenever possible, operating on very little RAM. That is a design decision visible in the numbers: a library that buffers aggressively will not fit alongside a real application on an eight-bit MCU.

If you are targeting an ESP32 or ESP8266 this matters much less, since those boards have far more RAM. The Uno numbers matter for the legacy 2G modules such as the SIM800 and SIM900, which is exactly the pairing people build when they want SMS or a simple telemetry link on a small board.

## One Arduino Client interface over PubSubClient, Blynk and HTTP

The library's most useful property is that it presents itself as an Arduino `Client`, so the ecosystem of libraries written against that interface works with it. The README names PubSubClient for MQTT, Blynk, an HTTP Client example and a file download example as things provided out of the box.

That is what makes TinyGSM composable. Because the modem layer is a `Client`, any sketch that already sends MQTT over Ethernet or WiFi can be repointed at a cellular modem by changing the client construction rather than rewriting the protocol code. The same trick applies to Blynk, which is why a cellular Blynk device is a configuration change in most sketches.

The API Reference and Getting Started sections of the README's own table of contents point to the project wiki, which is where the detailed usage documentation lives rather than in the repository. The README is structured as an index into that wiki, with sections for first steps, writing your own code, and a long troubleshooting section covering stable data and power connections, baud rates, broken initial configuration, failed connections, a diagnostics sketch, web request formatting differences against Postman, SoftwareSerial problems, and specific notes for ESP32 hardware serial, SAMD21 boards, the Goouuu Tech IOT-GA6 versus the AI-Thinker A6 confusion, SIM800 and SSL, and which SIM7000 variant to use.

## Per-module connection counts and the SSL gaps

The feature list is where this library is most honest, and the most useful thing in it is the table of simultaneous TCP connections. It is not uniform. A6 and A7 give you 8, the ESP8266 gives 5, the SIM 800 and 900 series give 5, the Quectel BG96 and BG95 give 12, the u-blox 2G and 3G modules give 7, and the DigixBee cellular parts support only 1 connection.

That last number is the kind of detail that ends an architecture debate. If your design assumed two outbound connections on an XBee, the README has already told you it will not work.

SSL support is documented as three separate states rather than a yes or no. It is supported on the SIM800, SIM7000, A7672X, u-blox, XBee cellular, ESP8266, Sequans Monarch and the Quectel BG95 and BG96, with the warning that only some device models or firmware revisions have it, naming SIM8xx R14.18 and the A7 as examples. It is not yet supported on the SIM 5360, 5320, 7100 and the 7500 and 7600 families. It is not possible at all on the SIM900, the A6 and A7, the Neoway M590, or XBee WiFi.

UDP is listed as not yet supported on any module, with the note that it may be some day. USSD is supported on all SIMCom modems, Quectel modems and most u-blox parts, with decoding for 7, 8 and 16-bit responses.

Some entries are marked alpha, specifically the Quectel MC60 and the RAK WisLTE board. Those labels are the project's own way of saying the support exists but has not been hardened.

## CI moved to PlatformIO and the Travis badge stayed behind

The build story contains a small inconsistency worth naming. The README's build status badge points at Travis CI at `travis-ci.org`, and the repository tree contains a file called `.travis_archive.yml_archive`, where the renamed suffix suggests the Travis configuration was retired rather than deleted. Meanwhile the `Makefile` in the repository root contains no conventional build steps at all. Its only target runs PlatformIO:

```bash
platformio ci --lib="."
```

The target honours a `PLATFORMIO_CI_ARGS` variable when one is set, and otherwise defaults to the Leonardo board, which is an Arduino Uno variant that has native USB and so avoids the USB-serial adapter problem.

Both facts come from the repository and neither invalidates the other. The badge is stale rather than wrong in spirit, since the project did build on Travis at some point, and the Makefile shows where automated building went. A contributor reading the README badge would conclude CI is on Travis; a contributor reading the Makefile would correctly conclude it is on PlatformIO. Trust the Makefile.

There is also `cpplint.cfg` and a `.clang-format` in the root, so style is enforced by tooling rather than by convention, and a `ChangeLog.md` that tracks changes outside the tagged releases.

## Release cadence, board list, and what the README does not settle

Two dates frame the current state. The most recent release tag is v0.12.0, published 2024-05-28, preceded by v0.11.7 in 2023 and v0.11.5 in 2021. The last push to the default branch was on 2026-07-21. Read together, that says fixes continue to land on master while tagged releases lag, which is a normal pattern for a library that gets patched per module rather than released per feature.

The supported boards list is long and specific: the EnviroDIY LTE Bee and WiFi Bee, the Arduino MKR GSM 1400, the Sodaq GPRSbee and uBee, the Microduino GSM, Adafruit's FONA Mini Cellular GSM Breakout, the 800 and 808 shields and the FONA 3G, Industruino GSM, the Dragino NB-IoT Bee, Digi's XBee S6B, XBee LTE Cat 1, XBee3 LTE Cat 1 and XBee3 CatM, and the Nimbelink Skywire modules. The README notes that some boards need special configuration, linked to a board configuration page in the wiki.

What the README does not settle is the modem firmware revision question in any general way. It warns that SSL depends on the device model or firmware revision, giving SIM8xx R14.18 as an example, and the troubleshooting section covers a diagnostics sketch. But it does not tell you how to read your module's revision before you pick a function, so for a module where TLS is the deciding feature, the diagnostics sketch is the thing to run first.

It also does not document power supply requirements in numbers, only as a troubleshooting heading about stable data and power connection. Cellular modems transmit in bursts and draw far more current than a regulator sized for an idle board will supply, so that heading points at a real class of failure without quantifying it.

On licensing, LGPL-3.0 is a reasonable choice for a library that others link into closed firmware, since it requires that modifications to the library itself stay open. It does not require your sketch to be open. That is a structural point about how the license works rather than legal advice, and anyone shipping commercial firmware should read the license text and consult someone qualified.

## Conclusion

TinyGSM solves a problem that is genuinely tedious: every cellular module family speaks AT commands with enough differences that porting a sketch between an SIM800 and a u-blox means rewriting the modem layer. This library absorbs that difference behind one Arduino Client interface, and it is honest enough about the edges that you can pick hardware from the documentation rather than discovering the limit after soldering. Its documentation does more work than most embedded libraries, with named boards, a connection count per modem and a troubleshooting section that covers baud rates, SoftwareSerial and TLS. The clear constraint is that you must pick the modem part first and live within its capabilities: SSL is absent on the SIM900 and the A6, and XBee cellular supports a single connection. The last push was on 2026-07-21 while the most recent release tag, v0.12.0, dates from 2024-05-28, so expect steady fixes on the default branch and infrequent tagged releases. Verify your exact module against the supported modems list before writing code.

## FAQ

### How can I use GSM in Arduino?

Pick a cellular module supported by the library, wire it to a hardware or software serial port, and construct the client for that modem family so your sketch talks to an Arduino Client interface. Existing MQTT, HTTP and Blynk sketches then work over cellular by changing the client rather than the protocol code, and the project wiki holds the per-modem setup steps.

### Which TinyGSM modules support HTTPS and TLS?

SSL is listed as supported on the SIM800, SIM7000, A7672X, u-blox, XBee cellular, ESP8266, Sequans Monarch and the Quectel BG95 and BG96, but only on some device models or firmware revisions. It is not yet supported on the SIM 5360, 5320, 7100, 7500 and 7600 families, and it is not possible on the SIM900, the A6 and A7, the Neoway M590 or XBee WiFi.

### How many simultaneous TCP connections can a TinyGSM modem open?

It varies by module, and the README documents the number per part. A6 and A7 give 8, the ESP8266 gives 5, the SIM 800 and 900 series give 5, the Quectel BG96 and BG95 give 12, u-blox 2G and 3G parts give 7, and Digi XBee cellular modules support only one connection. UDP is not yet supported on any module.

## Sources

- [Issues](https://github.com/vshymanskyy/TinyGSM/issues)
- [License: LGPL-3.0](https://github.com/vshymanskyy/TinyGSM/blob/master/LICENSE)
- [README](https://github.com/vshymanskyy/TinyGSM/blob/master/README.md)
- [Releases](https://github.com/vshymanskyy/TinyGSM/releases)
- [vshymanskyy/TinyGSM on GitHub](https://github.com/vshymanskyy/TinyGSM)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/vshymanskyy-tinygsm
