Make a PCOC
Making a PCOC means creating a self-issued identifier on your own device: your laptop, your phone, or an app you build. Its pair is the admission gate, the side that checks one. The making costs memory and time.
I want one
- Who
- Anyone with a Linux laptop or an Android phone
- Use
- The desktop app (Linux) or groundinglab's build of Primal (Android)
- Get it
- Apps, with copy-paste install steps
I build an app
- Who
- Developers of apps whose users bring a PCOC
- SDK
- The PCOC SDK, in Rust, C, Go, and Java. The desktop app runs on the Rust SDK.
- Start
- Set up the SDK, below
What making one takes
- Making it takes at least 18 Bitcoin blocks, typically around three hours or more, but it varies.
- The device holds about 256 MiB the whole time. Leave it running.
- You need no bitcoin, wallet or node, and nothing to buy. No account.
- You keep the key; this site never asks for it.
I want one: four steps
- 1. Get an appApps: Linux desktop or Android.
- 2. Start making itStart it and leave it running until it finishes.
- 3. Check itDrop it on Verify to see what a service would measure.
- 4. Use itSign in to this site through its admission gate.
Step by step, with a video each: the desktop guide and the phone guide.
I build an app: set up the SDK
Paste each step into a terminal, in order, or hand this page to your coding agent. Pick a language. Each one ends by checking a known test PCOC, so you know the SDK is set up right before you write any code.
Expected lines checked against the release tags on 24 Oct 2026. This page was not run as a build on that date.
1. Install the system packages
sudo apt update
sudo apt install -y build-essential git curl2. Install Rust with rustup
The second line loads Rust into this terminal.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.99.0
. "$HOME/.cargo/env"3. Check Rust
rustc --versionExpected output
rustc 1.99.0 (b940084d7 2026-09-28)4. Get the code
git clone https://github.com/groundinglab/pcoc.git
cd pcoc5. Run the quickstart
The quickstart compiles the SDK before it runs, which takes about a minute. It checks a known test PCOC from the specification's conformance vectors, offline.
git checkout sdk-rust-v2.3.1
cd sdk/rust
cargo run -p pcoc-cli --release --quiet -- quickstartExpected output
pcoc 2.3.1 (rust) spec-2.3.0 pack 91ded57e5c05b7cb: pin match
kernel scalar, sha256 sha-ni
O1-S1 object sha256 800ad07a87a567c835f539617b61ccddc96a0a984425675a5ece971162dfd246
O1-S1 six_leg match, checkpoints match, waypoints match
negatives 13 non-match
PROD leg 0 legs_le_hex 88a04ac5beacb8a76. Check the result
The four quickstarts print the same lines apart from the language name on the first line. The second line is the SHA-256 backend on the machine. This example is reference system 3.
Expected lines checked against the release tags on 24 Oct 2026. This page was not run as a build on that date.
1. Install Go and git
Debian 13 installs Go 1.24 and Ubuntu 24.04 installs Go 1.22. Both are new enough.
sudo apt update
sudo apt install -y golang-go git2. Check Go
go versionExpected output on Debian 13 (the version number can differ)
go version go1.24.4 linux/amd643. Get the code
git clone https://github.com/groundinglab/pcoc.git
cd pcoc4. Run the quickstart
It checks a known test PCOC from the specification's conformance vectors, offline.
git checkout sdk/go/v2.3.1
cd sdk/go
go run ./cmd/pcoc quickstartExpected output
pcoc 2.3.1 (go) spec-2.3.0 pack 91ded57e5c05b7cb: pin match
kernel scalar, sha256 sha-ni
O1-S1 object sha256 800ad07a87a567c835f539617b61ccddc96a0a984425675a5ece971162dfd246
O1-S1 six_leg match, checkpoints match, waypoints match
negatives 13 non-match
PROD leg 0 legs_le_hex 88a04ac5beacb8a75. Check the result
The four quickstarts print the same lines apart from the language name on the first line. The second line is the SHA-256 backend on the machine. This example is reference system 3.
Expected lines checked against the release tags on 24 Oct 2026. This page was not run as a build on that date.
1. Install the JDK and git
sudo apt update
sudo apt install -y openjdk-21-jdk-headless git2. Check Java
javac -versionExpected output (the last numbers can differ)
javac 21.0.12.1If it prints an older version, such as 17, another JDK comes earlier on your PATH. Step 4 calls JDK 21 by its full path, so it runs either way. To make JDK 21 the default instead, run sudo update-alternatives --config javac and sudo update-alternatives --config java and pick the java-21 entry in both.
3. Get the code
git clone https://github.com/groundinglab/pcoc.git
cd pcoc4. Run the quickstart
Run this from the pcoc folder. It checks a known test PCOC from the specification's conformance vectors, offline. Its top line picks JDK 21, so javac and java come from the same JDK; on an Arm machine, use java-21-openjdk-arm64. If the compile fails, it stops there.
git checkout sdk-java-v2.3.1
cd sdk/java
./gradlew run --args=quickstartExpected output
pcoc 2.3.1 (java) spec-2.3.0 pack 91ded57e5c05b7cb: pin match
kernel scalar, sha256 sha-ni
O1-S1 object sha256 800ad07a87a567c835f539617b61ccddc96a0a984425675a5ece971162dfd246
O1-S1 six_leg match, checkpoints match, waypoints match
negatives 13 non-match
PROD leg 0 legs_le_hex 88a04ac5beacb8a75. Check the result
The four quickstarts print the same lines apart from the language name on the first line. The second line is the SHA-256 backend on the machine. This example is reference system 3.
Expected lines checked against the release tags on 24 Oct 2026. This page was not run as a build on that date.
1. Get the code
git clone https://github.com/groundinglab/pcoc.git
cd pcoc
git checkout sdk-c-v2.3.12. Run the quickstart
It checks the conformance pack. It does not time the run.
cd sdk/c
make -j4 build/pcoc
./build/pcoc quickstartExpected output
pcoc 2.3.1 (c) spec-2.3.0 pack 91ded57e5c05b7cb: pin match
kernel scalar, sha256 sha-ni
O1-S1 object sha256 800ad07a87a567c835f539617b61ccddc96a0a984425675a5ece971162dfd246
O1-S1 six_leg match, checkpoints match, waypoints match
negatives 13 non-match
PROD leg 0 legs_le_hex 88a04ac5beacb8a73. Check the result
The four quickstarts print the same lines apart from the language name on the first line. The second line is the SHA-256 backend on the machine. This example is reference system 3.
Next: make a real one from your app
A real PCOC takes at least 18 Bitcoin blocks, typically around three hours or more, but it varies, and it reads live Bitcoin data while it runs. The producer guide covers the key, the live inputs and how to hand the finished PCOC to your user: Integrate a producer. Reference for each language: SDKs.
Inside the apps
Both apps are demonstrations of the SDK, not separate products. What they do on your device is what the SDK does inside any app that integrates it: make the PCOC, anchor its points, and hand you the finished PCOC to present. The phone build is a pre-release, side-load-only build, signed with a debug key, that you can rebuild from its tag.