Pixapixa.org — developer resources

Run a
Pixagram node

Witnesses sign the blocks. API nodes answer the app. This guide takes an empty rented server to either or both, one command at a time, and assumes you have never done this before.

Block 25,400 was signed a moment ago by rex. 5 witnesses are producing, the chain weighs about 4 MB, and the median price feed puts one PXS at 51 PIXA. Snapshot of 5 September 2026, 09:40 UTC. Live figures load from api.pixagram.com when the page can reach it.

Contents

What you are about to run

Pixagram is a fork of Hive. The chain closes a block every three seconds, and each block is signed by one of up to 21 servers called witnesses, in a shuffled order. Twenty of those seats go to the witnesses with the most stake-weighted votes; the twenty-first rotates among everyone else. While fewer than 21 witnesses exist — five at the time of writing — every registered witness with a valid signing key is scheduled, votes or not.

There are two kinds of node, and they are very different in size.

Witness nodeAPI node
JobValidates every block and signs one when its turn comes. Publishes a price feed.Keeps the full history in a database and answers the app: feeds, profiles, balances, posts.
Runs2 containers: hived and the price feed9 containers: hived, HAF (hived + PostgreSQL), Hivemind, Jussi, Caddy
Measured footprintabout 1.5 GB RAM, 0.4 GB disk5.4 GB RAM, 5 GB chain data, ~15 GB with images, 0.2 vCPU idle
Recommended server2 vCPU, 4 GB, 50 GB SSD4 vCPU, 16 GB, 100 GB SSD
Needs a domainNoYes, for the certificate
Open ports2001 (peers)80, 443 (users), 2001, 2002 (peers)
Who talks to itOther nodes onlyEveryone using the app

Why run both

A witness alone is legitimate: the network accepts it, schedules it and pays it. But the app only works through API nodes, and today most of that load sits on a handful of them. A public API node costs about as much as a mid-range VPS, and the witness pay covers it many times over. If you can run one server, run a witness. If you can run two, make the second an API node and put its address on your witness page.

What a witness earns

Every block a witness signs pays it VESTS — PIXA staked in the account — straight away. At the time of writing one block pays 0.588 VESTS. 5 witnesses share 28,800 blocks a day, so each signs about 5,760 and receives about 3,400 VESTS a day. The price feed values PIXA at a reference of 0.12 USD, so you can do the conversion yourself. Pay per block falls as more witnesses join (with the full 21, a top-20 seat comes to roughly 160 VESTS a day) and inflation narrows every 250,000 blocks, so treat these as today's figures, not a promise. VESTS become liquid PIXA through a power-down paid in 13 weekly instalments.

Where to put it

Pick the region and the provider that nobody else picked. Today's witnesses sit in Warsaw, Singapore, France and Iowa. A chain is exactly as resilient as its least correlated failure: if six witnesses rent from the same company in the same city, one incident at that company — a fire, a routing mistake, a court order, a sanctions list — silences a third of the schedule at once. Spread across continents, providers and jurisdictions, the same incident costs one seat.

Distance matters twice. The app is only as quick as the nearest API node, so a node in South America or Africa improves the experience of everyone there. And a block signed in Singapore has to reach the next producer within its three-second slot; a network with witnesses on every continent keeps that path short for everyone.

Against denial-of-service, diversity is also the cheapest defence: an attacker can saturate one address, not a dozen behind different networks. Publish your API behind your provider's filtering if it offers one, and keep the witness itself quiet — nothing open but its peer port, and no reason for anyone to know its address.

How big a server

The figures above were measured on production nodes of the pre-launch network at 1.75 million blocks. The calculator below starts from the chain as it is now, and extrapolates along the only reference we have for a Hive chain at scale — Hive itself, whose block log is a few hundred gigabytes, whose witnesses run 32 GB machines and whose API nodes need 64–128 GB and several terabytes of NVMe. Drag the slider to the size you want to be ready for; the recommendation is a comfortable minimum, not a ceiling.

Chain size (block log) to plan for
4 MB
Today the chain is about 4 MB and grows about 5 MB a day at the current pace.
today

Witness node

Processor2 vCPU
Memory4 GB
Disk50 GB SSD
Network100 Mbit/s, 5 TB/month or unmetered
Indicative price5–12 € a month

Prefer few fast cores over many slow ones: hived does its consensus work on one thread, and a stalled core is a missed block.

API node

Processor4 vCPU
Memory16 GB
Disk100 GB NVMe
Network1 Gbit/s, 10 TB/month or unmetered
Indicative price20–45 € a month

