diff --git a/data/affiliates.json b/data/affiliates.json
index 7c22f5eeb..ca5682f18 100644
--- a/data/affiliates.json
+++ b/data/affiliates.json
@@ -1,6 +1,6 @@
{
"version": "1.0.0",
- "updatedAt": "2026-10-20T00:00:00.000Z",
+ "updatedAt": "2026-11-10T10:36:23.696Z",
"description": "DevShelf Verified Developer Affiliate & Partner Perks Registry. Cleanly maps high-converting developer perks, free cloud credits, and verified partner links to directory dossiers without tracking param pollution.",
"partners": [
{
@@ -74,6 +74,42 @@
"ctaText": "Get Free Postgres →",
"badge": "⚡ Free Serverless DB",
"active": true
+ },
+ {
+ "slug": "railway",
+ "toolName": "Railway",
+ "url": "https://railway.com/?ref=devshelf",
+ "vanityPath": "/go/railway.html",
+ "category": "cloud",
+ "perkTitle": "$5 Monthly Free Cloud & API Hosting",
+ "perkDescription": "Instant git-push deployments for Node.js, Python, Docker, MCP servers, and Postgres.",
+ "ctaText": "Deploy on Railway ->",
+ "badge": "⚡ Cloud Free Tier",
+ "active": true
+ },
+ {
+ "slug": "posthog",
+ "toolName": "PostHog",
+ "url": "https://posthog.com/?ref=devshelf",
+ "vanityPath": "/go/posthog.html",
+ "category": "testing",
+ "perkTitle": "1M Free Events + 5,000 Session Replays/mo",
+ "perkDescription": "Open-source product analytics, feature flags, session replay, and LLM observability.",
+ "ctaText": "Start Free on PostHog ->",
+ "badge": "⚡ 1M Free Events",
+ "active": true
+ },
+ {
+ "slug": "cloudflare",
+ "toolName": "Cloudflare",
+ "url": "https://www.cloudflare.com/?ref=devshelf",
+ "vanityPath": "/go/cloudflare.html",
+ "category": "cloud",
+ "perkTitle": "100,000 Free Daily Worker Invocations + Pages",
+ "perkDescription": "Global edge workers, zero-egress R2 storage, D1 SQLite, and unlimited static sites.",
+ "ctaText": "Launch on Cloudflare ->",
+ "badge": "⚡ Free Edge Workers",
+ "active": true
}
]
}
diff --git a/data/counts.json b/data/counts.json
index fdf3fe9eb..ba0170bc5 100644
--- a/data/counts.json
+++ b/data/counts.json
@@ -13,5 +13,5 @@
"testing-qa.json": 68
},
"reposCount": 363,
- "updatedAt": "2026-11-08T15:03:56.508Z"
+ "updatedAt": "2026-11-10T11:55:55.479Z"
}
diff --git a/schemas/tool.schema.json b/schemas/tool.schema.json
index 113a63689..482d82de6 100644
--- a/schemas/tool.schema.json
+++ b/schemas/tool.schema.json
@@ -84,6 +84,54 @@
"format": "uri",
"pattern": "^https?://",
"description": "Tracked redirect target URL if destination moved"
+ },
+ "installCommand": {
+ "type": "string",
+ "description": "Explicit single install command overriding fallback git clone"
+ },
+ "installCommands": {
+ "type": "array",
+ "items": { "type": "string" },
+ "description": "Ordered multi-step install commands to run separately"
+ },
+ "installNote": {
+ "type": "string",
+ "description": "Short factual note accompanying explicit install commands"
+ },
+ "installDocsUrl": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://",
+ "description": "Official installation documentation anchor URL"
+ },
+ "installDocsLabel": {
+ "type": "string",
+ "description": "Human-readable anchor label for official installation docs"
+ },
+ "customFaqs": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["question", "answer"],
+ "properties": {
+ "question": { "type": "string" },
+ "answer": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "description": "Custom promotional FAQs unlocked on Paid Spotlight and Category Leader tiers"
+ },
+ "spotlightPromo": {
+ "type": "object",
+ "properties": {
+ "badge": { "type": "string" },
+ "headline": { "type": "string" },
+ "summary": { "type": "string" },
+ "ctaLabel": { "type": "string" },
+ "ctaUrl": { "type": "string", "format": "uri", "pattern": "^https?://" }
+ },
+ "additionalProperties": false,
+ "description": "Promotional spotlight callout unlocked on Paid Spotlight and Category Leader tiers"
}
},
"additionalProperties": false
diff --git a/scripts/activate-sponsor.ts b/scripts/activate-sponsor.ts
index c4f8c0fb8..fb927251e 100644
--- a/scripts/activate-sponsor.ts
+++ b/scripts/activate-sponsor.ts
@@ -11,7 +11,16 @@ const DATA_DIR = path.join(ROOT_DIR, "data");
export type ShelfCategory = "ai" | "cli" | "apis" | "cloud" | "testing" | "boilerplates" | "perks";
-export type SponsorTier = "starter" | "mcpPro" | "enterprise";
+export type SponsorTier =
+ | "starter"
+ | "mcpPro"
+ | "enterprise"
+ | "starter_9"
+ | "spotlight_19"
+ | "category_39"
+ | "leader_49"
+ | "combo_79"
+ | "custom";
export interface ActivateSponsorOptions {
name: string;
@@ -63,16 +72,46 @@ const TIER_MAP: Record<
patronTier: "silver",
sponsorTierLabel: "Verified Sponsor ★ (Starter)",
},
+ starter_9: {
+ defaultUSD: 9,
+ patronTier: "silver",
+ sponsorTierLabel: "Verified Sponsor ★ (Starter)",
+ },
+ spotlight_19: {
+ defaultUSD: 19,
+ patronTier: "silver",
+ sponsorTierLabel: "Verified Sponsor ★ (Launch Spotlight)",
+ },
+ category_39: {
+ defaultUSD: 39,
+ patronTier: "gold",
+ sponsorTierLabel: "Verified Sponsor ★ (Category Exclusive)",
+ },
mcpPro: {
defaultUSD: 49,
patronTier: "gold",
sponsorTierLabel: "Verified Sponsor ★ (MCP Pro)",
},
+ leader_49: {
+ defaultUSD: 49,
+ patronTier: "gold",
+ sponsorTierLabel: "Verified Sponsor ★ (Category Leader + MCP Pro)",
+ },
enterprise: {
defaultUSD: 79,
patronTier: "enterprise",
sponsorTierLabel: "Verified Sponsor ★ (Enterprise Partner)",
},
+ combo_79: {
+ defaultUSD: 79,
+ patronTier: "enterprise",
+ sponsorTierLabel: "Verified Sponsor ★ (Category Combo Pack)",
+ },
+ custom: {
+ defaultUSD: 25,
+ patronTier: "gold",
+ sponsorTierLabel: "Verified Sponsor ★ (Custom Sponsor)",
+ },
};
const ALL_SHELF_FILES = [
diff --git a/scripts/build-site.ts b/scripts/build-site.ts
index 4ec546ed1..971a64021 100644
--- a/scripts/build-site.ts
+++ b/scripts/build-site.ts
@@ -71,12 +71,20 @@ async function buildSiteData() {
const digestSource = `${slug}:${tool.url || ""}:${tool.license || ""}:${tool.type || ""}`;
const verificationDigest = crypto.createHash("sha256").update(digestSource).digest("hex");
- let installCommand = tool.installCommand;
- if (!installCommand && tool.url) {
+ const installCommands = Array.isArray(tool.installCommands)
+ ? tool.installCommands.filter(
+ (cmd: unknown) => typeof cmd === "string" && cmd.trim().length > 0,
+ )
+ : undefined;
+ let installCommand =
+ tool.installCommand ||
+ (installCommands && installCommands.length > 0 ? installCommands.join("\n") : undefined);
+ const repoOrUrl = tool.url || tool.repo;
+ if (!installCommand && repoOrUrl) {
try {
- const parsedUrl = new URL(tool.url);
+ const parsedUrl = new URL(repoOrUrl);
if (parsedUrl.hostname === "github.com" || parsedUrl.hostname.endsWith(".github.com")) {
- installCommand = `git clone ${tool.url}`;
+ installCommand = `git clone ${repoOrUrl}`;
}
} catch {
// invalid URL string, skip default git clone command
@@ -104,6 +112,9 @@ async function buildSiteData() {
verificationDigest,
},
installCommand,
+ ...(installCommands && installCommands.length > 0 ? { installCommands } : {}),
+ ...(tool.installNote ? { installNote: tool.installNote } : {}),
+ ...(tool.installDocsUrl ? { installDocsUrl: tool.installDocsUrl } : {}),
};
});
diff --git a/scripts/generate-seo.ts b/scripts/generate-seo.ts
index c940b085c..b8a9a2d9b 100644
--- a/scripts/generate-seo.ts
+++ b/scripts/generate-seo.ts
@@ -19,6 +19,28 @@ function escapeHtml(str: string | undefined): string {
.replace(/'/g, "'");
}
+function safeHttpUrl(url: unknown): string {
+ if (typeof url !== "string" || !url.trim()) return "";
+ try {
+ const parsed = new URL(url.trim());
+ return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed.toString() : "";
+ } catch {
+ return "";
+ }
+}
+
+function resolveInstallSteps(item: any): string[] {
+ if (Array.isArray(item.installCommands) && item.installCommands.length > 0) {
+ return item.installCommands.filter(
+ (cmd: unknown): cmd is string => typeof cmd === "string" && cmd.trim().length > 0,
+ );
+ }
+ if (typeof item.installCommand === "string" && item.installCommand.trim().length > 0) {
+ return [item.installCommand.trim()];
+ }
+ return [];
+}
+
async function generateSeo() {
const root = process.cwd();
const siteDir = path.join(root, "site");
@@ -207,11 +229,41 @@ async function generateSeo() {
`
${escapeHtml(installNote)}
` : ""} +${escapeHtml(item.spotlightPromo.summary)}
` : ""} +Global edge workers, zero-egress R2 storage, D1 SQLite, and unlimited static sites.
+Open-source product analytics, feature flags, session replay, and LLM observability.
+Instant git-push deployments for Node.js, Python, Docker, MCP servers, and Postgres.
+