diff --git a/Cargo.lock b/Cargo.lock
index ca98578e..300c3704 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -486,7 +486,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
[[package]]
name = "c0mpute-api"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"c0mpute-proto",
@@ -501,7 +501,7 @@ dependencies = [
[[package]]
name = "c0mpute-bench"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"blake3",
@@ -512,7 +512,7 @@ dependencies = [
[[package]]
name = "c0mpute-cli"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"async-trait",
@@ -549,7 +549,7 @@ dependencies = [
[[package]]
name = "c0mpute-core"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"aes-gcm",
"anyhow",
@@ -603,7 +603,7 @@ dependencies = [
[[package]]
name = "c0mpute-doctor"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"serde",
@@ -615,7 +615,7 @@ dependencies = [
[[package]]
name = "c0mpute-envelope"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"blake3",
"bs58",
@@ -628,7 +628,7 @@ dependencies = [
[[package]]
name = "c0mpute-gateway"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"axum",
@@ -650,7 +650,7 @@ dependencies = [
[[package]]
name = "c0mpute-market"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"c0mpute-envelope",
"serde",
@@ -660,7 +660,7 @@ dependencies = [
[[package]]
name = "c0mpute-net"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"async-trait",
@@ -681,7 +681,7 @@ dependencies = [
[[package]]
name = "c0mpute-placement"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"async-trait",
@@ -702,7 +702,7 @@ dependencies = [
[[package]]
name = "c0mpute-proto"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"blake3",
"hex",
@@ -714,7 +714,7 @@ dependencies = [
[[package]]
name = "c0mpute-sealed"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"aes",
"aes-gcm",
@@ -736,7 +736,7 @@ dependencies = [
[[package]]
name = "c0mpute-secure-chat"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"aes-gcm",
"anyhow",
@@ -759,7 +759,7 @@ dependencies = [
[[package]]
name = "c0mpute-store"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"blake3",
@@ -778,7 +778,7 @@ dependencies = [
[[package]]
name = "c0mpute-transcode"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"c0mpute-proto",
@@ -791,7 +791,7 @@ dependencies = [
[[package]]
name = "c0mpute-update"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"hex",
@@ -806,7 +806,7 @@ dependencies = [
[[package]]
name = "c0mpute-verify"
-version = "0.3.60"
+version = "0.3.61"
dependencies = [
"anyhow",
"blake3",
diff --git a/Cargo.toml b/Cargo.toml
index c59c60e2..1bbfb82f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,7 +24,7 @@ members = [
]
[workspace.package]
-version = "0.3.60"
+version = "0.3.61"
edition = "2024"
license = "MIT"
repository = "https://github.com/profullstack/c0mpute"
diff --git a/apps/web/public/llms.txt b/apps/web/public/llms.txt
index 500b9036..f8bc867e 100644
--- a/apps/web/public/llms.txt
+++ b/apps/web/public/llms.txt
@@ -11,7 +11,7 @@
- [Chat](https://c0mpute.com/chat): chat with open models served by c0mpute/Infernet provider nodes. Sign in with CoinPay (a CoinPay DID is required). Same chat from the CLI (`c0mpute chat login`, `c0mpute chat "prompt"`), an OpenAI-compatible API (base URL `https://c0mpute.com/v1`, `Authorization: Bearer c0k_...`), and MCP (`https://c0mpute.com/api/mcp`, tools chat, list_models, whoami; stdio via `c0mpute chat mcp`).
- [Run a node](https://c0mpute.com/providers): `curl -fsSL https://c0mpute.com/install.sh | sh` installs c0mpute and starts the worker (Linux, macOS, Windows via WSL2; CPU or GPU). The goal is 100,000 nodes, enough pooled capacity to train and serve open-weight models in the open.
- [CPU and GPU earnings estimates](https://c0mpute.com/estimates): compare illustrative monthly scenarios using public cloud rental rates and assumed paid utilization. CPU reference rates are DigitalOcean Basic shared-CPU VM prices, including RAM, storage, and transfer. These are not actual c0mpute payouts or guaranteed earnings; the public status does not attribute jobs or payouts by hardware.
-- [Market](https://c0mpute.com/market): GPU nodes online with each operator's listing. Fully competitive: every job is a sealed-bid auction under the buyer's cap and the lowest bid wins automatically; no rate card. `c0mpute pricing set --min
c0mpute pricing set --min 0.05; or ask one fixed price.
+ c0mpute pricing set --min 0.05. New nodes start with a
+ $0.001 minimum per job; existing settings are preserved. Or ask one
+ fixed price.
When you win, your node runs the job and publishes a receipt. Settlement
through CoinPay is built for hosting and ads but{" "}
off by default while it is
diff --git a/node/crates/c0mpute-cli/src/main.rs b/node/crates/c0mpute-cli/src/main.rs
index 8059385d..26307b0e 100644
--- a/node/crates/c0mpute-cli/src/main.rs
+++ b/node/crates/c0mpute-cli/src/main.rs
@@ -110,6 +110,7 @@ enum Cmd {
///
/// Dynamic (default) undercuts the buyer's cap when idle and rises as the
/// queue fills; fixed always asks one price. Neither goes under `--min`.
+ /// New nodes default to a $0.001 minimum per job; explicit settings persist.
/// A running worker picks a change up on restart.
Pricing {
#[command(subcommand)]
diff --git a/node/crates/c0mpute-core/src/config.rs b/node/crates/c0mpute-core/src/config.rs
index 87c40e53..7308663e 100644
--- a/node/crates/c0mpute-core/src/config.rs
+++ b/node/crates/c0mpute-core/src/config.rs
@@ -1031,6 +1031,12 @@ impl Config {
mod tests {
use super::*;
+ #[test]
+ fn a_new_partial_config_gets_the_default_pricing_floor() {
+ let cfg: Config = toml::from_str("roles = []\n").unwrap();
+ assert_eq!(cfg.pricing.min_usd, 0.001);
+ }
+
#[test]
fn gateways_opt_into_adult_and_an_old_serve_key_is_ignored() {
assert!(!Config::default().adult.buyer);
diff --git a/node/crates/c0mpute-core/src/pricing.rs b/node/crates/c0mpute-core/src/pricing.rs
index 6c8fd289..af56943d 100644
--- a/node/crates/c0mpute-core/src/pricing.rs
+++ b/node/crates/c0mpute-core/src/pricing.rs
@@ -1,6 +1,7 @@
//! How a worker prices its bids: the operator's listing.
//!
-//! The operator sets a floor (`min_usd`, per job) and a mode:
+//! The operator sets a floor (`min_usd`, per job) and a mode. A new node's
+//! floor defaults to [`DEFAULT_MINIMUM_USD`]:
//!
//! - `dynamic` (the default): the node prices itself against the market.
//! It starts at [`DYNAMIC_IDLE_SHARE`] of the buyer's cap and learns from
@@ -27,6 +28,9 @@ pub const UNDERCUT: f64 = 0.02;
/// upward, so the market does not only ratchet down).
pub const WIN_PROBE: f64 = 0.05;
+/// New nodes start at a one-tenth-cent minimum bid per job.
+pub const DEFAULT_MINIMUM_USD: f64 = 0.001;
+
/// What a dynamic node has learned about the clearing price for one
/// workload, as a share of the buyer's cap. Buyers award the lowest bid
/// (`buyer.rs`) and broadcast the `JobAccept` with the agreed price, so
@@ -76,18 +80,32 @@ impl PricingMode {
}
}
-#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PricingConfig {
#[serde(default)]
pub mode: PricingMode,
/// The lowest price per job this node accepts, in USD. 0 = no floor.
- #[serde(default)]
+ #[serde(default = "default_minimum_usd")]
pub min_usd: f64,
/// The price per job in `fixed` mode, in USD.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fixed_usd: Option