Sell the AI inference of your own computer on Inferit, the peer-to-peer market for AI inference. The app finds the model server on your machine, matches its models to the Inferit catalog and dials out to the market, so a laptop or a home PC can sell with no open port and no domain.
Status: Inferit is a testnet demo on Whitechain Sepolia. Buyers pay in Inferit Test Credit (ITC), a test token with no monetary value. The contracts are not audited.
- Finds your model server. Ollama on port 11434, LM Studio on 1234, vLLM on 8000 and the llama.cpp server on 8080.
--upstreamnames another OpenAI-compatible server. - Matches your models to the market's list. It reads the market's model list (
GET /v1/models: each model's id and aliases) and maps local names to catalog ids, for exampleqwen2.5:14b-instructtoqwen/qwen-2.5-14b-instruct. A chat model the market does not list yet is reported as "not in the catalog yet: list it in the Sell workspace": once you list it there (any open-weight model with a licence that allows paid serving), the app maps it and serves it without a restart (0.3.3+). Models sellers listed match by their exact id or alias only. - Dials out. One WebSocket to the market (
wss://…/v1/seller/connect), with your node token in theAuthorizationheader. Requests come down that socket, so you need no open port, no domain, no certificate and no reverse proxy. A home router, NAT or a VPN is fine. - Serves through a local proxy. Each request goes to a proxy on
127.0.0.1that renames the model for your server and streams the answer back unchanged. - Keeps Ollama's model loaded. Ollama unloads an idle model after 5 minutes by default; the app asks it every 4 minutes to keep the models it sells loaded, so the market's health check finds them ready (
INFERIT_KEEP_WARM). - Keeps running.
install-servicestarts it at login and restarts it if it stops (a macOS LaunchAgent, a Linux systemd user unit or a Windows scheduled task). After sleep or a network change it reconnects on its own, and with no market session for 10 minutes it exits so the service starts a fresh process.
You need Node.js 20 or newer (node --version) and a model server.
1. Run a catalog model on your computer. With Ollama:
ollama pull qwen2.5:14b-instructOr load a model in LM Studio and start its local server (Developer tab, Start Server). The catalog is at https://api-production-c74b9.up.railway.app/v1/models.
2. Add the machine in the Sell workspace. Open inferit.app/sell, sign in with your wallet, choose Add a machine and name it. The page shows one command with your node token (icn_…) in it. The token is shown once: copy the command now.
3. Run the command. On macOS or Linux:
npx -y inferit-seller connect --token icn_… && npx -y inferit-seller install-serviceOn Windows, in PowerShell (npx.cmd, because PowerShell's default policy refuses to run npx's script form, and if ($?) because Windows PowerShell 5.1 has no &&):
npx.cmd -y inferit-seller connect --token icn_…; if ($?) { npx.cmd -y inferit-seller install-service }connect checks the token with the market and saves it to ~/.inferit-seller/config.json, readable by you only. install-service copies the app to ~/.inferit-seller/app and starts it in the background.
4. Check it.
npx -y inferit-seller status
npx -y inferit-seller doctordoctor checks the model server, the catalog match, the market, the token and the service, and says how to fix what is wrong. In the Sell workspace the machine shows as online, with the models it found.
5. Set your prices. In the Sell workspace, set a price for each matched model, in dollars per 1M input and output tokens. The market stores prices in µ (micro-dollars): $1 per 1M tokens is 1 000 000 µ. Buyers pay your price plus the 5% platform fee: an ask of 70 000 µ per 1M input tokens ($0.07, in test dollars on the testnet) is 73 500 µ to the buyer. You are paid per request to the payout wallet you register (test ITC on the testnet).
To install it for good instead of through npx: npm install -g inferit-seller, then run inferit-seller directly. The npm package is published from this repository by the npm account inferit; to run straight from the source instead, use npx -y github:InferitAI/inferit-seller <command>.
| Command | What it does |
|---|---|
connect --token <icn_…> [--api <url>] [--name <name>] [--upstream <url>] |
Checks the token with the market and saves it to ~/.inferit-seller/config.json (mode 0600). --name is this machine's name in the hello (default: the hostname). |
start [--upstream <url>] |
Runs in the terminal: finds the server, maps the models, connects. Stop with Ctrl+C. |
install-service [--keep-awake] [--dry-run] |
Runs it in the background, at every login, restarted if it stops. --keep-awake keeps the computer from sleeping while it runs (macOS, Linux). --dry-run prints the service file and the commands and changes nothing. |
uninstall-service |
Stops the service and removes its file. The token stays in the config. |
status [--json] |
The token (its first characters only), the service, the market connection, the servers found and how each model maps. |
doctor [--json] |
Every check, with a fix for each problem. Exits 1 while something must be fixed. |
--version, --help |
Where the service lives:
| System | Service | Logs |
|---|---|---|
| macOS | ~/Library/LaunchAgents/cc.inferit.seller.plist (RunAtLoad, KeepAlive) |
~/.inferit-seller/logs/seller.log |
| Linux | ~/.config/systemd/user/inferit-seller.service (Restart=always) |
journalctl --user -u inferit-seller -f |
| Windows | Task Scheduler task InferitSeller (at logon, restarted if it stops) |
%USERPROFILE%\.inferit-seller\logs\seller.log |
docker run -d --restart unless-stopped --name inferit-seller -e INFERIT_TOKEN=icn_… \
--add-host=host.docker.internal:host-gateway ghcr.io/inferitai/inferit-sellerThe container looks for the model server on host.docker.internal. On Linux, Ollama listens on 127.0.0.1 by default, which a container cannot reach that way. Run the container on the host's network instead, so Ollama stays on loopback (it has no authentication, so do not open it to the network with OLLAMA_HOST=0.0.0.0):
docker run -d --restart unless-stopped --name inferit-seller -e INFERIT_TOKEN=icn_… \
--network host -e UPSTREAM_BASE_URL=http://127.0.0.1:11434/v1 ghcr.io/inferitai/inferit-sellerCheck it with docker exec inferit-seller node /app/dist/cli.js status.
The saved config covers most machines. Environment variables override it:
| Variable | Meaning |
|---|---|
INFERIT_TOKEN (or CONNECT_TOKEN) |
The node token (icn_…). |
INFERIT_API_URL |
The market (default https://api-production-c74b9.up.railway.app). CONNECT_URL sets the socket URL directly. |
NODE_NAME |
This machine's name in the hello. |
UPSTREAM_BASE_URL, UPSTREAM_API_KEY |
Use this server instead of finding one, and the key it needs. |
MODEL_MAP |
Your own mapping instead of the automatic one: catalogId=localName pairs or a JSON object. |
MODEL_META |
Per model, the context and quantisation you serve: {"qwen/qwen-2.5-14b-instruct":{"maxContextTokens":32768}}. |
INFERIT_DETECT_HOSTS |
Hosts to look for servers on (default 127.0.0.1; the Docker image uses host.docker.internal). |
INFERIT_WATCHDOG_MINUTES |
Under the service or in Docker, exit after this long without a market session so a fresh process starts (default 10; 0 turns it off). In a terminal, start only logs a warning and keeps trying, unless you set this. |
INFERIT_KEEP_AWAKE=1 |
Keep the computer awake while the app runs (macOS, Linux). |
INFERIT_KEEP_WARM |
Ollama only, on by default. Every 4 minutes the app asks Ollama to keep each model with an offer loaded for 10 more minutes (POST /api/generate with the model and a keep_alive, no prompt). At start it waits for that load before it connects, so the market's first health check finds the model loaded. The model stays in memory while the app sells. 0 turns it off; a keep-alive such as 30m or 2h replaces the 10 minutes. LM Studio, vLLM and the llama.cpp server do not unload a model after a few idle minutes, so the app sends them nothing. |
INFERIT_SELLER_HOME |
Where the config, the state and the logs live (default ~/.inferit-seller). The background service is one per user account: status and doctor say when it runs another folder, and install-service and uninstall-service refuse to replace or remove it from here. |
CONNECT_MAX_CONCURRENCY |
Requests served at once (default 4). |
LOG_LEVEL |
info by default; debug shows every reconnect. |
The computer sleeps. While it sleeps it cannot sell: the market marks it offline and sends buyers to other sellers. When it wakes, the app reconnects; if it cannot within 10 minutes, it exits and the service starts it again. To keep it awake while the app runs, use install-service --keep-awake.
Shows unhealthy after idle. Ollama unloads a model after 5 idle minutes by default, and loading a 14B model again can take a minute on a laptop. The market's health check gives up after about 15 s, so a check that comes after an idle spell fails and the market marks the machine unhealthy. The app keeps each Ollama model it sells loaded while it runs (INFERIT_KEEP_WARM, on by default), and status and doctor show the last cold-load time. If you turn keep-warm off, set OLLAMA_KEEP_ALIVE for the Ollama server instead (for example 1h, or -1 to keep models loaded) and restart Ollama. The log line "request cancelled by the market before the server answered (model loading?)" means a request waited for a load.
Laptop on battery. Keep it plugged in. On battery a laptop sleeps when you close the lid and shuts down when the battery runs out, whatever the app does, and a sleeping or shut-down computer cannot sell: the market sends its buyers to other sellers until it is back.
After a reboot. The service starts at login. On Linux, install-service also runs loginctl enable-linger, so it starts at boot without a login; if that needs an administrator, it prints the command.
List any open model. A chat model the market does not list yet shows as "not in the catalog yet". Any open-weight model whose licence allows paid serving can be listed: in the Sell workspace, open your machine's models, choose List this model beside it, check the Hugging Face repo (filled in when the local name says it), the name, the context and the licence, then set your price. The app hears about the new model from the market, maps your local name to it and serves it, with no restart (0.3.3 or newer; restart an older app). The market refuses gated, private, non-commercial and closed models, and a name that is a catalog model: list an offer on the catalog model instead, and set MODEL_MAP if your server names it differently. With MODEL_MAP set, the app serves only what it names.
Long prompts are cut. Ollama often serves a smaller context than the model allows (4096 tokens in many versions) unless told otherwise, and it says which only while the model is loaded; the app reads it again every minute and tells the market. A listing's context limit must be at most what your server serves: the Sell workspace's form fills it in, and doctor warns when a listing accepts longer prompts than the server serves. To sell longer prompts, set OLLAMA_CONTEXT_LENGTH (for example 32768, as memory allows) for the Ollama server, restart Ollama, then raise the listing's limit (Sell workspace, Offers, Edit). A longer context takes more memory: if the model no longer fits, Ollama runs part of it on the CPU and answers more slowly.
The token is refused. doctor shows the market's reason. A revoked or unknown token: add the machine again in the Sell workspace and run the new command. "Not registered as a seller": finish seller registration in the Sell workspace (it registers your payout wallet on chain); the app connects once it is done.
One token, one machine. Two copies with the same token replace each other on the market; each logs a warning and waits longer between tries, so neither serves reliably. start refuses to run next to a running copy on the same computer; on another machine or in Docker, stop one copy or add that machine with its own token.
Why no port or domain? The app opens the connection to the market, the way a browser does, so the market never connects to your computer. A home router, NAT or a VPN does not matter.
What the market sees. The hello carries this machine's name, the app's version, the operating system, the models it serves and the models it found. The token goes only in the Authorization header. The app never logs prompts or answers. The seller that serves a request does see it: that is you, for requests your machine serves.
This repository is the apps/seller-node package of the Inferit market. With Node 20 or newer:
npm ci
npm test
npm run typecheck
npm run build # dist/, also run by npm's prepare step
node dist/cli.js doctor