diff --git a/deploy/apps-silentmode-st.conf b/deploy/apps-silentmode-st.conf
index b7f85b6..6601beb 100644
--- a/deploy/apps-silentmode-st.conf
+++ b/deploy/apps-silentmode-st.conf
@@ -36,9 +36,9 @@ server {
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host apps.silentmode.st;
- # Matches the service's 200 MiB upload cap. Reads are small; this
- # governs POST /api/upload.
- client_max_body_size 200m;
+ # Matches the service's 2 GiB upload cap. The paywall (free below
+ # 100 MiB, $1/USD per 100 MiB above) is the real size gate.
+ client_max_body_size 2g;
proxy_request_buffering off;
# The service's own long-cache headers decide for static assets; this
diff --git a/deploy/prometheus-x.conf b/deploy/prometheus-x.conf
index 8e5197b..4cead7d 100644
--- a/deploy/prometheus-x.conf
+++ b/deploy/prometheus-x.conf
@@ -36,10 +36,10 @@ server {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
- # 200 MiB fits Android APKs and most desktop installers; matches the
- # service's own cap in uploads.js. Publishers of larger binaries
- # self-host and submit a manifest with the external URL + SHA.
- client_max_body_size 200m;
+ # 2 GiB upper cap; the paywall (free below 100 MiB, $1/USD per
+ # 100 MiB above) is the real size gate. Matches the service's own
+ # cap in uploads.js.
+ client_max_body_size 2g;
proxy_request_buffering off;
proxy_buffering off;
diff --git a/service/listings.js b/service/listings.js
index cfc948f..9251180 100644
--- a/service/listings.js
+++ b/service/listings.js
@@ -34,7 +34,7 @@ import {
listingsByPublisher,
insertListingWithPaymentStatus,
} from './db.js';
-import { paymentsRequired } from './payments.js';
+import { listingNeedsPayment } from './payments.js';
// Nine category slugs: seven sub-categories under Apps, plus the two
// single-bucket top-level categories (games, fintech).
@@ -110,9 +110,11 @@ export async function handleListingCreate(req, res) {
const slug = String(body.slug).toLowerCase();
const id = `${name}/${slug}`;
- // In paid mode the listing lands as 'pending' and is hidden from browse
- // until an invoice settles against it; in free mode it is immediately live.
- const paid = paymentsRequired();
+ // Size-tier pricing: listings over 100 MiB require payment when the
+ // operator has enabled PAYMENT_REQUIRED. Smaller listings always publish
+ // immediately; a paid-tier listing lands as 'pending' and is hidden from
+ // browse until an invoice settles against it.
+ const paid = listingNeedsPayment(body.download.size);
const row = {
id,
publisher: name,
diff --git a/service/pages.js b/service/pages.js
index 262268d..0e59930 100644
--- a/service/pages.js
+++ b/service/pages.js
@@ -42,11 +42,32 @@ function renderHomeBrowseSection() {
/* ------------------------------- home ------------------------------- */
export function home() {
+ // Schema.org on home — gives Google a WebSite + SearchAction result card for
+ // "prometheus.x" queries, plus Organization for the knowledge panel.
+ const websiteLd = JSON.stringify({
+ '@context': 'https://schema.org',
+ '@type': 'WebSite',
+ name: 'Prometheus.X',
+ alternateName: ['Prometheus', 'Decentralized App Store'],
+ url: 'https://prometheus.x/',
+ description: 'The decentralized app store. Apps, programs, dApps and libraries signed on the Bitcoin Cash chain and hosted on the decentralized web.',
+ });
+ const orgLd = JSON.stringify({
+ '@context': 'https://schema.org',
+ '@type': 'Organization',
+ name: 'Prometheus',
+ url: 'https://prometheus.x/',
+ sameAs: ['https://silentmode.st/prometheus', 'https://code.silentmode.st/silentmode/prometheus'],
+ description: 'A permissionless app store: listings on the Bitcoin Cash chain, binaries on the decentralized web, endorsements by signature. Anyone can publish; nobody can gatekeep.',
+ });
return {
- title: 'Apps and programs on the decentralized web',
+ title: 'The decentralized app store',
description:
- 'Prometheus is a home for apps, programs, and dApps published on the Bitcoin Cash chain. Listings live on chain, binaries live on Sia, endorsements are signed. Anyone can publish; nobody can gatekeep.',
+ 'Prometheus.X — the decentralized app store. Web3 browsers, BCH wallets, mobile and desktop apps, dApps and libraries. Listings on the Bitcoin Cash chain, binaries on the decentralized web, endorsements by signature. Anyone can publish; nobody can gatekeep.',
here: '/',
+ headExtra:
+ `\n` +
+ ``,
body: `
@@ -57,10 +78,13 @@ export function home() {
Prometheus.X
-
A home for apps, programs, dApps, and libraries — listed on the
- Bitcoin Cash chain, hosted on Sia, endorsed by signature. Anyone can publish.
- Nobody can gatekeep. Named for the one who gave fire to humans and did not ask
- the gods first.
+
The decentralized app store. A home for apps, programs,
+ dApps, and libraries — listed and settled on the Bitcoin Cash chain,
+ hosted on the decentralized web, endorsed by signature. Anyone can
+ publish. Nobody can gatekeep.
+
+ Named for the one who gave fire to humans and did not ask the gods first.
+