Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/guides/storj.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
Storj is a decentralized cloud storage network where you earn by renting out your unused disk space. Run the storage node via Docker and get paid $1.35/TB stored per month plus $1/TB egress (rates since 1 September 2026). Payouts are monthly in USDC, a US-dollar stablecoin, on Ethereum mainnet to a wallet you control, once the balance clears a fee-based minimum (STORJ token until the September 2026 payout). Requires at least 550GB of available disk space and a stable internet connection. No account or signup needed -- nodes are permissionless since mid-2025.

!!! warning "Storj Labs is in Chapter 11 (October 2026)"
Storj Labs filed for Chapter 11 on 26 July 2026 (US Bankruptcy Court, Northern District of West Virginia, case 5:26-bk-00512) to restructure legacy debt. The network keeps running and Storj keeps paying active nodes, but node earnings from before the filing are frozen until the court rules on them. The STORJ token is down about 98% from its 2021 peak. Binance delisted it on 3 September 2026, and Coinbase suspended trading in it on 28 September 2026. A new node withholds part of its earnings during its first nine months and fills only as customer demand allows, so starting one now ties a long payback to a company in restructuring that could still wind down.
Storj Labs filed for Chapter 11 on 26 July 2026 (US Bankruptcy Court, Northern District of West Virginia, case 5:26-bk-00512) to restructure legacy debt ([Storj's announcement](https://www.storj.io/blog/storj-announces-voluntary-financial-restructuring-to-resolve-legacy-liabilities-and-position-the-business-for-growth/)). The network keeps running and Storj keeps paying active nodes, but node earnings from before the filing are frozen until the court rules on them ([Storj's payout update](https://forum.storj.io/t/storagenode-payout-update-august-prepayments-and-july-2026-status/32266)). The STORJ token is down more than 98% from its March 2021 peak ([CoinGecko](https://www.coingecko.com/en/coins/storj), November 2026). Binance delisted it on 3 September 2026 ([Binance](https://www.binance.com/en/support/announcement/detail/d72915ed7a60473b92f0818d959a227a)), and Coinbase suspended trading in it on 28 September 2026 ([Coinbase status](https://status.exchange.coinbase.com/incidents/bczrbdtb1fd5)). A new node withholds part of its earnings during its first nine months and fills only as customer demand allows, so starting one now ties a long payback to a company in restructuring that could still wind down.

## Earning Estimates

Expand Down Expand Up @@ -98,7 +98,7 @@ Pick the boxes under **Deploy to** and click **Deploy Storj**. CashPilot creates

- **Use a DDNS hostname for `ADDRESS`, never a literal IP.** Satellites dial your node back at exactly the address it advertises. Residential ISPs re-provision public IPs without notice, and when that happens a node advertising the old literal IP is counted offline around the clock (container healthy, dashboard green, earnings from new data at zero) until someone notices the provider's offline emails. A dynamic-DNS hostname (DuckDNS, Cloudflare DDNS, your router's DDNS client) self-heals through an IP change. If satellites cannot reach the node, CashPilot's producer state for Storj reports it with the exact reason; you can also check yourself with `curl -s http://<server>:14002/api/sno/` (`lastPinged` stale or `quicStatus: "Misconfigured"` means unreachable).
- **No signup required**: Storj nodes are permissionless since mid-2025. No auth token, no account creation.
- **Held-back earnings**: a new node's satellites withhold 75% of its earnings in months 1 to 3, 50% in months 4 to 6 and 25% in months 7 to 9. Half of the held amount comes back in month 16; the rest only when the node exits gracefully. Earnings from before Storj Labs' 26 July 2026 Chapter 11 filing are frozen until the bankruptcy court rules on them.
- **Held-back earnings**: a new node's satellites withhold 75% of its earnings in months 1 to 3, 50% in months 4 to 6 and 25% in months 7 to 9. Half of the held amount comes back in month 16; the rest only when the node exits gracefully ([Storj docs](https://storj.dev/node/faq/held-back-amount)). Earnings from before Storj Labs' 26 July 2026 Chapter 11 filing are frozen until the bankruptcy court rules on them ([Storj's payout update](https://forum.storj.io/t/storagenode-payout-update-august-prepayments-and-july-2026-status/32266)).
- **One node per public IP**: Storj recommends one node per public IP for optimal satellite allocation. Nodes on the same /24 subnet share data allocation.
- **Uptime matters**: Nodes with poor uptime get less data. Aim for 99.5%+ uptime.
- **Disk selection**: Always use spinning disks (HDD). Storj data is cold storage: IOPS don't matter, capacity does. SSDs offer no advantage and cost more per TB.
Expand Down
39 changes: 39 additions & 0 deletions tests/test_storj_guide_sources.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""The Storj guide's Chapter 11 and held-back claims each name their source.

The guide stated the filing date, the freeze on pre-filing node earnings and
the held-back schedule with no link, so a reader could not check them and a
reviewer could not tell when one went stale.
"""

from __future__ import annotations

from pathlib import Path

import pytest

GUIDE = Path(__file__).resolve().parents[1] / "docs" / "guides" / "storj.md"

FILING = (
"https://www.storj.io/blog/"
"storj-announces-voluntary-financial-restructuring-to-resolve-legacy-liabilities-and-position-the-business-for-growth/"
)
FREEZE = "https://forum.storj.io/t/storagenode-payout-update-august-prepayments-and-july-2026-status/32266"
HELD = "https://storj.dev/node/faq/held-back-amount"


def _line(marker: str) -> str:
lines = [line for line in GUIDE.read_text(encoding="utf-8").splitlines() if marker in line]
assert len(lines) == 1, f"expected one line with {marker!r} in the Storj guide"
return lines[0]


@pytest.mark.parametrize(
("marker", "sources"),
[
("5:26-bk-00512", [FILING, FREEZE]),
("**Held-back earnings**", [HELD, FREEZE]),
],
)
def test_each_claim_links_its_source(marker: str, sources: list[str]):
line = _line(marker)
assert [s for s in sources if f"]({s})" not in line] == []
Loading