Skip to content

Commit 4e0a8ab

Browse files
ralyodioclaude
andauthored
c0mpute.com/market: live GPU supply, 10% market fee, operators keep 90% (#65)
Anthony set the split on 2026-10-27. /market lists the GPU nodes online from the aggregator, documents the fee with worked examples, and shows how to rent and how to sell. Linked from the header nav, footer, sitemap, /pricing and /providers; the protocol itself stays fee-free for direct deals. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 2ce7c76 commit 4e0a8ab

7 files changed

Lines changed: 191 additions & 8 deletions

File tree

‎apps/web/src/app/layout.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export default function RootLayout({
6868
["blog", "/blog"],
6969
["about", "/about"],
7070
["contact", "/contact"],
71+
["market", "/market"],
7172
["pricing", "/pricing"],
7273
["terms", "/terms"],
7374
["privacy", "/privacy"],

‎apps/web/src/app/market/page.tsx‎

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import Link from "next/link";
2+
import { CodeBlock } from "@/components/CodeBlock";
3+
import { getNodesPayload } from "@/lib/nodes";
4+
import { MARKET_FEE_PCT, OPERATOR_SHARE_PCT, splitPrice } from "@/lib/market";
5+
6+
export const metadata = {
7+
title: "market — c0mpute",
8+
description: `Rent GPU and CPU time from the c0mpute nodes online right now. The node operator keeps ${OPERATOR_SHARE_PCT}% of every job; c0mpute takes a ${MARKET_FEE_PCT}% market fee.`,
9+
alternates: { canonical: "https://c0mpute.com/market" },
10+
};
11+
12+
// Live supply, not a build-time snapshot.
13+
export const dynamic = "force-dynamic";
14+
15+
const EXAMPLES = [1, 5, 20];
16+
17+
function ago(s: number): string {
18+
if (s < 90) return `${s}s ago`;
19+
return `${Math.round(s / 60)}m ago`;
20+
}
21+
22+
export default async function MarketPage() {
23+
const p = await getNodesPayload();
24+
const gpus = p.nodes.filter((n) => n.class.startsWith("gpu"));
25+
const cpus = p.nodes.length - gpus.length;
26+
27+
return (
28+
<div className="max-w-3xl mx-auto px-6 py-16 space-y-10">
29+
<header className="space-y-2">
30+
<h1 className="text-2xl font-bold accent">market</h1>
31+
<p className="comment">
32+
// rent compute from the nodes online now · operators keep {OPERATOR_SHARE_PCT}%
33+
</p>
34+
</header>
35+
36+
<section className="space-y-3 text-sm leading-7">
37+
<h2 className="font-semibold text-[var(--color-fg)]">[ the split ]</h2>
38+
<p>
39+
Every job bought through the market pays the node operator{" "}
40+
<strong className="text-[var(--color-fg)]">{OPERATOR_SHARE_PCT}%</strong> of
41+
the price. c0mpute keeps a{" "}
42+
<strong className="text-[var(--color-fg)]">{MARKET_FEE_PCT}% market fee</strong>{" "}
43+
for matching, billing, settlement and support. Payment-processor fees
44+
come out of the payment, not out of the operator&apos;s share on top.
45+
</p>
46+
<table className="w-full text-left border-collapse text-xs">
47+
<thead className="text-[var(--color-dim)]">
48+
<tr>
49+
<th className="py-2 pr-6">job price</th>
50+
<th className="py-2 pr-6">operator gets</th>
51+
<th className="py-2">c0mpute fee</th>
52+
</tr>
53+
</thead>
54+
<tbody className="divide-y divide-[var(--color-rule)]">
55+
{EXAMPLES.map((usd) => {
56+
const s = splitPrice(usd);
57+
return (
58+
<tr key={usd}>
59+
<td className="py-2 pr-6">${usd.toFixed(2)}</td>
60+
<td className="py-2 pr-6 accent">${s.operator.toFixed(2)}</td>
61+
<td className="py-2 text-[var(--color-dim)]">${s.fee.toFixed(2)}</td>
62+
</tr>
63+
);
64+
})}
65+
</tbody>
66+
</table>
67+
<p className="text-xs text-[var(--color-dim)] leading-6">
68+
The same {MARKET_FEE_PCT}% is the house fee on paid{" "}
69+
<a href="https://infernetprotocol.com" target="_blank" rel="noopener noreferrer">Infernet</a>{" "}
70+
inference jobs, which run on these nodes. Two peers dealing directly
71+
over the open protocol, without the market, pay no protocol fee. →{" "}
72+
<Link href="/pricing">pricing</Link>
73+
</p>
74+
</section>
75+
76+
<section className="space-y-3">
77+
<h2 className="text-sm font-semibold">[ GPUs online now ]</h2>
78+
<p className="text-xs text-[var(--color-dim)] leading-6">
79+
{gpus.length} GPU {gpus.length === 1 ? "node" : "nodes"} and {cpus} CPU{" "}
80+
{cpus === 1 ? "node" : "nodes"} online, read from the signed adverts
81+
each worker gossips every minute.
82+
{p.source === "unavailable" ? " The aggregator is not answering right now, so the list is empty." : ""}
83+
</p>
84+
{gpus.length === 0 ? (
85+
<p className="text-sm text-[var(--color-dim)]">No GPU nodes online at the moment.</p>
86+
) : (
87+
<div className="overflow-x-auto">
88+
<table className="w-full text-left border-collapse text-xs">
89+
<thead className="text-[var(--color-dim)]">
90+
<tr>
91+
<th className="py-2 pr-3">node</th>
92+
<th className="py-2 pr-3">class</th>
93+
<th className="py-2 pr-3">bench</th>
94+
<th className="py-2 pr-3">version</th>
95+
<th className="py-2">seen</th>
96+
</tr>
97+
</thead>
98+
<tbody className="divide-y divide-[var(--color-rule)]">
99+
{gpus.map((n, i) => (
100+
<tr key={`${n.id}-${i}`}>
101+
<td className="py-2 pr-3 accent font-mono">{n.id}</td>
102+
<td className="py-2 pr-3">{n.class}</td>
103+
<td className="py-2 pr-3">{n.bench_score?.toLocaleString() ?? "-"}</td>
104+
<td className="py-2 pr-3 text-[var(--color-dim)]">{n.version ?? "-"}</td>
105+
<td className="py-2 text-[var(--color-dim)]">{ago(n.last_seen_s)}</td>
106+
</tr>
107+
))}
108+
</tbody>
109+
</table>
110+
</div>
111+
)}
112+
<p className="text-xs text-[var(--color-dim)]">
113+
→ <Link href="/nodes">every node</Link> · <a href="/api/nodes">/api/nodes</a> (JSON)
114+
</p>
115+
</section>
116+
117+
<section className="space-y-3 text-sm leading-7">
118+
<h2 className="font-semibold text-[var(--color-fg)]">[ rent ]</h2>
119+
<p>
120+
<strong className="text-[var(--color-fg)]">GPU inference.</strong> Paid
121+
model inference runs through{" "}
122+
<a href="https://infernetprotocol.com" target="_blank" rel="noopener noreferrer">Infernet</a>{" "}
123+
on these nodes, billed through{" "}
124+
<a href="https://coinpayportal.com" target="_blank" rel="noopener noreferrer">CoinPay</a>{" "}
125+
in crypto or PayPal.
126+
</p>
127+
<p>
128+
<strong className="text-[var(--color-fg)]">Batch jobs.</strong> Submit
129+
from the CLI with a price cap; nodes quote under it and the job pays
130+
out when the result validates.
131+
</p>
132+
<CodeBlock>{`$ curl -fsSL https://c0mpute.com/install.sh | sh
133+
$ c0mpute transcode submit input.mov --preset hls --max-price 1.25`}</CodeBlock>
134+
</section>
135+
136+
<section className="space-y-3 text-sm leading-7">
137+
<h2 className="font-semibold text-[var(--color-fg)]">[ sell your GPU ]</h2>
138+
<p>
139+
Install the node, set where your {OPERATOR_SHARE_PCT}% lands, and it
140+
shows up here as soon as it advertises.
141+
</p>
142+
<CodeBlock>{`$ curl -fsSL https://c0mpute.com/install.sh | sh
143+
$ infernet payout set USDC 0xYourAddress --network polygon`}</CodeBlock>
144+
<p className="text-xs text-[var(--color-dim)]">
145+
→ <Link href="/providers">running a node</Link>
146+
</p>
147+
</section>
148+
</div>
149+
);
150+
}

‎apps/web/src/app/pricing/page.tsx‎

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Link from "next/link";
22

33
export const metadata = {
44
title: "pricing — c0mpute",
5-
description: "c0mpute uses a peer-to-peer market rate model. Buyers set a max price per job; providers quote. The open protocol takes 0% — providers earn the full amount. Optional managed services are priced separately.",
5+
description: "c0mpute uses a peer-to-peer market rate model. Buyers set a max price per job; providers quote. The open protocol takes 0%; jobs bought through the c0mpute market carry a 10% fee and the node operator keeps 90%.",
66
alternates: { canonical: "https://c0mpute.com/pricing" },
77
};
88

@@ -11,7 +11,7 @@ export default function PricingPage() {
1111
<div className="max-w-3xl mx-auto px-6 py-16 space-y-10">
1212
<header className="space-y-2">
1313
<h1 className="text-2xl font-bold accent">pricing</h1>
14-
<p className="comment">// peer-to-peer market rates, no platform cut</p>
14+
<p className="comment">// peer-to-peer rates · market fee 10%, operators keep 90%</p>
1515
</header>
1616

1717
<section className="space-y-3 text-sm leading-7">
@@ -56,6 +56,16 @@ export default function PricingPage() {
5656
cost nothing beyond the price of the work.
5757
</td>
5858
</tr>
59+
<tr>
60+
<td className="py-2 pr-6 align-top accent whitespace-nowrap">market</td>
61+
<td className="py-2 text-[var(--color-dim)] leading-6">
62+
<strong className="text-[var(--color-fg)]">10% market fee, operator keeps 90%.</strong>{" "}
63+
Jobs bought through <Link href="/market">c0mpute.com/market</Link>{" "}
64+
and paid Infernet inference jobs pay the node operator 90% of
65+
the price; c0mpute keeps 10% for matching, billing, settlement
66+
and support.
67+
</td>
68+
</tr>
5969
<tr>
6070
<td className="py-2 pr-6 align-top accent whitespace-nowrap">managed services</td>
6171
<td className="py-2 text-[var(--color-dim)] leading-6">
@@ -134,15 +144,17 @@ export default function PricingPage() {
134144
<h2 className="font-semibold text-[var(--color-fg)]">[ for providers ]</h2>
135145
<p>
136146
Register hardware as a c0mpute provider and earn by completing jobs.
137-
You set your own rates and you keep everything you earn. Payment
138-
releases automatically when output passes validation.
147+
You set your own rates. Direct protocol deals pay you the full
148+
amount; jobs that come through the market pay you 90% (the 10%
149+
market fee). Payment releases automatically when output passes
150+
validation.
139151
</p>
140152
<p className="text-[var(--color-dim)]">
141153
Your earning record is portable: reputation is derived from signed
142154
receipts you hold, not from a score in a database we control.
143155
</p>
144156
<p className="text-xs text-[var(--color-dim)]">
145-
→ <Link href="/providers">run a provider</Link>
157+
→ <Link href="/providers">run a provider</Link> · <Link href="/market">market</Link>
146158
</p>
147159
</section>
148160

‎apps/web/src/app/providers/page.tsx‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,12 @@ $ c0mpute worker status # the installer already started it`}</CodeBlock>
114114
<p>
115115
You set your rates. A buyer sets a cap. When you quote under it and
116116
the work validates, settlement releases and both sides sign a
117-
receipt. There is{" "}
118-
<strong className="text-[var(--color-fg)]">no protocol fee</strong>{" "}
119-
— the amount agreed is the amount transferred.
117+
receipt. A direct protocol deal has{" "}
118+
<strong className="text-[var(--color-fg)]">no protocol fee</strong>. Jobs
119+
bought through the <Link href="/market">market</Link>, including paid
120+
Infernet inference, pay you{" "}
121+
<strong className="text-[var(--color-fg)]">90%</strong>; c0mpute keeps a
122+
10% market fee.
120123
</p>
121124
<p className="text-[var(--color-dim)]">
122125
Your record is portable. Reputation is derived from signed receipts

‎apps/web/src/app/sitemap.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const staticPages: MetadataRoute.Sitemap = [
1414
{ url: `${BASE}/temporal`, priority: 0.8, changeFrequency: "monthly" },
1515
{ url: `${BASE}/blog`, priority: 0.8, changeFrequency: "daily" },
1616
{ url: `${BASE}/status`, priority: 0.6, changeFrequency: "hourly" },
17+
{ url: `${BASE}/market`, priority: 0.9, changeFrequency: "hourly" },
1718
{ url: `${BASE}/nodes`, priority: 0.7, changeFrequency: "hourly" },
1819
{ url: `${BASE}/about`, priority: 0.7, changeFrequency: "monthly" },
1920
{ url: `${BASE}/pricing`, priority: 0.8, changeFrequency: "monthly" },

‎apps/web/src/components/site-nav.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const LINKS: { href: string; label: string; accent?: boolean }[] = [
88
{ href: "/getting-started", label: "getting-started" },
99
{ href: "/protocol", label: "protocol" },
1010
{ href: "/providers", label: "run a node", accent: true },
11+
{ href: "/market", label: "market" },
1112
{ href: "/nodes", label: "nodes" },
1213
{ href: "/agents", label: "agents" },
1314
{ href: "/plugins", label: "plugins" },

‎apps/web/src/lib/market.ts‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* The c0mpute market fee: what c0mpute keeps from a job bought through the
3+
* market (c0mpute.com/market and the Infernet gateway). The node operator gets
4+
* the rest. Anthony set it on 2026-10-27; Infernet applies the same number as
5+
* its house fee on paid jobs.
6+
*/
7+
export const MARKET_FEE_PCT = 10;
8+
export const OPERATOR_SHARE_PCT = 100 - MARKET_FEE_PCT;
9+
10+
/** Split a job price (decimal dollars) into the operator's share and the fee, in whole cents. */
11+
export function splitPrice(usd: number): { operator: number; fee: number } {
12+
const cents = Math.round(usd * 100);
13+
const fee = Math.round((cents * MARKET_FEE_PCT) / 100);
14+
return { operator: (cents - fee) / 100, fee: fee / 100 };
15+
}

0 commit comments

Comments
 (0)