PostgreSQL wants NVMe once the database outgrows RAM. Below 24 GB you retune it in one file (step 8).

Bandwidth, and why the numbers are small

Blocks are at most 256 KiB — the size the witnesses currently vote — and there is one every three seconds. Your node downloads each block once, from whichever peer offers it first, and forwards it to the peers that do not have it yet; hived aims for about twenty peer connections. In the worst case, with every block full, that is 85 KB/s in and up to 1.7 MB/s out: about 220 GB inbound and 4.4 TB outbound a month. Today the blocks are nearly empty and a node moves a few megabytes a day. Any plan with a 100 Mbit/s port and a few terabytes of monthly traffic — or unmetered traffic — is fine for a witness. An API node also serves users, so take a gigabit port and ten terabytes or more.

Storage grows in step: an empty block costs about 160 bytes on disk, a full one 256 KiB, so the chain adds between 1.7 GB and 2.7 TB a year depending on how much people post. Buy the disk for the year you are in; resizing a cloud volume later is a routine operation.

Words you will meet

VPS
A virtual private server: a slice of a machine in a data centre, rented by the month, with its own public IP address. A dedicated server is the whole machine.
SSH
Secure Shell, the encrypted terminal you use to type commands on the server from your own computer. You log in with a key pair, not a password.
Docker
Software that runs programs in isolated packages called containers, so the node and everything it needs arrive prebuilt as one image. Docker Compose starts a set of containers from one file, docker-compose.yml.
hived
The blockchain program itself. It talks to peers, validates blocks and, when configured as a witness, signs them.
Peer, seed
Nodes exchange blocks over port 2001 (P2P). A seed is a well-known node you connect to first: api.pixagram.com:2001.
Witness
An account that has registered a block-signing key and a URL on chain, and the node that signs for it. Missed block: your slot passed without your block; the count is public and permanent.
Keys
Every account has an owner key (recovery, keep offline), an active key (money and witness operations), a posting key (social actions) and a memo key. A witness adds a separate signing key that lives on the server and signs only blocks. Private keys are written in WIF form and start with 5; public keys start with PIX.
Price feed
A price each witness publishes, saying how many PIXA one PXS is worth. The chain uses the median of all feeds. Pixagram's convention: one PXS is worth one Big Mac.
PIXA, PXS, VESTS
PIXA is the liquid coin, PXS the stable unit, VESTS the staked form of PIXA — what witness pay arrives in.
Block log
The file that is the chain: every block since genesis. Never delete it on a node you intend to keep.
Shared memory
shared_memory.bin, hived's working state, derived from the block log. Delete it and a replay rebuilds it by re-reading the block log — slow but safe.
HAF, Hivemind
HAF is a hived paired with PostgreSQL that records every block in a database. Hivemind reads that database and serves the social API — feeds, follows, communities.
Jussi, Caddy
Jussi routes each API request to hived or Hivemind and translates field names. Caddy sits in front, terminates TLS and fetches your certificate automatically.
JSON-RPC
The request format the app uses: an HTTPS POST with a small JSON body naming a method. Every example in this guide is one.
DNS, A record
The entry at your domain registrar that maps a name such as api.example.com to your server's IP address.
TLS, Let's Encrypt
The encryption behind https://. Let's Encrypt issues the certificate for free; Caddy asks for it and renews it, provided ports 80 and 443 are reachable.
ufw, firewall
Rules that decide which ports accept connections. Your provider usually offers a firewall outside the server as well — use both.
chmod 600
Make a file readable by its owner only. Every file that holds a private key gets this.
LIB
Last irreversible block: the newest block that enough witnesses have built on that it can no longer be reverted, normally about 20 blocks behind the head.

1Rent the server

Any cloud or hosting provider will do — Hetzner, OVH, Scaleway, DigitalOcean, Vultr, Linode, Contabo, Oracle, AWS, and hundreds of regional ones. Prefer one and a region that the current witnesses do not use. When you order, choose:

  • Ubuntu 24.04 LTS (Debian 12 also works) on x86-64 / amd64. The published images are built for amd64 only; ARM instances will not run them.
  • Size from the calculator above. SSD or NVMe, never a spinning disk.
  • A public IPv4 address. Some providers charge a little extra or default to IPv6 only; peers need IPv4.
  • Your SSH public key instead of a root password. Generate one on your computer first if you have none:
