Limitations
Rivet is experimental. This page collects the current gaps in one place.
Platform
- Managed hosts must run Ubuntu 24.04 on x86_64 or ARM64 with systemd. Applying changes requires root.
- There are no packaged releases. Build from source; to drive Linux hosts over SSH from a Mac, also build a Linux binary yourself. See installation.
Language
- No variable
validationblocks,--varflag, or environment-variable inputs. Variable files and data hierarchies are never discovered automatically; pass them with--vars-fileor--data-hierarchy. - Variable defaults must be integers, not fractions. Fractional numbers work in expressions.
- These Terraform functions are excluded because they depend on the clock, randomness, or the home directory:
timestamp,plantimestamp,uuid,bcrypt,pathexpand. Also excluded:ephemeralasnull,type, the deprecatedlistandmap, andprovider::namespaced functions. See functions. - There is no cron resource. Use timers.
Releases and agents
- Releases include only the top-level
*.hclfiles and resource assets. Modules, extra files read byfile()ortemplatefile(),--vars-file, and data hierarchies are not supported there, so variables need defaults. Use directrivet compilewhen you need those features. - Releases are not signed. Anyone who can write to the storage bucket can change what hosts receive.
- There is no secret lookup service, certificate issuance or renewal, staged fleet rollout, cache quota, or garbage collection of old releases and cached files.
Compatibility
- Bundles, the configuration language, journals, and the SSH runner protocol each have exactly one supported version. Other versions are refused, never migrated. There is no backward-compatibility promise yet.
- Plugins are pinned by exact implementation identity, so changing a plugin release means recompiling.
By design
These are deliberate, not gaps:
- No rollback or host-wide transaction. Each resource is applied and verified individually. A failure blocks dependent resources; unrelated ones continue. See plan and apply.
- Refreshes are delivered at least once. After an interrupted run, a restart or refresh-only command can run again. See recovery.
- Removing a declaration doesn’t remove the object. Deleting a resource from your configuration stops managing it. To remove something from the host, declare it with
ensure = "absent". - Sensitive values are redacted, not encrypted. Bundles contain secrets in plain text; protect them like the secrets themselves. See bundles.
- Commands are not sandboxed. Exec commands, guards, and file validators run with the runner’s authority. Review configuration as you would any root-level script.