← Back to all posts

By Rox Team

Rox v2026.7.0-rc

We've prereleased Rox v2026.7.0-rc (after rc.1, we've gone on to rc.2, which improves the mobile deck). The headline this time is a time-series charts subsystem, alongside deck usability fixes and container/Kubernetes support for self-hosters.

This is a release candidate. It's feature-complete and tested, but please validate in staging before relying on it in production.

Time-series charts subsystem (optional TimescaleDB)

Until now, Rox's stats were computed on the fly with COUNT(*)nothing was kept as history. So there was no equivalent of Misskey's charts: no "notes per day", no user growth, no federation activity over time.

In v2026.7.0 we added a subsystem that periodically snapshots metrics and serves them back as time series.

  • Misskey-compatible endpoints: GET /api/charts/{users,notes,active-users,federation,drive} (span=hour|day, limit, until)
  • Admin dashboard: summary cards plus a dependency-free, lightweight SVG chart
  • Collector: snapshots each metric hourly

Opt-in (off by default)

In keeping with Rox's "light and runs anywhere" philosophy, the subsystem is opt-in.

# Off by default. Turning it on enables the collector and the charts API.
CHARTS_ENABLED=true
# auto: use TimescaleDB if the extension is present, otherwise fall back to plain PostgreSQL
CHARTS_BACKEND=auto

With CHARTS_ENABLED=false (the default), no collector runs and the API is disabled — behavior is identical to before.

TimescaleDB is not a "fourth database"

The key design point: TimescaleDB is not added as a new DB_TYPE. It's a PostgreSQL extension, so it runs under the same DB_TYPE=postgres.

The subsystem uses a single long-format chart_snapshots table as the shared read model for both backends. When TimescaleDB is detected, that table is promoted to a hypertable with compression (30 days) and retention (400 days) policies, applied automatically. With CHARTS_BACKEND=auto, Rox detects the extension at startup and picks the right backend. Small instances stay on plain PostgreSQL; larger operators get TimescaleDB efficiency. An optional timescaledb Docker Compose profile is included too.

A better deck

Fixed the momentary slide on appear (rc.1)

Opening the deck (multi-column view) briefly slid the content to the right and back. The horizontal scroll container used scroll-smooth, which animated the on-mount scroll-position reset. Making horizontal scrolling instant fixed it.

Rebuilt the mobile swipe as a native scroll-snap carousel (rc.2)

The mobile deck used to render a single column and drag it via custom touch handling, snapping on release — the neighboring column didn't follow your finger, so it felt off. In rc.2 we replaced it with a native CSS scroll-snap carousel. The browser now handles finger-following swipe, momentum, snapping, and axis locking (vertical scroll within a column vs. horizontal swipe between columns). Horizontal overscroll no longer triggers the browser's back/forward navigation. The result feels much closer to a native app.

For self-hosters: container images and Kubernetes

Backend and frontend container images are now published to GHCR (ghcr.io/love-rox/rox-backend, ghcr.io/love-rox/rox-frontend), and a ready-to-use K3S / Kubernetes manifest set lives under deploy/k8s/rox/ (namespace, in-cluster TimescaleDB, Dragonfly, nginx, and a backend with a migration init container).

We actually moved our own official instance (rox.love-rox.cc) onto this setup — from bare metal to K3S with in-cluster TimescaleDB — with auto-updates rolling out as new versions ship. These deployment additions are optional and don't change the traditional install.

Upgrade notes

  • Includes database migration 0014 (rc.1): it adds the chart_snapshots table. Run bun run db:migrate when upgrading. There are no new migrations from rc.1 to rc.2.
  • No breaking changes. Charts are off by default.
git pull origin main
bun install --frozen-lockfile
bun run db:migrate    # applies migration 0014
bun run build

Wrapping up

Since this is a release candidate, we'd love feedback — on the charts and on how the new mobile swipe feels. We'll polish toward the stable v2026.7.0.

Feedback and bug reports are welcome on GitHub Issues.

The Love Rocks. Rox. 🚀