Releases and security

Contents

Versions

Read from Runique's Cargo.toml at each release.

ItemVersion
Rust (minimum)1.94
Rust edition2024
axum0.8.9
tower0.5.3
tower-http0.7.1
tower-sessions0.15.0
tokio1
sea-orm2.0.4 (pinned: use exactly this one)
sea-orm-migration2.0.4 (pinned: use exactly this one)
sea-query1.0.1
tera2.1
serde1.0
chrono0.4.45
uuid1.29.1
argon20.6
lettre0.11.22

Tested engines

The test suite runs on these engines (images from docker-compose.yml).

EngineTest image
PostgreSQLpostgres:16-alpine
MariaDBmariadb:11
SQLitein memory, bundled

Compatibility

The page's Versions and Tested engines tables are generated from Cargo.toml and docker-compose.yml. This file only holds the part written by hand.

Defaults

What Runique does without any setting on your side. Each value can be changed, on the page given.

ItemDefaultPage
Template escaping (Tera)on for .html and .xml; {{ var }} is always escaped, except with the safe filterTemplate syntax
CSRFrequired for every method but GET and HEADCSRF
CSPdefault-src 'none', script-src 'self', style-src 'self' 'unsafe-inline'CSP
Anonymous session5 minutes of inactivity, in memory onlySessions
Logged-in session24 hours of inactivity, also stored in the databaseSessions
LoginGuard5 attempts, then 5 minutes locked outLoginGuard
RateLimiter60 requests per minute, on the routes it is attached toRate limit
Passwordshashed with Argon2Passwords
Request sizeform and JSON: 2 MB read into memory; file uploads: 100 MB (RUNIQUE_MAX_BODY_MB)Assets and media

Good practices

  • Use exactly the SeaORM version pinned above in your project and in its migration/ crate: runique new writes it for you.
  • Generate migrations in development (runique makemigrations), commit them, and only run migration up in production.
  • Test on your production engine, not only on SQLite: some behaviours (time zones, text case, foreign-key indexes) differ from one engine to another.
  • On MySQL and MariaDB, back the database up before each migration up: a CREATE or an ALTER is never rolled back there.

To avoid

  • Mixing another SeaORM or sea-query version into the same project: the types would no longer match.
  • Running runique makemigrations in production.
  • Writing raw SQL where search!, search_cond! or SeaORM's methods do the job: the ? placeholder breaks Postgres.
  • Putting | safe on a value that comes from a visitor.