From 69f6ebd917227df6edce3fe3521b1d5f7d36de19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20Nam=20Long?=
<26674308+J2TeamNNL@users.noreply.github.com>
Date: Sun, 1 Nov 2026 10:40:11 +0700
Subject: [PATCH 1/2] docs(databases): add the Memcached page
---
databases/index.mdx | 3 +-
databases/memcached.mdx | 86 +++++++++++++++++++++++++++++++++++++++++
docs.json | 1 +
3 files changed, 89 insertions(+), 1 deletion(-)
create mode 100644 databases/memcached.mdx
diff --git a/databases/index.mdx b/databases/index.mdx
index 6916e3f..efdf31c 100644
--- a/databases/index.mdx
+++ b/databases/index.mdx
@@ -1,6 +1,6 @@
---
title: Supported Databases
-description: All 42 engines TablePro connects to, their default ports, and which ones need a plugin
+description: All 43 engines TablePro connects to, their default ports, and which ones need a plugin
---
import DriverCounts from "/snippets/driver-counts.mdx";
@@ -35,6 +35,7 @@ driver comes from, not what the license covers.
| [libSQL](/databases/libsql) | API-based | Plugin |
| [Kafka](/databases/kafka) | 9092 | Plugin |
| [MariaDB](/databases/mariadb) | 3306 | Built-in |
+| [Memcached](/databases/memcached) | 11211 | Plugin |
| [Microsoft SQL Server](/databases/mssql) | 1433 | Plugin |
| [MongoDB](/databases/mongodb) | 27017 | Plugin |
| [MySQL](/databases/mysql) | 3306 | Built-in |
diff --git a/databases/memcached.mdx b/databases/memcached.mdx
new file mode 100644
index 0000000..0631245
--- /dev/null
+++ b/databases/memcached.mdx
@@ -0,0 +1,86 @@
+---
+title: Memcached
+description: Browse Memcached keys with their values and TTLs, edit them in the grid, and run text protocol commands
+---
+
+import RegistryPlugin from "/snippets/registry-plugin.mdx";
+
+Memcached 1.4 and later work over the text protocol on port 11211.
+
+
+
+## Quick setup
+
+Create a connection, select **Memcached**, enter host and port, then click **Save & Connect**. Memcached has no databases, so there is no Database field.
+
+## Connection settings
+
+| Field | Description |
+|-------|-------------|
+| **Host** | Memcached server hostname or IP. `localhost` by default |
+| **Port** | `11211` by default |
+| **Username / Password** | A user from the server's auth file. Leave both empty on a server without one |
+
+SSL and SSH tunnels work as on other connections. TLS needs a server built with TLS and started with `-Z`.
+
+## Authentication
+
+Fill in **Username** and **Password** for a server started with `-Y `, the text protocol's login in Memcached 1.5.15 and later. Without them such a server answers every command with `CLIENT_ERROR unauthenticated`, and the connection fails with "This Memcached server requires a username and password".
+
+SASL is not supported. It needs the binary protocol, which Memcached has deprecated.
+
+## Connection URL
+
+```text
+memcached://127.0.0.1:11211
+```
+
+## Browsing keys
+
+The sidebar shows one table, **keys**, with the item count from `stats`. The grid gives one row per key: **Key**, **Value**, **TTL** and **Flags**. TTL is the seconds left, and empty for an item that never expires.
+
+The text protocol has no command that lists keys, so the list comes from one of two places:
+
+| Server | Listing |
+|--------|---------|
+| 1.4.31 and later, with the LRU crawler on (the default) | `lru_crawler metadump all`. Every key |
+| Older, or started with `-o no_lru_crawler` | `stats cachedump` per slab class. A sample: the server caps each slab's reply, so keys can be missing |
+
+The table's comment says which one the connection uses. Neither is a snapshot: the server walks its LRU lists while it keeps moving items between them, so a key changed during the walk can be missing until the next refresh. A listing stops at 1,000,000 keys. Sorting is by key, and filters apply to **Key** only: `=`, `!=`, contains, starts with, ends with, `IN`, `NOT IN` and regex. Values are read with `get` for the rows on the current page.
+
+## Editing
+
+Saving edits generates commands:
+
+| Change | Command |
+|--------|---------|
+| **Value** or **Flags** | `set`, keeping the current TTL |
+| **TTL** alone | `touch`. Empty or `0` keeps the item until it is evicted |
+| New row | `set` with the row's key, value, TTL and flags |
+| Deleted row | `delete` |
+
+A TTL over 30 days is sent as the time it ends, because Memcached reads a larger exptime as a Unix time. **Key** cannot be edited: add a row with the new key and delete the old one. Truncating the table runs `flush_all`, which empties the whole server.
+
+## Command editor
+
+The editor takes text protocol commands with the value as the last argument instead of a data block. Quote a value that holds spaces. Inside double quotes, `\n`, `\r`, `\t`, `\xHH`, `\"` and `\\` are escapes; single quotes take everything as written.
+
+```bash
+get user:1 user:2
+set user:1 0 300 "Ada Lovelace"
+append user:1 0 0 " (1815)"
+cas user:1 0 300 42 "new value"
+touch user:1 600
+incr page:hits 1
+delete user:1
+stats items
+lru_crawler metadump all
+```
+
+The whole vocabulary is `get`, `gets`, `gat`, `gats`, `set`, `add`, `replace`, `append`, `prepend`, `cas`, `touch`, `delete`, `incr`, `decr`, `flush_all`, `stats`, `version` and `lru_crawler metadump`. Anything else comes back as "Unsupported Memcached command" without reaching the server. Storage commands take ` `, the order of the text protocol.
+
+Safe Mode reads `get`, `gets`, `version`, `stats` and `lru_crawler metadump` as reads, `delete` and `flush_all` as destructive, and everything else, `stats reset` included, as a write.
+
+## Server Dashboard
+
+The Server Dashboard shows used memory against `limit_maxbytes`, items, hit ratio, evictions, connections and uptime, all from `stats`.
diff --git a/docs.json b/docs.json
index 7d896d6..678b0b4 100644
--- a/docs.json
+++ b/docs.json
@@ -258,6 +258,7 @@
"databases/kingbasees",
"databases/libsql",
"databases/mariadb",
+ "databases/memcached",
"databases/mssql",
"databases/mongodb",
"databases/mysql",
From ccdc1a1e19e6afc82db3ef564d7119d49fe4166e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20Nam=20Long?=
<26674308+J2TeamNNL@users.noreply.github.com>
Date: Sun, 1 Nov 2026 10:40:47 +0700
Subject: [PATCH 2/2] docs(databases): count Memcached among the engines
---
databases/index.mdx | 2 +-
index.mdx | 2 +-
snippets/driver-counts.mdx | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/databases/index.mdx b/databases/index.mdx
index efdf31c..492f101 100644
--- a/databases/index.mdx
+++ b/databases/index.mdx
@@ -5,7 +5,7 @@ description: All 43 engines TablePro connects to, their default ports, and which
import DriverCounts from "/snippets/driver-counts.mdx";
-Forty-two engines, and every one of them is free to use. What differs between them is where the
+Forty-three engines, and every one of them is free to use. What differs between them is where the
driver comes from, not what the license covers.
diff --git a/index.mdx b/index.mdx
index c64e11f..7079bb9 100644
--- a/index.mdx
+++ b/index.mdx
@@ -1,6 +1,6 @@
---
title: Introduction
-description: Native macOS database client for MySQL, PostgreSQL, SQLite, MongoDB, Redis, and 37 more
+description: Native macOS database client for MySQL, PostgreSQL, SQLite, MongoDB, Redis, and 38 more
---
import DriverCounts from "/snippets/driver-counts.mdx";
diff --git a/snippets/driver-counts.mdx b/snippets/driver-counts.mdx
index 44a8722..2f0288b 100644
--- a/snippets/driver-counts.mdx
+++ b/snippets/driver-counts.mdx
@@ -1,3 +1,3 @@
-Five drivers ship inside the app and cover twelve databases. Twenty-six registry plugins cover the
-other thirty and install on the first connection that needs one. See
+Five drivers ship inside the app and cover twelve databases. Twenty-seven registry plugins cover the
+other thirty-one and install on the first connection that needs one. See
[Plugins](/features/plugins).