Skip to content
Merged
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
10 changes: 9 additions & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,15 @@ Sentinel is a **read-only audit and logging bot**. To keep it safe and trustwort
- **Moderation actions** (ban, kick, timeout, deleting messages, changing roles or channels): the bot's capability policy blocks them on purpose.
- **Tracking people**: online status, activities, games, music or anything Discord's privileged Presence intent would provide.
- Collecting data that is not needed to review moderation and server activity, or keeping it longer than the configured retention.
- Anything that breaks Discord's Terms of Service or Developer Policy.
- Anything that breaks Discord's Terms of Service, Developer Policy or Monetization Terms.

### Paid plans

Paid plans are sold as Discord subscriptions, and Discord's [Monetization Terms](https://support.discord.com/hc/articles/5330075836311-Monetization-Terms) require that buyers get exactly what was described. So:

- A change that **reduces** a paid plan (lower limit, logger moved to a higher plan or removed, feature taken away) must say so in the pull request. It is released only after subscribers have been told in advance and given time to cancel; the maintainer handles the notice.
- Plan names, prices and benefits must stay consistent across `packages/shared/src/plans.ts`, the pricing page and the Discord SKUs.
- Never add a way to pay outside Discord, discounts or price differences.

## Pull requests

Expand Down
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@
- [ ] Database changes are backward-compatible with the previous release (expand/contract)
- [ ] No moderation capability or new data collection beyond the feature's needs ([scope](https://github.com/haxurus/Sentinel/blob/main/.github/CONTRIBUTING.md#project-scope))
- [ ] New dependencies are necessary and pinned
- [ ] Paid plans are not reduced (limits, loggers, features), or the reduction is described above and subscribers will be notified first
- [ ] Documentation updated where needed
10 changes: 7 additions & 3 deletions apps/web/app/_components/LegalPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ type Section = { title: string; body: Array<string | string[]> };
type Doc = { id: string; kicker: string; title: string; intro: string; sections: Section[] };

const CONTACT = 'haxurus@icloud.com';
const UPDATED = { it: '13 ottobre 2026', en: '13 October 2026' };
const UPDATED = { it: '16 ottobre 2026', en: '16 October 2026' };

