What you need
- A Threadify license. Get one when you sign up.
- A PostgreSQL database, and credentials that can create tables in it.
- A hash-chain secret. Generate it once with
openssl rand -hex 32and store it somewhere safe. Threadify uses it to sign history, so you need the same value every time the Engine starts.
Install
threadify binary,
and writes a config.yaml template. It never overwrites a config file you’ve
already edited, and it doesn’t start the Engine. Releases are available for
macOS (ARM64), Linux (AMD64) and Windows (AMD64, using Git Bash).
Configure
Edit the installed template, or save this asconfig.yaml:
$ are read from the environment. Set them and start the
Engine:
sslmode=require) instead of sslmode=disable.
Configuration files from earlier releases keep working. You don’t need to
change them to upgrade.
--config, the Engine uses CONFIG_PATH, then looks for
config/config.yaml relative to where it’s started. Pass --config explicitly
in service definitions so the Engine always finds the same file.
Run with Docker
The image includes the same template at/app/config/config.yaml, already
wired to these environment variables. Create threadify.env:
- Pin a version tag instead of
latestso upgrades happen when you choose. - The image is built for Linux AMD64.
- Inside a container,
localhostmeans the container itself. Use a hostname the container can reach for your database. - To use your own config file, mount it at
/app/config/config.yaml. - The image runs as UID/GID 65532. Bind-mounted directories must be writable by that user.
Put it behind HTTPS
Locally, openhttp://localhost:8081. For a shared deployment:
- Route your HTTPS hostname to the Engine port. Serve it at the root of the hostname (not under a path), and forward WebSocket upgrades.
- Set both
server.public_urlandserver.browser_originto that address, for examplehttps://threadify.example.com.
browser_origin must exactly match the address people type into their browser,
or browser sign-in will fail. Locally, pick either localhost or 127.0.0.1
and use it consistently; browsers treat them as different sites.
Administrators can change the public URL later in Settings → Engine. That
change applies immediately. Changes to config.yaml need a restart.
Keep your data
The Engine keeps live run state in Valkey and history in PostgreSQL. Back up PostgreSQL as you normally would, and keep the Engine’s data directories on persistent storage:
Losing the Valkey data loses runs that are in progress and any outstanding
execution grants.
Keep your hash-chain secret too. When you rotate it, add a new version (
v2)
and switch hash_chain_current_version, but keep the old one in the config.
Older history can only be verified with the secret
it was signed with.
External Redis or Valkey
REDIS_URL. Use rediss:// for TLS and redis:// without it,
and URL-encode special characters in the password.
Running more than one Engine
Replicas must share the same PostgreSQL database, the same Redis/Valkey server, and an external NATS server. Engines that each start their own NATS don’t share work, so don’t run replicas with the built-in broker.threadify --mode engine and threadify --mode writer. Both need external NATS.
Optional AI agent
The Engine includes an AI assistant for the dashboard. It’s off unless you start the Engine with--with-agent and configure a model. See
AI assistant.