Skip to content
Open
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 packages/backend/src/public-stats/trust-stats.format.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ export interface TrustStatsDisplay {

/**
* The least each figure is shown as (Matteo, 8 Oct 2026): 200,000+ downloads
* across all distribution channels, 1M+ AI tool calls last month. Docker Hub alone undercounts downloads, so the floor applies even
* across all distribution channels, 2M+ AI tool calls last month (raised from 1M+ on 9 Nov 2026, 2.08M in the last 30 days). Docker Hub alone undercounts downloads, so the floor applies even
* when a live number is missing or lower.
*/
export const TRUST_FLOORS = { dockerPulls: 200_000, toolCalls30d: 1_000_000 } as const;
export const TRUST_FLOORS = { dockerPulls: 200_000, toolCalls30d: 2_000_000 } as const;

const atLeast = (n: number | null | undefined, floor: number) => (usable(n) && n > floor ? n : floor);

Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/public-stats/trust-stats.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ describe('trust number formatting (always rounded down)', () => {
it('formats a whole set, never below the floors', () => {
expect(
formatTrustStats({ githubStars: 984, dockerPulls: 32_456, workspaces: 3_871, toolCalls30d: 654_321, updatedAt: null }),
).toEqual({ downloads: '200,000+', workspaces: '3,800+', toolCalls: '1M+' });
).toEqual({ downloads: '200,000+', workspaces: '3,800+', toolCalls: '2M+' });
expect(
formatTrustStats({ githubStars: 1_234, dockerPulls: 250_400, workspaces: null, toolCalls30d: 2_100_000, updatedAt: null }),
).toEqual({ downloads: '250,000+', workspaces: null, toolCalls: '2M+' });
expect(formatTrustStats(null)).toEqual({ downloads: '200,000+', workspaces: null, toolCalls: '1M+' });
expect(formatTrustStats(null)).toEqual({ downloads: '200,000+', workspaces: null, toolCalls: '2M+' });
});
});

Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/settings/email-templates.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ describe('trust band', () => {
it('shows the numbers, never below their floors', () => {
const html = verify.render(cloud, { name: 'A', other: 'B' }).html;
expect(html).toContain('200,000+');
expect(html).toContain('1M+');
expect(html).toContain('2M+');
expect(html).toContain('3,800+');
expect(html).toContain('workspaces on AnythingMCP Cloud');
expect(html).not.toContain('stars on GitHub');
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/settings/email.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ describe('EmailService', () => {
// Downloads and tool calls at their floors; no GitHub star count.
expect(mail.html).not.toContain('stars on GitHub');
expect(mail.html).toContain('200,000+');
expect(mail.html).toContain('1M+');
expect(mail.html).toContain('2M+');
});

describe('Reply-To of the system SMTP', () => {
Expand Down
83 changes: 82 additions & 1 deletion packages/frontend/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,11 @@
"title": "Tool-Leistung",
"description": "Aufrufe, Fehler und Latenz nach Tool, Connector und MCP-Server. Für diese Tabelle gilt ein eigener Zeitraum.",
"range": "Zeitraum der Tool-Leistung",
"ranges": { "24": "Letzte 24 Stunden", "168": "Letzte 7 Tage", "720": "Letzte 30 Tage" },
"ranges": {
"24": "Letzte 24 Stunden",
"168": "Letzte 7 Tage",
"720": "Letzte 30 Tage"
},
"connector": "Tool-Leistung nach Connector filtern",
"server": "Tool-Leistung nach MCP-Server filtern",
"allConnectors": "Alle Connectors",
Expand Down Expand Up @@ -3605,5 +3609,82 @@
"directory": "Gelistet im Claude Directory",
"directoryChatgpt": "Gelistet im ChatGPT-Plugin-Verzeichnis",
"directoryBoth": "Gelistet in den Verzeichnissen von Claude und ChatGPT"
},
"planFit": {
"title": "Was sich mit {plan} ändert",
"fits": "Alles, was Sie heute nutzen, passt in {plan}.",
"chooseTeam": "Stattdessen Team wählen",
"showDetails": "Welche genau?",
"hideDetails": "Ausblenden",
"keep": "Bleiben aktiv",
"pause": "Pausiert",
"groups": {
"connectors": "Connectors",
"mcpServers": "MCP-Server",
"fileSearch": "File-Search-Ordner"
},
"unnamed": "Ohne Namen",
"lines": {
"connectors": "{paused} von {total} Connectors pausiert (am wenigsten genutzt). Welche, wählen Sie selbst.",
"mcpServers": "{paused} von {total} MCP-Servern pausiert (am wenigsten genutzt).",
"mcpServersChoose": "{paused} von {total} MCP-Servern pausiert (am wenigsten genutzt). Welche, wählen Sie selbst.",
"users": "{max, plural, one {# Nutzer} other {# Nutzer}} enthalten, Sie haben {current}. Niemand verliert den Zugang.",
"fileSearch": "File Search: bis zu {maxFolders, plural, one {# Ordner} other {# Ordner}} und {maxFiles, number} Dateien.",
"fileSearchStorage": "File Search: bis zu {maxSize} Speicher.",
"codeTools": "{max} gespeicherte Code-Tools (Sie haben {current}).",
"inline": "Kein Inline-Code (code_execute)."
}
},
"planSwap": {
"badge": "Pausiert: Tarif-Limit",
"activate": "Aktivieren",
"title": {
"connectors": "Ihr Tarif enthält {max, plural, one {# aktiven Connector} other {# aktive Connectors}}",
"mcpServers": "Ihr Tarif enthält {max, plural, one {# aktiven MCP-Server} other {# aktive MCP-Server}}",
"fileSearchConnectors": "Ihr Tarif enthält {max, plural, one {# File-Search-Ordner} other {# File-Search-Ordner}}"
},
"body": "Pausieren Sie einen, um {name} zu aktivieren.",
"bodyCreate": "Pausieren Sie einen, um einen neuen hinzuzufügen, oder wechseln Sie den Tarif.",
"listLabel": "Jetzt aktiv, meistgenutzte zuerst",
"listLabelPlain": "Jetzt aktiv",
"calls": "{count, plural, =0 {keine Aufrufe in 30 Tagen} one {# Aufruf in 30 Tagen} other {# Aufrufe in 30 Tagen}}",
"pauseAndActivate": "Pausieren und aktivieren",
"pauseOnly": "Pausieren",
"working": "Wird umgestellt…",
"cancel": "Abbrechen",
"upgradeTeam": "Auf Team upgraden",
"askEnterprise": "Enterprise anfragen",
"loading": "Wird geladen…",
"empty": "Nichts Aktives zum Pausieren.",
"error": "Umstellen nicht möglich: {message}",
"pausedDone": "{name} ist pausiert. Sie können den neuen jetzt hinzufügen.",
"notice": {
"connectors": "Ihr Tarif enthält {max, plural, one {# aktiven Connector} other {# aktive Connectors}}. Pausieren Sie einen oder wechseln Sie den Tarif.",
"mcpServers": "Ihr Tarif enthält {max, plural, one {# aktiven MCP-Server} other {# aktive MCP-Server}}. Pausieren Sie einen oder wechseln Sie den Tarif.",
"fileSearchConnectors": "Ihr Tarif enthält {max, plural, one {# File-Search-Ordner} other {# File-Search-Ordner}}. Pausieren Sie einen oder wechseln Sie den Tarif.",
"users": "Ihr Tarif enthält {max, plural, one {# Benutzer} other {# Benutzer}}. Für weitere Einladungen wechseln Sie den Tarif."
},
"pauseOne": "Einen pausieren"
},
"planUsage": {
"title": "Nutzung im Tarif {plan}",
"titleTrial": "Nutzung in Ihrer Testphase (Team-Limits)",
"connectors": "Connectors",
"mcpServers": "MCP-Server",
"users": "Benutzer",
"fileSearchFolders": "File-Search-Ordner",
"fileSearchFiles": "File-Search-Dateien",
"fileSearchStorage": "File-Search-Speicher",
"codeTools": "Gespeicherte Code-Tools",
"codeRuns": "Code-Ausführungen diesen Monat",
"inlineCode": "Inline-Code",
"included": "Enthalten",
"notIncluded": "Nicht enthalten",
"inUseNotIncluded": "In Nutzung, nicht enthalten",
"unlimited": "{current} · ohne Limit",
"paused": "{count} durch Ihren Tarif pausiert",
"starterTitle": "Mit Starter",
"seeStarter": "Was sich mit Starter ändert",
"hideStarter": "Ausblenden"
}
}
83 changes: 82 additions & 1 deletion packages/frontend/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,11 @@
"title": "Tool performance",
"description": "Calls, errors and latency by tool, connector and MCP server. This table has its own time range.",
"range": "Tool performance time range",
"ranges": { "24": "Last 24 hours", "168": "Last 7 days", "720": "Last 30 days" },
"ranges": {
"24": "Last 24 hours",
"168": "Last 7 days",
"720": "Last 30 days"
},
"connector": "Filter tool performance by connector",
"server": "Filter tool performance by MCP server",
"allConnectors": "All connectors",
Expand Down Expand Up @@ -3605,5 +3609,82 @@
"directory": "Listed in the Claude Directory",
"directoryChatgpt": "Listed in the ChatGPT Plugin Directory",
"directoryBoth": "Listed in the Claude and ChatGPT directories"
},
"planFit": {
"title": "What changes with {plan}",
"fits": "Everything you use today fits {plan}.",
"chooseTeam": "Choose Team instead",
"showDetails": "See which ones",
"hideDetails": "Hide",
"keep": "Stay active",
"pause": "Paused",
"groups": {
"connectors": "Connectors",
"mcpServers": "MCP servers",
"fileSearch": "File Search folders"
},
"unnamed": "Unnamed",
"lines": {
"connectors": "{paused} of {total} connectors paused (least used). You choose which.",
"mcpServers": "{paused} of {total} MCP servers paused (least used).",
"mcpServersChoose": "{paused} of {total} MCP servers paused (least used). You choose which.",
"users": "{max, plural, one {# user} other {# users}} included, you have {current}. Nobody loses access.",
"fileSearch": "File Search: up to {maxFolders, plural, one {# folder} other {# folders}} and {maxFiles, number} files.",
"fileSearchStorage": "File Search: up to {maxSize} of storage.",
"codeTools": "{max} saved code tools (you have {current}).",
"inline": "No inline code (code_execute)."
}
},
"planSwap": {
"badge": "Paused: plan limit",
"activate": "Activate",
"title": {
"connectors": "Your plan includes {max, plural, one {# active connector} other {# active connectors}}",
"mcpServers": "Your plan includes {max, plural, one {# active MCP server} other {# active MCP servers}}",
"fileSearchConnectors": "Your plan includes {max, plural, one {# File Search folder} other {# File Search folders}}"
},
"body": "Pause one to activate {name}.",
"bodyCreate": "Pause one to add a new one, or upgrade.",
"listLabel": "Active now, most used first",
"listLabelPlain": "Active now",
"calls": "{count, plural, =0 {no calls in 30 days} one {# call in 30 days} other {# calls in 30 days}}",
"pauseAndActivate": "Pause and activate",
"pauseOnly": "Pause",
"working": "Switching…",
"cancel": "Cancel",
"upgradeTeam": "Upgrade to Team",
"askEnterprise": "Ask about Enterprise",
"loading": "Loading…",
"empty": "Nothing active to pause.",
"error": "Could not switch: {message}",
"pausedDone": "{name} is paused. You can add the new one now.",
"notice": {
"connectors": "Your plan includes {max, plural, one {# active connector} other {# active connectors}}. Pause one or upgrade.",
"mcpServers": "Your plan includes {max, plural, one {# active MCP server} other {# active MCP servers}}. Pause one or upgrade.",
"fileSearchConnectors": "Your plan includes {max, plural, one {# File Search folder} other {# File Search folders}}. Pause one or upgrade.",
"users": "Your plan includes {max, plural, one {# user} other {# users}}. Upgrade to invite more."
},
"pauseOne": "Pause one"
},
"planUsage": {
"title": "Usage on {plan}",
"titleTrial": "Usage in your trial (Team limits)",
"connectors": "Connectors",
"mcpServers": "MCP servers",
"users": "Users",
"fileSearchFolders": "File Search folders",
"fileSearchFiles": "File Search files",
"fileSearchStorage": "File Search storage",
"codeTools": "Saved code tools",
"codeRuns": "Code runs this month",
"inlineCode": "Inline code",
"included": "Included",
"notIncluded": "Not included",
"inUseNotIncluded": "In use, not included",
"unlimited": "{current} · no limit",
"paused": "{count} paused by your plan",
"starterTitle": "On Starter",
"seeStarter": "See what changes with Starter",
"hideStarter": "Hide"
}
}
83 changes: 82 additions & 1 deletion packages/frontend/messages/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,11 @@
"title": "Prestazioni degli strumenti",
"description": "Chiamate, errori e latenza per strumento, connettore e server MCP. Questa tabella ha un proprio intervallo di tempo.",
"range": "Periodo delle prestazioni degli strumenti",
"ranges": { "24": "Ultime 24 ore", "168": "Ultimi 7 giorni", "720": "Ultimi 30 giorni" },
"ranges": {
"24": "Ultime 24 ore",
"168": "Ultimi 7 giorni",
"720": "Ultimi 30 giorni"
},
"connector": "Filtra le prestazioni per connettore",
"server": "Filtra le prestazioni per server MCP",
"allConnectors": "Tutti i connettori",
Expand Down Expand Up @@ -3605,5 +3609,82 @@
"directory": "Presente nella Claude Directory",
"directoryChatgpt": "Presente nella directory dei plugin di ChatGPT",
"directoryBoth": "Presente nelle directory di Claude e ChatGPT"
},
"planFit": {
"title": "Cosa cambia con {plan}",
"fits": "Tutto ciò che usi oggi rientra in {plan}.",
"chooseTeam": "Scegli Team",
"showDetails": "Vedi quali",
"hideDetails": "Nascondi",
"keep": "Restano attivi",
"pause": "In pausa",
"groups": {
"connectors": "Connettori",
"mcpServers": "Server MCP",
"fileSearch": "Cartelle File Search"
},
"unnamed": "Senza nome",
"lines": {
"connectors": "{paused} connettori su {total} in pausa (i meno usati). Scegli tu quali.",
"mcpServers": "{paused} server MCP su {total} in pausa (i meno usati).",
"mcpServersChoose": "{paused} server MCP su {total} in pausa (i meno usati). Scegli tu quali.",
"users": "{max, plural, one {# utente incluso} other {# utenti inclusi}}, ne hai {current}. Nessuno perde l’accesso.",
"fileSearch": "File Search: fino a {maxFolders, plural, one {# cartella} other {# cartelle}} e {maxFiles, number} file.",
"fileSearchStorage": "File Search: fino a {maxSize} di spazio.",
"codeTools": "{max} code tool salvati (ne hai {current}).",
"inline": "Niente codice inline (code_execute)."
}
},
"planSwap": {
"badge": "In pausa: limite del piano",
"activate": "Attiva",
"title": {
"connectors": "Il tuo piano include {max, plural, one {# connettore attivo} other {# connettori attivi}}",
"mcpServers": "Il tuo piano include {max, plural, one {# server MCP attivo} other {# server MCP attivi}}",
"fileSearchConnectors": "Il tuo piano include {max, plural, one {# cartella File Search} other {# cartelle File Search}}"
},
"body": "Mettine uno in pausa per attivare {name}.",
"bodyCreate": "Mettine uno in pausa per aggiungerne uno nuovo, oppure cambia piano.",
"listLabel": "Attivi ora, i più usati per primi",
"listLabelPlain": "Attivi ora",
"calls": "{count, plural, =0 {nessuna chiamata in 30 giorni} one {# chiamata in 30 giorni} other {# chiamate in 30 giorni}}",
"pauseAndActivate": "Metti in pausa e attiva",
"pauseOnly": "Metti in pausa",
"working": "Cambio in corso…",
"cancel": "Annulla",
"upgradeTeam": "Passa a Team",
"askEnterprise": "Chiedi di Enterprise",
"loading": "Caricamento…",
"empty": "Niente di attivo da mettere in pausa.",
"error": "Impossibile cambiare: {message}",
"pausedDone": "{name} è in pausa. Ora puoi aggiungere quello nuovo.",
"notice": {
"connectors": "Il tuo piano include {max, plural, one {# connettore attivo} other {# connettori attivi}}. Mettine uno in pausa o cambia piano.",
"mcpServers": "Il tuo piano include {max, plural, one {# server MCP attivo} other {# server MCP attivi}}. Mettine uno in pausa o cambia piano.",
"fileSearchConnectors": "Il tuo piano include {max, plural, one {# cartella File Search} other {# cartelle File Search}}. Mettine una in pausa o cambia piano.",
"users": "Il tuo piano include {max, plural, one {# utente} other {# utenti}}. Cambia piano per invitarne altri."
},
"pauseOne": "Mettine uno in pausa"
},
"planUsage": {
"title": "Utilizzo con {plan}",
"titleTrial": "Utilizzo nella prova (limiti di Team)",
"connectors": "Connettori",
"mcpServers": "Server MCP",
"users": "Utenti",
"fileSearchFolders": "Cartelle File Search",
"fileSearchFiles": "File in File Search",
"fileSearchStorage": "Spazio File Search",
"codeTools": "Code tool salvati",
"codeRuns": "Esecuzioni di codice questo mese",
"inlineCode": "Codice inline",
"included": "Incluso",
"notIncluded": "Non incluso",
"inUseNotIncluded": "In uso, non incluso",
"unlimited": "{current} · nessun limite",
"paused": "{count} in pausa per il piano",
"starterTitle": "Con Starter",
"seeStarter": "Cosa cambia con Starter",
"hideStarter": "Nascondi"
}
}
Loading
Loading