const copy: Record<Locale, { kicker: string; title: string; intro: string; updated: string; toc: string; docs: Doc[]; home: string; pricing: string }> = {
en: {
Expand Down Expand Up @@ -95,7 +95,9 @@ const copy: Record<Locale, { kicker: string; title: string; intro: string; updat
]
] },
{ title: 'Plans and payments', body: [
'The Free plan is available to everyone. Paid plans (Plus, Pro, Brand) are sold only as Discord subscriptions, through Discord’s Premium Apps: Discord is the seller, processes the payment and handles taxes, renewals, cancellations and refunds under its own terms. A subscription applies to the server chosen when buying it and stays active until the end of the period paid. The operator may grant free trials or complimentary plans at its discretion. When a paid plan ends, the server returns to the Free plan: features outside it are switched off and its limits apply, but your configuration is not deleted.'
'The Free plan is available to everyone. Paid plans (Plus, Pro, Brand) are sold only as Discord subscriptions, through Discord’s Premium Apps: Discord is the seller, processes the payment and handles taxes, renewals, cancellations and refunds under its own terms. A subscription applies to the server chosen when buying it and stays active until the end of the period paid. The operator may grant free trials or complimentary plans at its discretion. When a paid plan ends, the server returns to the Free plan: features outside it are switched off and its limits apply, but your configuration is not deleted.',
'If we reduce what a paid plan includes, for example by lowering a limit or removing a logger, we tell subscribers in advance, through the support server, the website and the dashboard, so that they can cancel or change their subscription before the change takes effect. Additions and improvements can apply at any time.',
`For any problem with a subscription, contact us at ${CONTACT} or on the support server and we will try to solve it with you; refund requests are decided by Discord under its refund policy.`
] },
{ title: 'Availability', body: [
'We work to keep Sentinel available and reliable, but the service is provided “as is” and “as available”, without guaranteed uptime. Discord outages, missing bot permissions or maintenance can delay or prevent logs.'
Expand Down Expand Up @@ -201,7 +203,9 @@ const copy: Record<Locale, { kicker: string; title: string; intro: string; updat
]
] },
{ title: 'Piani e pagamenti', body: [
'Il piano Free è disponibile per tutti. I piani a pagamento (Plus, Pro, Brand) si acquistano solo come abbonamenti Discord, tramite le App premium di Discord: il venditore è Discord, che elabora il pagamento e gestisce imposte, rinnovi, disdette e rimborsi secondo i propri termini. Un abbonamento vale per il server scelto al momento dell’acquisto e resta attivo fino alla fine del periodo pagato. Il gestore può concedere a sua discrezione periodi di prova o piani omaggio gratuiti. Alla fine di un piano a pagamento il server torna al piano Free: le funzioni non incluse vengono disattivate e si applicano i suoi limiti, ma la configurazione non viene cancellata.'
'Il piano Free è disponibile per tutti. I piani a pagamento (Plus, Pro, Brand) si acquistano solo come abbonamenti Discord, tramite le App premium di Discord: il venditore è Discord, che elabora il pagamento e gestisce imposte, rinnovi, disdette e rimborsi secondo i propri termini. Un abbonamento vale per il server scelto al momento dell’acquisto e resta attivo fino alla fine del periodo pagato. Il gestore può concedere a sua discrezione periodi di prova o piani omaggio gratuiti. Alla fine di un piano a pagamento il server torna al piano Free: le funzioni non incluse vengono disattivate e si applicano i suoi limiti, ma la configurazione non viene cancellata.',
'Se riduciamo ciò che un piano a pagamento include, per esempio abbassando un limite o togliendo un logger, lo comunichiamo prima agli abbonati, tramite il server di supporto, il sito e la dashboard, così che possano disdire o cambiare l’abbonamento prima che la modifica entri in vigore. Aggiunte e miglioramenti possono valere in qualsiasi momento.',
`Per qualsiasi problema con un abbonamento scrivici a ${CONTACT} o sul server di supporto e cercheremo di risolverlo insieme; le richieste di rimborso sono decise da Discord secondo la sua politica di rimborso.`
] },
{ title: 'Disponibilità', body: [
'Lavoriamo per mantenere Sentinel disponibile e affidabile, ma il servizio è fornito “così com’è” e “come disponibile”, senza garanzie di continuità. Disservizi di Discord, permessi mancanti del bot o manutenzioni possono ritardare o impedire i log.'
Expand Down
5 changes: 5 additions & 0 deletions apps/web/app/_components/PricingView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ const copy = {
TIER3: 'Tutto il Livello 2, più nome e banner del bot personalizzati nel tuo server.'
},
subscribe: 'Abbonati su Discord',
priceNote: 'Il prezzo finale nella tua valuta, tasse incluse, è quello mostrato da Discord prima del pagamento.',
scopeNote: 'Ogni abbonamento vale per un solo server e i limiti si contano per server. Sentinel registra solo ciò che Discord rende disponibile ai bot, con i permessi che gli hai dato.',
soon: 'Presto su Discord',
compare: 'Confronto completo',
feature: 'Funzione',
Expand Down Expand Up @@ -75,6 +77,8 @@ const copy = {
TIER3: 'Everything in Level 2, plus a custom bot name and banner in your server.'
},
subscribe: 'Subscribe on Discord',
priceNote: 'The final price in your currency, taxes included, is shown by Discord before you pay.',
scopeNote: 'Each subscription covers one server and the limits apply per server. Sentinel records only what Discord makes available to bots, with the permissions you give it.',
soon: 'Coming soon on Discord',
compare: 'Full comparison',
feature: 'Feature',
Expand Down Expand Up @@ -199,6 +203,7 @@ export default function PricingView({ locale, info }: { locale: Locale; info: Pu
);
})}
</div>
<p className="plan-footnote">{c.priceNote} {c.scopeNote}</p>

<section className="compare">
<h2>{c.compare}</h2>
Expand Down
1 change: 1 addition & 0 deletions apps/web/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,7 @@ textarea { min-height: 84px; resize: vertical; line-height: 1.5; }
.billing-toggle button { min-height: 34px; padding: 0 18px; border: 0; border-radius: 999px; background: transparent; color: var(--muted); font-size: .86rem; font-weight: 600; }
.billing-toggle button.active { background: var(--accent); color: var(--accent-ink); }
.plan-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
.plan-footnote { max-width: 860px; margin: 14px 0 0; color: var(--muted); font-size: .82rem; line-height: 1.55; }
.plan-card { position: relative; display: flex; flex-direction: column; padding: 24px 22px; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); }
.plan-featured { border-color: var(--accent-line); background: radial-gradient(ellipse 80% 60% at 100% 0%, rgba(167,139,250,.10), transparent 70%), var(--surface); }
.plan-level { color: var(--faint); font-size: .7rem; letter-spacing: .12em; }
Expand Down
Loading