# on your own computer (macOS, Linux, or Windows PowerShell)
ssh-keygen -t ed25519
cat ~/.ssh/id_ed25519.pub          # paste this line into the provider's "SSH key" box

Most providers also offer a firewall or "security group" in their control panel, sometimes as checkboxes named allow SSH, allow HTTP, allow HTTPS. Turn it on and allow only what the node needs. It filters traffic before it reaches your machine, which matters later: Docker publishes ports past the server's own firewall.

PortWitness nodeAPI nodePurpose
22/tcpyes, your IP only if possiblesameSSH
2001/tcpyes, from anywhereyeshived peers
2002/tcpnoyesHAF node peers
80, 443/tcpnoyesthe public API and its certificate
everything elseclosedclosedports 7777–7779 and 8092 stay local

2Log in and harden

The provider shows you the server's IP address. From your computer — the white boxes in every command are the values you replace with your own:

ssh root@SERVER_IP            # some providers use ubuntu@ or debian@ instead of root@
apt update && apt -y upgrade && apt -y install git curl nano ufw
adduser pixa && usermod -aG sudo pixa
rsync --archive --chown=pixa:pixa ~/.ssh /home/pixa   # your key now works for user pixa too

Now close the doors you do not need. Passwords off, root login off, then the firewall — port 2001 is what the chain uses to reach you.

sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/; s/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart ssh
ufw allow OpenSSH
ufw allow 2001/tcp
ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 2002/tcp   # API node only — skip these three on a witness
ufw --force enable

Open a second terminal and check that ssh pixa@SERVER_IP works before you close the first one. If it does not, you still have a session to fix it from.

The clock is not optional. Blocks carry timestamps and your slot is a three-second window; a clock off by a few seconds means missed blocks with no other symptom. Check it, and install a time daemon if it is not synchronised:

timedatectl                          # look for "System clock synchronized: yes"
apt -y install chrony                # only if it said no
apt -y install unattended-upgrades   # security patches on their own; kernel updates still need a reboot you schedule

From here on, work as pixa (ssh pixa@SERVER_IP) and put sudo in front of the commands that need root.

3Install Docker

Docker's own installer sets up the engine and the Compose plugin from its official repository:

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker pixa
exit                                  # log out and back in so the group applies
docker compose version               # prints a version: you are ready
docker run --rm hello-world          # optional: proves containers start

Two commands do almost everything from now on: docker compose up -d starts (or restarts changed) containers in the background, and docker compose logs -f NAME follows what one of them prints. Press Ctrl+C to stop following; the container keeps running.

4Account and keys

A witness is an ordinary Pixagram account with two extra things registered on chain: a URL and a block-signing key. Create the account in the Pixagram app if you have none, and save its keys somewhere that survives a lost laptop — a password manager, and a copy on paper.

KeyUsed forWhere it lives
OwnerChanging the other keys, account recoveryOffline. Never on a server.
ActiveMoney, registering the witness, publishing the price feedYour password manager, and the price-feed .env file
PostingPosting, voting, followingThe app
MemoEncrypting transfer memosThe app
Block signingSigning blocks — nothing elseconfig.ini on the witness server; its public half goes on chain

The signing key is a fresh pair you generate now. The image ships a wallet that does it offline — nothing is sent anywhere:

docker run --rm -it --entrypoint /home/hived/bin/cli_wallet pixadock/pixagram:mainnet -o
# at the "new >>>" prompt, type:
suggest_brain_key
# {"brain_priv_key": "…", "wif_priv_key": "5K…", "pub_key": "PIX7…"}
quit

wif_priv_key goes into config.ini in the next step; pub_key goes on chain in step 6. Keep both, and the brain key, with your other keys.

The two keys people mix up

The signing key signs blocks and lives in pixagram/config.ini. The active key signs the price feed and lives in .env. They are different keys; putting the active key in config.ini produces no blocks, and putting the signing key in .env produces no feed. Whoever holds the signing key can produce blocks as you — or fail to, until your witness is disabled. Whoever holds the active key can move your funds. Both files get chmod 600, neither is ever committed to git or pasted into a chat.

5Start the witness

The witness repository is a ready-made Compose stack: hived with the four plugins a producer needs, and the price feed. Clone it, then fill in two files.

git clone https://github.com/pixagram-blockchain/witness.git
cd witness
nano pixagram/config.ini

Near the end of config.ini two lines are commented out on purpose. Remove the # and fill them in — they ship disabled because hived crashes on an empty private-key rather than starting without one:

