Files
mcphub/web/index.html
airano-ir 43fd2201a0 feat(v3.13.0): settings live DB reads, remove Directus/Appwrite, admin stats
Settings fixes:
- MAX_SITES_PER_USER, USER_RATE_LIMIT_PER_MIN/HR now read from DB settings
  table (DB > ENV > default), so dashboard/settings changes apply without
  restart. Sync cache refreshed on every save or delete.
- /api/me reports the live DB value for max_sites_per_user.

Admin improvements:
- Admin users bypass per-user rate limiting entirely (role=admin or ADMIN_EMAILS).
- Admin Overview now shows platform stats: registered users, new users (7d),
  total user sites, available tools.

Plugin cleanup:
- Appwrite and Directus plugins removed from the active registry (8 plugins
  now: WordPress, WooCommerce, WordPress Specialist, Gitea, n8n, Supabase,
  OpenPanel, Coolify). Plugin code is retained for future re-enabling.
- Settings page plugin visibility list updated to match.

Mobile onboarding:
- Stepper steps on narrow viewports stack vertically with correct full border
  and rounded corners on each step.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 23:33:20 +02:00

56 lines
2.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/static/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="color-scheme" content="dark light" />
<title>MCP Hub</title>
<!--
Restore lang / dir / theme from localStorage BEFORE the React bundle
runs. This prevents the brief flash where the dashboard renders in
English-LTR-Dark before the persisted FA-RTL-Light user preference
kicks in. It also makes the html[dir="rtl"] CSS rules apply on the
first paint, so the sidebar lands on the correct side immediately.
-->
<script>
(function () {
try {
var raw = localStorage.getItem("mcphub-ui");
var parsed = raw ? JSON.parse(raw) : null;
var state = parsed && parsed.state ? parsed.state : null;
if (!state) return;
var lang = state.lang === "fa" ? "fa" : "en";
document.documentElement.setAttribute("lang", lang);
document.documentElement.setAttribute("dir", lang === "fa" ? "rtl" : "ltr");
var themePref = state.theme === "light" || state.theme === "system" ? state.theme : "dark";
var resolved = themePref;
if (themePref === "system" && window.matchMedia) {
resolved = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
}
document.documentElement.setAttribute("data-theme", resolved);
document.documentElement.setAttribute("data-theme-pref", themePref);
if (state.brandHue) {
document.documentElement.style.setProperty("--brand-hue", String(state.brandHue));
}
} catch (_) {
/* localStorage unavailable; React will recover on hydrate */
}
})();
</script>
<!-- Fonts.bunny.net is a privacy-respecting, Google Fontscompatible
mirror that resolves reliably from networks where
fonts.googleapis.com is rate-limited or blocked (e.g. Iran).
The CSS2 URL contract is identical — we only swap the host. -->
<link rel="preconnect" href="https://fonts.bunny.net" crossorigin />
<link
href="https://fonts.bunny.net/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&family=Instrument+Serif:ital@0;1&family=Vazirmatn:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>