Skip to content

Commit 8d08d7f

Browse files
committed
docs: document Pro features with crown badges and license configuration
- Add MAINTENANT_LICENSE_KEY to README and configuration docs - Add Pro license section to configuration guide with activation steps - Add crown icon badges to Pro-only doc sections (alerts, resources, updates, status page) - Document incident management, maintenance windows, subscriber notifications, and CVE enrichment in feature docs - Add subtle Pro mentions in docs index and README editions section - Add mkdocs-material custom CSS for crown icon styling - ProPage: show thank you message when license is active - FeatureGate: link Pro badge to pro-edition page
1 parent 00a9bf8 commit 8d08d7f

File tree

11 files changed

+145
-19
lines changed

11 files changed

+145
-19
lines changed

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ Built-in [Model Context Protocol](https://modelcontextprotocol.io/) server. Quer
144144
| `MAINTENANT_DB` | `./maintenant.db` | SQLite database path |
145145
| `MAINTENANT_BASE_URL` | `http://localhost:8080` | Base URL (used for heartbeat ping URLs) |
146146
| `MAINTENANT_RUNTIME` | auto-detect | Force `docker` or `kubernetes` |
147+
| `MAINTENANT_LICENSE_KEY` | — | Pro license key (enables Pro features) |
147148
| `MAINTENANT_MCP` | `false` | Enable MCP server (Streamable HTTP on `/mcp`) |
148149
| `MAINTENANT_K8S_NAMESPACES` | all | Namespace allowlist (comma-separated) |
149150
| `MAINTENANT_K8S_EXCLUDE_NAMESPACES` | none | Namespace blocklist |
@@ -366,7 +367,7 @@ Full REST API under `/api/v1/` for automation and integration.
366367

367368
## Editions
368369

369-
maintenant is available in two editions:
370+
maintenant is fully functional out of the box. The **Pro Edition** is available for teams that need advanced alerting, vulnerability intelligence, and extended notification channels.
370371

371372
| Feature | Community | Pro |
372373
|---------|:---------:|:---:|
@@ -389,7 +390,13 @@ maintenant is available in two editions:
389390
| Incident management | | x |
390391
| Subscriber notifications | | x |
391392

392-
The Community Edition is fully functional for self-hosted monitoring. maintenant Pro adds advanced alerting, notification channels, and enterprise features.
393+
To activate Pro, set your license key in the environment:
394+
395+
```bash
396+
MAINTENANT_LICENSE_KEY=your-license-key
397+
```
398+
399+
Learn more at [kolapsis.github.io/maintenant](https://kolapsis.github.io/maintenant/).
393400

394401
---
395402

docs/features/alerts.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,21 @@ POST /api/v1/channels
5151

5252
maintenant sends a JSON payload with alert details to the configured URL.
5353

54-
### Pro Channels
55-
54+
### Slack, Teams & Email :material-crown:{ title="Pro" }
5655
maintenant Pro adds native Slack (Block Kit), Microsoft Teams (MessageCard), and Email (SMTP) channels with platform-specific formatting.
5756

58-
---
57+
```bash
58+
POST /api/v1/channels
59+
{
60+
"name": "ops-slack",
61+
"type": "slack",
62+
"url": "https://hooks.slack.com/services/..."
63+
}
64+
```
5965

60-
## Routing Rules
66+
---
6167

68+
## Routing Rules :material-crown:{ title="Pro" }
6269
Route specific alerts to specific channels. Routing rules filter by source, severity, or entity.
6370

6471
```bash

docs/features/resources.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ maintenant collects the following metrics for each container:
2929

3030
maintenant stores metric snapshots and displays them as interactive time-series charts (powered by uPlot). Available time ranges:
3131

32-
| Range | Description |
33-
|-------|-------------|
34-
| 1 hour | Fine-grained, per-second resolution |
35-
| 6 hours | Recent activity |
36-
| 24 hours | Full day view |
37-
| 7 days | Weekly trends |
32+
| Range | Description | Edition |
33+
|-------|-------------|---------|
34+
| 1 hour | Fine-grained, per-second resolution | Community |
35+
| 6 hours | Recent activity | Community |
36+
| 24 hours | Full day view | :material-crown:{ title="Pro" } Pro |
37+
| 7 days | Weekly trends | :material-crown:{ title="Pro" } Pro |
38+
| 30 days | Monthly trends | :material-crown:{ title="Pro" } Pro |
3839

3940
Access historical data via the API:
4041

docs/features/status-page.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,59 @@ The status page includes:
9595

9696
---
9797

98+
## Incident Management :material-crown:{ title="Pro" }
99+
Track and communicate incidents with timeline updates. Each incident has a severity, status, and a history of updates visible on the public status page.
100+
101+
```bash
102+
# Create an incident
103+
POST /api/v1/status/incidents
104+
{
105+
"title": "API latency increase",
106+
"severity": "minor",
107+
"message": "Investigating elevated response times on the API."
108+
}
109+
110+
# Post a timeline update
111+
POST /api/v1/status/incidents/{id}/updates
112+
{
113+
"status": "identified",
114+
"message": "Root cause identified. Deploying fix."
115+
}
116+
```
117+
118+
---
119+
120+
## Maintenance Windows :material-crown:{ title="Pro" }
121+
Schedule planned downtime. Maintenance windows appear on the status page and automatically suppress alerts for affected components.
122+
123+
```bash
124+
POST /api/v1/status/maintenance
125+
{
126+
"title": "Database migration",
127+
"starts_at": "2026-03-10T02:00:00Z",
128+
"ends_at": "2026-03-10T04:00:00Z",
129+
"components": [1, 3]
130+
}
131+
```
132+
133+
---
134+
135+
## Subscriber Notifications :material-crown:{ title="Pro" }
136+
Let users subscribe to status updates. Subscribers receive notifications when incidents are created or updated.
137+
138+
```bash
139+
# List subscribers
140+
GET /api/v1/status/subscribers
141+
142+
# Subscriber sign-up (public endpoint)
143+
POST /status/subscribe
144+
{
145+
"email": "user@example.com"
146+
}
147+
```
148+
149+
---
150+
98151
## API Endpoints
99152

100153
| Method | Endpoint | Description |
@@ -107,6 +160,10 @@ The status page includes:
107160
| `POST` | `/api/v1/status/components` | Create a component |
108161
| `PUT` | `/api/v1/status/components/{id}` | Update a component |
109162
| `DELETE` | `/api/v1/status/components/{id}` | Delete a component |
163+
| `POST` | `/api/v1/status/incidents` | Create incident | :material-crown:{ title="Pro" } |
164+
| `POST` | `/api/v1/status/incidents/{id}/updates` | Post incident update | :material-crown:{ title="Pro" } |
165+
| `POST` | `/api/v1/status/maintenance` | Schedule maintenance | :material-crown:{ title="Pro" } |
166+
| `GET` | `/api/v1/status/subscribers` | List subscribers | :material-crown:{ title="Pro" } |
110167

111168
---
112169

docs/features/updates.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ DELETE /api/v1/updates/exclusions/{id}
7676

7777
---
7878

79+
## CVE Enrichment & Risk Scoring :material-crown:{ title="Pro" }
80+
With maintenant Pro, update intelligence goes beyond digest comparison. Each available update is enriched with vulnerability data:
81+
82+
- **CVE details** — Known vulnerabilities affecting the current and target versions
83+
- **Risk scoring** — Severity-weighted score to prioritize which updates matter most
84+
- **Changelog** — Docker image changelog between current and available versions
85+
86+
```
87+
GET /api/v1/risk
88+
```
89+
90+
---
91+
7992
## Alert Events
8093

8194
| Event | Description | Default Severity |

docs/getting-started/configuration.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ maintenant is configured entirely through environment variables. No configuratio
1717
| `MAINTENANT_UPDATE_INTERVAL` | `24h` | Update intelligence scan interval. Accepts Go duration format (e.g., `12h`, `30m`). |
1818
| `MAINTENANT_K8S_NAMESPACES` | all | Kubernetes namespace allowlist (comma-separated). Empty monitors all namespaces. |
1919
| `MAINTENANT_K8S_EXCLUDE_NAMESPACES` | none | Kubernetes namespace blocklist (comma-separated). |
20+
| `MAINTENANT_LICENSE_KEY` || Pro license key. Enables Pro features when set to a valid key. |
2021
| `MAINTENANT_MCP` | `false` | Enable the MCP server on `/mcp` (Streamable HTTP transport). |
2122
| `MAINTENANT_MCP_ALLOWED_EMAIL` || Restrict MCP access to JWTs matching this email. |
2223

@@ -57,6 +58,28 @@ MAINTENANT_BASE_URL=https://maintenant.example.com
5758

5859
---
5960

61+
## Pro License
62+
63+
To enable Pro features (Slack/Teams/Email channels, CVE enrichment, incident management, maintenance windows, subscriber notifications, and more), set the `MAINTENANT_LICENSE_KEY` environment variable:
64+
65+
```yaml
66+
services:
67+
maintenant:
68+
image: ghcr.io/kolapsis/maintenant-pro:latest
69+
environment:
70+
MAINTENANT_LICENSE_KEY: "your-license-key"
71+
```
72+
73+
The license is verified periodically against the license server. If the server is temporarily unreachable, Pro features remain active from cache with a graceful degradation window.
74+
75+
You can check the current license status via the API:
76+
77+
```
78+
GET /api/v1/license/status
79+
```
80+
81+
---
82+
6083
## Security Model
6184

6285
maintenant does not include built-in authentication — by design.

docs/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Deploy one container, and maintenant auto-discovers your entire stack. Docker or
2222
- **[TLS Certificate Monitoring](features/certificates.md)** — Auto-detection from HTTPS endpoints. Alerts at 30, 14, 7, 3, and 1 day before expiry. Full chain validation.
2323
- **[Resource Metrics](features/resources.md)** — CPU, memory, network I/O, disk I/O per container. Historical charts, alert thresholds, top consumers view.
2424
- **[Update Intelligence](features/updates.md)** — OCI registry scanning, digest comparison. Know when your images have updates available.
25-
- **[Alert Engine](features/alerts.md)** — Unified alerts across all sources. Webhook and Discord channels. Silence rules, exponential backoff.
26-
- **[Public Status Page](features/status-page.md)** — Component groups, incident management, scheduled maintenance.
25+
- **[Alert Engine](features/alerts.md)** — Unified alerts across all sources. Webhook and Discord channels. Silence rules, exponential backoff. Slack, Teams, and Email with Pro.
26+
- **[Public Status Page](features/status-page.md)** — Component groups, live SSE updates. Incident management, maintenance windows, and subscriber notifications with Pro.
2727
- **[MCP Server](features/mcp.md)** — Expose monitoring data to AI assistants (Claude Code, Cursor) via the Model Context Protocol. 18 tools, stdio and HTTP transports.
2828

2929
---

docs/stylesheets/extra.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/* Pro edition crown icon */
2+
h2 .twemoji,
3+
h3 .twemoji,
4+
td .twemoji {
5+
color: #f59e0b;
6+
}

frontend/src/components/FeatureGate.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import { computed } from 'vue'
1616
import { useEdition } from '@/composables/useEdition'
1717
import { Lock, Sparkles } from 'lucide-vue-next'
18+
import { RouterLink } from 'vue-router'
1819
1920
const props = defineProps<{
2021
feature: string
@@ -31,7 +32,10 @@ const enabled = computed(() => edition.value?.features[props.feature] === true)
3132
<template v-else-if="!enabled">
3233
<slot name="placeholder">
3334
<!-- Default placeholder when no custom one is provided -->
34-
<div v-if="title" class="relative w-full rounded-xl border border-zinc-800 bg-[#12151C] px-5 py-5">
35+
<div
36+
v-if="title"
37+
class="relative w-full rounded-xl border border-zinc-800 bg-[#12151C] px-5 py-5"
38+
>
3539
<div class="flex items-start justify-between gap-4">
3640
<div class="min-w-0">
3741
<div class="flex items-center gap-2 mb-1">
@@ -42,12 +46,17 @@ const enabled = computed(() => edition.value?.features[props.feature] === true)
4246
{{ description }}
4347
</p>
4448
</div>
45-
<div class="flex items-center gap-1.5 shrink-0 mt-0.5">
49+
<router-link
50+
:to="{ name: 'pro-edition' }"
51+
class="flex items-center gap-1.5 shrink-0 mt-0.5"
52+
>
4653
<Lock class="h-3 w-3 text-indigo-400/60" />
47-
<span class="rounded-full bg-indigo-600/15 px-2.5 py-0.5 text-[10px] font-semibold text-indigo-400">
54+
<span
55+
class="rounded-full bg-indigo-600/15 px-2.5 py-0.5 text-[10px] font-semibold text-indigo-400"
56+
>
4857
Pro
4958
</span>
50-
</div>
59+
</router-link>
5160
</div>
5261
</div>
5362
</slot>

frontend/src/layouts/DefaultLayout.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ const mainNav = [
114114
</div>
115115
<button
116116
v-if="!isEnterprise"
117-
class="block w-full py-1.5 bg-slate-700/50 text-slate-300 hover:text-slate-200 rounded-lg text-xs font-semibold text-center transition-colors"
117+
class="cursor-pointer block w-full py-1.5 bg-slate-700/50 text-slate-300 hover:text-slate-200 rounded-lg text-xs font-semibold text-center transition-colors"
118118
>
119119
Pro Edition
120120
</button>

0 commit comments

Comments
 (0)