witness     = "your-account"
private-key = 5K…the wif_priv_key from step 4

Save with Ctrl+O, Enter, leave with Ctrl+X. Then the feed's file, and the permissions:

cat > .env <<'EOF'
WITNESS_ACCOUNT=your-account
WITNESS_WIF=5J…your ACTIVE key
EOF
chmod 600 .env pixagram/config.ini
docker compose up -d
docker compose logs -f pixagram

The first container fixes file ownership, then hived connects to api.pixagram.com:2001, downloads the chain and replays it. With a young chain this takes minutes; later it will take hours. You are synced when the log says entering live mode and then prints a line every three seconds as blocks arrive. Until step 6 is done the node will not be scheduled, and the feed container logs one error an hour because the account is not yet a witness — both are expected.

Two settings the bootstrap node used must stay absent here: enable-stale-production and required-participation = 0. They let a lone node produce on a chain it knows is stale; on a live network they remove the checks that keep you from producing during a split. The shipped file does not contain them. Leave it that way.

6Register on chain

Registration is one operation, witness_update, signed with your active key. It tells the chain your URL, your signing public key and three properties you vote on. Do it after step 5 shows entering live mode: from the moment you register you are scheduled, and a node that is still syncing misses its slots.

FieldWhat to put
urlA page about your witness: who you are, where the node runs, how to reach you. Required, cannot be empty. A Pixagram post works.
block_signing_keyThe pub_key from step 4, PIX…
account_creation_fee0.001 PIXA — the current median. The minimum the chain accepts is 0.001.
maximum_block_size262144 — the current median (256 KiB). Anything from 131072 up is valid.
pxs_interest_rate0. Pixagram pays no interest on PXS and rejects any other value.

The easiest signer is a ten-line Node.js script using Pixagram's client library. Node 20 or newer is fine, on the server or on your computer.

mkdir ~/witness-tools && cd ~/witness-tools
npm init -y >/dev/null && npm install @pixagram/dpixa@1.5.4
nano register-witness.js
// register-witness.js — run once, and again whenever the URL, key or properties change
const { Client, PrivateKey } = require("@pixagram/dpixa/dist/dpixa.js");

const ACCOUNT     = "your-account";
const SIGNING_PUB = "PIX7…pub_key from step 4";
const URL         = "https://pixagram.com/@your-account/my-witness";
const ACTIVE_WIF  = process.env.ACTIVE_WIF;      // passed on the command line, never written here

const client = new Client(["https://api.pixagram.com"]);
const ops = [
  ["witness_update", {
    owner: ACCOUNT, url: URL, block_signing_key: SIGNING_PUB,
    props: { account_creation_fee: "0.001 PIXA", maximum_block_size: 262144, pxs_interest_rate: 0 },
    fee: "0.000 PIXA",
  }],
  ["account_witness_vote", { account: ACCOUNT, witness: ACCOUNT, approve: true }],   // vote for yourself
];

client.broadcast.sendOperations(ops, PrivateKey.fromString(ACTIVE_WIF))
  .then(r  => { console.log("broadcast, transaction", r.id); return new Promise(ok => setTimeout(ok, 9000)); })
  .then(()  => client.database.call("get_witness_by_account", [ACCOUNT]))
  .then(w  => console.log("on chain:", w.owner, "signs with", w.signing_key, "url", w.url))
  .catch(e => { console.error(e.message); process.exit(1); });
ACTIVE_WIF=5J… node register-witness.js
# broadcast, transaction 3f9c…
# on chain: your-account signs with PIX7… url https://…

Within a minute the schedule reshuffles and your node's log shows Generated block #… with timestamp …. If it shows Won't produce block because I don't have the private key for PIX… instead, the key in config.ini does not match the one you registered: fix one of them and restart with docker compose restart pixagram.

Check yourself from outside as well, on the witness status page or with one request. The number that matters is total_missed:

curl -s -X POST https://api.pixagram.com -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"condenser_api.get_witness_by_account","params":["your-account"],"id":1}'

Then ask for votes. Each account can vote for thirty witnesses; votes weigh by the voter's VESTS. Your URL page is where you make the case: location, hardware, whether you run an API node, how to reach you.

7Price feed

PXS is Pixagram's stable unit. Whenever the chain converts between PXS and PIXA — treasury payouts, the printed value of rewards — it uses the median of the prices all witnesses publish. A witness that publishes none, or one older than seven days, is flagged on the status page.

