Loomis
Getting started

Requirements

The machine, the accounts and the keys, and which of them are genuinely optional.

Four things are needed to run this, and two of them are optional. The list is short on purpose: there is no message queue to operate, no worker fleet, no container registry, and no SaaS of ours in the middle.

Needed forWhere it comes from
Node 22.6 or newerRunning the app. Nothing else works without itnodejs.org, take the LTS
A Convex deploymentThe database, the functions, the accountsconvex.dev, free to start
A mail providerOptional. Confirmation codes and resetsresend.com, or any SMTP you prefer
A model providerOptional at first. Real answersThe Vercel AI Gateway, or a key from a provider you already have

Node, and the version floor

The app is built against Node 22.6 or newer. That floor is not arbitrary: the installer scripts and the configuration walk in scripts/ are TypeScript that Node runs directly by stripping the types, which is what 22.6 added. An older Node refuses them by name, and the installer says so rather than failing somewhere stranger later.

# With Homebrew
brew install node

# Or check what is already there
node --version

If the answer is lower than v22.6.0, install the current LTS from nodejs.org instead. Two Nodes on one machine is a common cause of "the installer says it is too old".

Convex, which is the backend

Convex is where the schema, the functions, the scheduled work and the accounts live. It is the one dependency that is not optional, and it is also the one that is easiest to get right: npx convex dev signs in to your account, creates a development deployment, writes NEXT_PUBLIC_CONVEX_URL for you, and prints the address the app needs.

You can stay on the free tier while you set everything up. Moving to a paid tier later is a change on Convex's side, not a migration in this app.

One deployment per installation, at least

A development deployment and a production deployment are two different places with two different environments. That is deliberate and useful: try a change against the first, then push it to the second with npx convex deploy. See Convex, set up properly.

Resend, which is optional until somebody needs a code

Every account flow that sends mail, which is confirmation, password reset and anything the support inbox answers with, goes through RESEND_API_KEY and EMAIL_FROM. Without them those messages are not sent, and the app says so instead of pretending.

Two things about mail that catch people out, both of which are on the variable pages:

  • The sending domain has to be verified at the provider, or the messages are refused.
  • EMAIL_FROM has to be an address on that verified domain, written as Name <address@domain>.

A model provider, which is optional at first

Without a model key the assistant still answers, over the real streaming path, with canned words. That is deliberate: the whole product can be seen, clicked through and evaluated before anybody pays for tokens. The moment you want a real answer, add a key in Intelligence → Providers & keys, or point the app at the Vercel AI Gateway.

See Model keys.

Hosting, when you are ready

Two decisions rather than one, because the app and the backend are separate.

PieceWhere it runsWhat it needs
The appAnywhere that runs Node: a small VPS, a platform, a home machinepnpm build, then pnpm start
The backendConvex's own infrastructure, pushed to with npx convex deployThe twelve deployment variables

There is no background worker to run, no cron of yours to configure, and no file system the app must own except the folder it lives in. Running it for real covers certificates, the reverse proxy, and the two addresses that have to be right.