Pixagram's convention is that one PXS is worth one Big Mac. The feed container in your stack fetches the US Big Mac price from The Economist's index, divides it by a PIXA/USD reference price, and publishes the result through your own node every hour. The reference is the --token-price argument in docker-compose.yml, currently 0.12; at a Big Mac of 6.12 USD that gives the 51 PIXA per PXS the chain shows today.

docker compose logs -f bigmac-feed
# Big Mac = $6.12 (as of 2026-01-…) → 1 PXS = 51.000 PIXA

Keep --token-price in line with the reference the other witnesses use — the status page shows each feed's deviation from the median, and a large one is visible to every voter. When the reference changes, edit the value and reload only that container:

nano docker-compose.yml             # change --token-price=0.12
docker compose up -d bigmac-feed

Nothing here leaves the machine except the signed transaction: the feed talks to hived over the internal Compose network, which is why the witness config loads database_api, condenser_api and network_broadcast_api alongside the witness plugin. If you publish your feed by other means, remove the service.

8API node

On the second server, repeat steps 1 to 3 with the API firewall rules, then give it a name. At your domain registrar, create an A record — for example host api, value your server's IPv4 — and wait until it resolves before you go on. Caddy asks Let's Encrypt for a certificate the moment it starts, and a name that does not yet point at the server produces failed attempts that count against that domain's rate limit.

dig +short api.example.com          # must print your server's IP; nslookup works too
git clone https://github.com/pixagram-blockchain/pixagram-node.git
cd pixagram-node
echo 'SITE_ADDRESS=api.example.com' > .env && chmod 600 .env

HAF ships PostgreSQL tuned for Hive at full scale, with 16 GiB of shared buffers; Postgres refuses to start if it cannot reserve them. On anything under about 24 GB of RAM, override it in the bind-mounted directory before the first start (raise the numbers in proportion on a bigger machine):

mkdir -p pixagram-haf/haf_postgresql_conf.d
cat > pixagram-haf/haf_postgresql_conf.d/local.conf <<'EOF'
shared_buffers = 2GB
effective_cache_size = 4GB
maintenance_work_mem = 512MB
EOF
docker compose up -d
docker compose logs -f pixagram_haf

The first start pulls about 750 MB of images, then syncs the chain twice — hived and the HAF hived — and indexes it into PostgreSQL and Hivemind. The one-shot hivemind_setup container must finish (exit code 0) before hivemind_sync and hivemind start; give it a few minutes and do not restart the stack while it runs. Jussi may flap for up to a minute after any cold start because it resolves Hivemind's address when it loads — that is normal.

Verify the chain layer and the social layer, then compare head_block_number with api.pixagram.com:

curl -s -X POST https://api.example.com -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"condenser_api.get_dynamic_global_properties","params":[],"id":1}'

curl -s -X POST https://api.example.com -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"bridge.get_ranked_posts","params":{"sort":"created","tag":"","limit":1},"id":1}'
Docker publishes ports past ufw

The stack publishes hived's direct HTTP port (7777), Hivemind (7778), the HAF node (7779) and a websocket (8092) on the host so you can query them locally. Docker writes its own firewall rules, so ufw alone does not close them. Either keep the provider's firewall in front (step 1) or, in docker-compose.yml, prefix those four mappings with 127.0.0.1: — for example "127.0.0.1:7777:7777" — so they only listen on the machine itself. Ports 80, 443, 2001 and 2002 stay public.

Once it serves, put the address on your witness page and tell the Pixagram team so it can be listed for the app. If your provider or a CDN offers a filtering proxy for HTTPS, you can put the API behind it; the peer ports stay on the server's own address.

Day to day

A healthy node needs almost nothing from you. The habit that matters is looking at the status page once a day — your missed count, your feed age, your version against the majority.

docker compose ps                    # what is running
docker compose logs -f pixagram      # follow hived; Ctrl+C to stop following
docker compose restart pixagram      # after editing config.ini
docker compose down                  # stop everything (the chain data stays on disk)
docker compose pull && docker compose up -d   # update to a newly published image
df -h / && du -sh pixagram/blockchain # disk: the chain only grows

Every long-running container restarts on its own after a reboot (restart: unless-stopped), so a kernel update is a reboot and a couple of missed slots, nothing more. Two operations rebuild state rather than restart it:

# Replay: rebuild the state from your own block log (after enabling a plugin, or on a corrupt state file)
docker compose down
rm -f pixagram/blockchain/shared_memory.bin
HIVED_EXTRA_ARGS=--replay-blockchain docker compose up -d pixagram
docker compose logs -f pixagram      # wait for "entering live mode", then:
docker compose up -d

# Resync from genesis: throw away everything but your config and keys
docker compose down
sudo rm -rf pixagram/blockchain pixagram/p2p pixagram/logs pixagram/*.log
docker compose up -d

On the API node the replay also removes the two RocksDB directories (account-history-rocksdb-storage, comments-rocksdb-storage); the repository README has the exact lines. When you update an image, read the release note: if it adds a plugin, it needs the replay, and skipping it produces a clear error rather than a broken node.

Planned downtime and failover

A witness that will be offline for more than a few minutes should step aside first, so that its slots are skipped rather than missed: run the registration script with SIGNING_PUB set to the null key PIX1111111111111111111111111111111114T1Anm, do the work, then register your real key again. The chain enforces its own version of this: a witness that has not produced for 28,800 blocks — about a day — is disabled at its next miss, and must re-register to come back.

If you run a second, standby node, give it its own signing key and switch to it with witness_update when the first fails. Two nodes signing with the same key at the same time is the one configuration that can hurt the chain rather than just you.

Let a machine watch

The status project ships a command-line check with meaningful exit codes. A cron line that pings a phone when it is not zero is fifteen minutes well spent — ntfy.sh is a free push service that needs no account:

sudo apt -y install nodejs npm       # if the server has no Node yet
crontab -e
# every 10 minutes: exit 0 ok, 1 warning, 2 critical, 3 could not fetch
*/10 * * * * npx github:pixagram-blockchain/witness-status --check >/dev/null 2>&1 || curl -s -d "Pixagram witness check failed" ntfy.sh/your-secret-topic

Back up your keys, not the chain. The chain can always be downloaded again; config.ini and .env cannot.

When something is wrong

You seeIt meansDo
unable to parse private key, container restarts in a loopprivate-key = is present but empty or malformedFill it in or comment the line out; restart
Won't produce block because I don't have the private key for PIX…Key in config.ini does not match the key registered on chainFix either side; docker compose restart pixagram
total_missed climbs while the node looks fineClock drift, an overloaded machine, or port 2001 closedtimedatectl; docker stats; check the provider firewall
Permission denied at startDatadir not owned by the container's usersudo chown -R 1000:1000 ./pixagram ./pixagram-haf
Headblock and statefile are inconsistentState file no longer matches the block logReplay (see above)
Inconsistency occurs. A new index is created…A plugin was added but the old state file keptDelete shared_memory.bin, then replay
PostgreSQL will not start, mentions shared memory16 GiB of shared buffers on a smaller machineAdd local.conf (step 8); docker compose up -d
https:// fails, Caddy logs ACME errorsDNS not pointing here yet, or 80/443 closedFix DNS or firewall; Caddy retries by itself
Jussi restarts for a minute after bootIt resolves Hivemind's address while Hivemind is still startingNothing — wait
Feed container logs an error every hourAccount not yet registered as witness, or wrong key in .envFinish step 6; check that .env holds the active key
Disk almost fullThe chain grew, or logs didResize the volume; the block log must never be deleted

Before you announce

Reference

Public endpoints

NodeLocation
https://api.pixagram.comWarsaw — also the P2P seed, port 2001
https://merlion.surfSingapore
https://blockforge.lolFrance
https://pixarex.netIowa, United States

All four serve the same Hive-compatible JSON-RPC over HTTPS POST, batches included, with CORS open. There is no testnet; pixagram.dev is a website.

Chain constants that shape a witness's life

Block interval3 seconds, 28,800 blocks a day
Witness seats21: 20 elected by votes, 1 rotating backup
Votes per account30 witnesses, weighted by the voter's VESTS
Automatic disableNo block produced for 28,800 blocks, then one more miss
Feed considered staleolder than 7 days
Max transaction / block128 KiB / 256 KiB voted (2 MiB hard cap)
Power-down13 weekly instalments
Chain ID706978616772616d000000000000000000000000000000000000000000000000 (ASCII "pixagram", padded)
Key prefixPIX; null signing key PIX1111111111111111111111111111111114T1Anm
Node softwarehived 1.28.7; images pixadock/pixagram:mainnet, pixadock/pixagram-haf:mainnet, pixadock/hivemind:mainnet, pixadock/bigmac-feed:v1.0.2

Where the pieces live

Node operator guide, version 1.0, 5 September 2026. Measurements from the repositories' production nodes and from the live chain; the page refreshes the live figures itself.