diff --git a/website/landing/hub.html b/website/landing/hub.html index a2eb33c4..56cacd35 100644 --- a/website/landing/hub.html +++ b/website/landing/hub.html @@ -38,6 +38,44 @@ max-width: 24px; max-height: 24px; } + + /* Feature cards */ + .hub-feature-card { + padding: 1.5rem; + border: 1px solid #e4e4e7; + border-radius: 0.75rem; + background: #fff; + transition: box-shadow 0.2s ease, border-color 0.2s ease, transform 0.2s ease; + display: flex; + flex-direction: column; + } + .hub-feature-card:hover { + box-shadow: 0 8px 32px -8px rgba(0,0,0,0.12); + border-color: #a1a1aa; + transform: translateY(-2px); + } + .hub-feature-icon { + width: 2.5rem; + height: 2.5rem; + border-radius: 0.5rem; + background: #f5f3ff; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 1rem; + flex-shrink: 0; + } + .hub-feature-grid { + display: grid; + gap: 1.25rem; + max-width: 56rem; + margin: 0 auto; + } + @media (min-width: 768px) { + .hub-feature-grid { + grid-template-columns: repeat(2, 1fr); + } + } @@ -125,20 +163,19 @@
-
- +
+ - + Coming soon

- See what's happening
- - in production + Uncloud Hub:
+ See what's happening in production

- Uncloud Hub is the UI and Grafana stack for your Uncloud clusters.
+ Uncloud Hub is the command center for your Uncloud clusters.
Get real-time metrics, logs, and alerts out of the box to catch issues early and fix faster.

@@ -146,7 +183,7 @@
- Help shape Hub + Get early access
@@ -266,105 +303,65 @@

- Frustrated by the complexity of setting up observability? + Your app is deployed. Now what?

- Observability is what killing the joy of shipping. + Deploying is the easy part. Everything after is where most teams get stuck.

- -
-
- - - - -
- -
Build
-
The fun part.
-
- - -
- -
Ship
-
uc deploy and you're done.
-
- - -
- -
Run / Monitor and observe
-

This is what matters.

-
- - -
-

- Observability for developers who'd rather be shipping. -

-

- It's not optional. -

-
- - -
    -
  • - - Are you finding out about outages from your users? + +
    +
    +
      + +
    • + + Machines provisioned
    • -
    • - - When something breaks, where do you start looking? +
    • + + App deployed — uc deploy
    • -
    • - - Prometheus or VictoriaMetrics? Loki or VictoriaLogs? +
    • + + HTTPS and custom domain
    • -
    • - - Vector, Grafana Alloy, or Fluent Bit? + + +
    • + + +
    • + + Services healthy right now?
    • -
    • - - Which alerts wake you for real problems, not 3 AM noise? +
    • + + Logs you can search when something breaks? +
    • +
    • + + Alerts before users notice? +
    • +
    • + + Which deploy caused that error spike? +
    • +
    • + + Memory or CPU creeping up overnight?
    - -

    - And that's before you've drawn a single graph. -

    - - -
    - -
    - - -
    + +
    +
    +
    +
    +

    Your cluster, at a glance

    +

    Hub provides you with a comprehensive view of your cluster's health and activity.

    +
    +
    + +
    +
    +
    + + + +
    +
    +

    Services

    +

    See what's running, where it's deployed, and whether it's healthy - across every machine.

    +
    +
    +
    +
    + + + +
    +
    +

    Machines

    +

    See all nodes, their status, and what's running on each one. No terminal required.

    +
    +
    +
    +
    + + + +
    +
    +

    Clusters

    +

    Manage multiple clusters from one place. Switch context without touching a config file.

    +
    +
    +
    + +
    +
    + Hub cluster dashboard +
    +

    PLACEHOLDER IMAGE

    +
    +
    +
    +
    +
    +
    @@ -384,11 +438,162 @@ Untangle the observability mess and start monitoring instantly

    - A hosted Grafana stack that knows about your Uncloud apps. + Hub provides a hosted Grafana stack that knows about your Uncloud apps.

    - ... + +
    + + +
    +
    + + + +
    +

    HTTP request metrics

    +

    Response times, error rates, and traffic patterns from every service. Caddy is already collecting this. Hub just shows it to you.

    +
    + + +
    +
    + + + + + + +
    +

    Container logs, always searchable

    +

    Filter by service, level, or time range. Jump from an anomaly in your metrics straight to the logs from that exact window.

    +
    + + +
    +
    + + + + + +
    +

    Slow Postgres queries

    +

    Find which queries are dragging down response times. Sorted by impact so you know where to look first, not a wall of query logs.

    +
    + + +
    +
    + + + + +
    +

    Alerts on what actually affects users

    +

    Get notified when error rates spike or latency climbs past your threshold. Know before a user reports it. Not after.

    +
    + +
    +
    +
    + + + +
    +
    +
    +
    + +
    +

    What's next for Uncloud Hub

    +

    Upcoming features to make Hub even more useful

    +
    + +
      + +
    • + +
      +

      Team access

      +

      Share cluster access with your team without handling SSH keys or root credentials.

      +
      +
    • + +
    • + +
      +

      Push to deploy

      +

      Deploy applications from your Git repository automatically.

      +
      +
    • + +
    • + +
      +

      Migration assistant

      +

      Move your data and services from the cloud and onto your own machines automagically.

      +
      +
    • + +
    + + +

    ...Add your most-needed feature

    +

    Something missing from this list? Tell us about your pain points.

    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +

    + Get early access +

    +

    + Hub isn't open yet. Leave your email and we'll reach out when it's ready. +

    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + +

    + Or email pasha@uncloud.run directly. +

    + +
    diff --git a/website/landing/images/dashboard-machines.png b/website/landing/images/dashboard-machines.png new file mode 100644 index 00000000..0446e18e Binary files /dev/null and b/website/landing/images/dashboard-machines.png differ diff --git a/website/landing/images/service-log.png b/website/landing/images/service-log.png new file mode 100644 index 00000000..59195f8f Binary files /dev/null and b/website/landing/images/service-log.png differ diff --git a/website/landing/style.css b/website/landing/style.css index 0ce90478..6bee60bc 100644 --- a/website/landing/style.css +++ b/website/landing/style.css @@ -1159,36 +1159,8 @@ input[type="search"]::-webkit-search-results-decoration { bottom: -0.25rem; } -.-left-\[33px\]{ - left: -33px; -} - -.-left-\[35px\]{ - left: -35px; -} - -.bottom-0{ - bottom: 0px; -} - -.left-3{ - left: 0.75rem; -} - -.top-0{ - top: 0px; -} - -.top-0\.5{ - top: 0.125rem; -} - -.top-1{ - top: 0.25rem; -} - -.top-1\.5{ - top: 0.375rem; +.left-1\/2{ + left: 50%; } .top-2{ @@ -1208,19 +1180,10 @@ input[type="search"]::-webkit-search-results-decoration { margin-right: auto; } -.my-6{ - margin-top: 1.5rem; - margin-bottom: 1.5rem; -} - .mb-1{ margin-bottom: 0.25rem; } -.mb-10{ - margin-bottom: 2.5rem; -} - .mb-2{ margin-bottom: 0.5rem; } @@ -1257,6 +1220,10 @@ input[type="search"]::-webkit-search-results-decoration { margin-right: 0.5rem; } +.mr-2\.5{ + margin-right: 0.625rem; +} + .mr-3{ margin-right: 0.75rem; } @@ -1301,6 +1268,10 @@ input[type="search"]::-webkit-search-results-decoration { margin-top: 2rem; } +.mb-1\.5{ + margin-bottom: 0.375rem; +} + .block{ display: block; } @@ -1349,14 +1320,6 @@ input[type="search"]::-webkit-search-results-decoration { height: 6rem; } -.h-3{ - height: 0.75rem; -} - -.h-3\.5{ - height: 0.875rem; -} - .h-4{ height: 1rem; } @@ -1373,18 +1336,10 @@ input[type="search"]::-webkit-search-results-decoration { height: 2rem; } -.h-auto{ - height: auto; -} - .h-full{ height: 100%; } -.h-px{ - height: 1px; -} - .min-h-screen{ min-height: 100vh; } @@ -1405,14 +1360,6 @@ input[type="search"]::-webkit-search-results-decoration { width: 0.625rem; } -.w-3{ - width: 0.75rem; -} - -.w-3\.5{ - width: 0.875rem; -} - .w-4{ width: 1rem; } @@ -1437,14 +1384,6 @@ input[type="search"]::-webkit-search-results-decoration { width: 100%; } -.w-px{ - width: 1px; -} - -.max-w-2xl{ - max-width: 42rem; -} - .max-w-3xl{ max-width: 48rem; } @@ -1453,10 +1392,6 @@ input[type="search"]::-webkit-search-results-decoration { max-width: 56rem; } -.max-w-5xl{ - max-width: 64rem; -} - .max-w-6xl{ max-width: 72rem; } @@ -1477,6 +1412,18 @@ input[type="search"]::-webkit-search-results-decoration { max-width: 20rem; } +.max-w-lg{ + max-width: 32rem; +} + +.max-w-2xl{ + max-width: 42rem; +} + +.flex-shrink{ + flex-shrink: 1; +} + .shrink-0{ flex-shrink: 0; } @@ -1531,18 +1478,10 @@ input[type="search"]::-webkit-search-results-decoration { grid-template-columns: repeat(2, minmax(0, 1fr)); } -.grid-cols-\[20\%_20\%_1fr\]{ - grid-template-columns: 20% 20% 1fr; -} - .flex-col{ flex-direction: column; } -.flex-wrap{ - flex-wrap: wrap; -} - .items-start{ align-items: flex-start; } @@ -1683,6 +1622,15 @@ input[type="search"]::-webkit-search-results-decoration { border-top-width: 1px; } +.border-dashed{ + border-style: dashed; +} + +.border-emerald-300{ + --tw-border-opacity: 1; + border-color: rgb(110 231 183 / var(--tw-border-opacity)); +} + .border-gray-200{ --tw-border-opacity: 1; border-color: rgb(229 231 235 / var(--tw-border-opacity)); @@ -1702,20 +1650,25 @@ input[type="search"]::-webkit-search-results-decoration { border-color: rgb(228 228 231 / var(--tw-border-opacity)); } +.border-zinc-300{ + --tw-border-opacity: 1; + border-color: rgb(212 212 216 / var(--tw-border-opacity)); +} + .border-zinc-700\/50{ border-color: rgb(63 63 70 / 0.5); } +.border-zinc-400{ + --tw-border-opacity: 1; + border-color: rgb(161 161 170 / var(--tw-border-opacity)); +} + .bg-emerald-100{ --tw-bg-opacity: 1; background-color: rgb(209 250 229 / var(--tw-bg-opacity)); } -.bg-emerald-500{ - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); -} - .bg-gray-100{ --tw-bg-opacity: 1; background-color: rgb(243 244 246 / var(--tw-bg-opacity)); @@ -1751,16 +1704,6 @@ input[type="search"]::-webkit-search-results-decoration { background-color: rgb(234 179 8 / var(--tw-bg-opacity)); } -.bg-zinc-200{ - --tw-bg-opacity: 1; - background-color: rgb(228 228 231 / var(--tw-bg-opacity)); -} - -.bg-zinc-300{ - --tw-bg-opacity: 1; - background-color: rgb(212 212 216 / var(--tw-bg-opacity)); -} - .bg-zinc-50{ --tw-bg-opacity: 1; background-color: rgb(250 250 250 / var(--tw-bg-opacity)); @@ -1789,31 +1732,17 @@ input[type="search"]::-webkit-search-results-decoration { background-image: linear-gradient(to right, var(--tw-gradient-stops)); } -.from-zinc-300{ - --tw-gradient-from: #d4d4d8 var(--tw-gradient-from-position); - --tw-gradient-to: rgb(212 212 216 / 0) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); -} - .from-zinc-500{ --tw-gradient-from: #71717a var(--tw-gradient-from-position); --tw-gradient-to: rgb(113 113 122 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } -.from-\[40\%\]{ - --tw-gradient-from-position: 40%; -} - .via-zinc-900{ --tw-gradient-to: rgb(24 24 27 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), #18181b var(--tw-gradient-via-position), var(--tw-gradient-to); } -.to-transparent{ - --tw-gradient-to: transparent var(--tw-gradient-to-position); -} - .to-zinc-900{ --tw-gradient-to: #18181b var(--tw-gradient-to-position); } @@ -1880,16 +1809,16 @@ input[type="search"]::-webkit-search-results-decoration { padding-right: 0.5rem; } -.px-3{ - padding-left: 0.75rem; - padding-right: 0.75rem; -} - .px-4{ padding-left: 1rem; padding-right: 1rem; } +.px-5{ + padding-left: 1.25rem; + padding-right: 1.25rem; +} + .px-6{ padding-left: 1.5rem; padding-right: 1.5rem; @@ -1910,6 +1839,11 @@ input[type="search"]::-webkit-search-results-decoration { padding-bottom: 0.25rem; } +.py-1\.5{ + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + .py-12{ padding-top: 3rem; padding-bottom: 3rem; @@ -1920,11 +1854,6 @@ input[type="search"]::-webkit-search-results-decoration { padding-bottom: 0.5rem; } -.py-3{ - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - .py-4{ padding-top: 1rem; padding-bottom: 1rem; @@ -1935,6 +1864,15 @@ input[type="search"]::-webkit-search-results-decoration { padding-bottom: 2rem; } +.py-16{ + padding-top: 4rem; + padding-bottom: 4rem; +} + +.pb-1{ + padding-bottom: 0.25rem; +} + .pb-10{ padding-bottom: 2.5rem; } @@ -1947,20 +1885,12 @@ input[type="search"]::-webkit-search-results-decoration { padding-bottom: 1rem; } -.pb-8{ - padding-bottom: 2rem; -} - -.pl-10{ - padding-left: 2.5rem; -} - .pl-4{ padding-left: 1rem; } -.pr-2{ - padding-right: 0.5rem; +.pt-2{ + padding-top: 0.5rem; } .pt-32{ @@ -2034,12 +1964,6 @@ input[type="search"]::-webkit-search-results-decoration { line-height: 1.5715; } -.text-xl{ - font-size: 1.25rem; - line-height: 1.5; - letter-spacing: -0.017em; -} - .text-xs{ font-size: 0.75rem; line-height: 1.5; @@ -2057,6 +1981,10 @@ input[type="search"]::-webkit-search-results-decoration { font-weight: 600; } +.font-normal{ + font-weight: 400; +} + .uppercase{ text-transform: uppercase; } @@ -2070,12 +1998,12 @@ input[type="search"]::-webkit-search-results-decoration { font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); } -.leading-relaxed{ - line-height: 1.625; +.leading-none{ + line-height: 1; } -.leading-snug{ - line-height: 1.375; +.leading-relaxed{ + line-height: 1.625; } .tracking-tight{ @@ -2086,10 +2014,6 @@ input[type="search"]::-webkit-search-results-decoration { letter-spacing: 0.025em; } -.tracking-wider{ - letter-spacing: 0.05em; -} - .text-black{ --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity)); @@ -2100,6 +2024,11 @@ input[type="search"]::-webkit-search-results-decoration { color: rgb(16 185 129 / var(--tw-text-opacity)); } +.text-emerald-600{ + --tw-text-opacity: 1; + color: rgb(5 150 105 / var(--tw-text-opacity)); +} + .text-emerald-700{ --tw-text-opacity: 1; color: rgb(4 120 87 / var(--tw-text-opacity)); @@ -2134,6 +2063,16 @@ input[type="search"]::-webkit-search-results-decoration { color: transparent; } +.text-violet-600{ + --tw-text-opacity: 1; + color: rgb(124 58 237 / var(--tw-text-opacity)); +} + +.text-violet-700{ + --tw-text-opacity: 1; + color: rgb(109 40 217 / var(--tw-text-opacity)); +} + .text-white{ --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -2226,17 +2165,6 @@ input[type="search"]::-webkit-search-results-decoration { --tw-shadow: var(--tw-shadow-colored); } -.ring-4{ - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-zinc-50{ - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - .blur{ --tw-blur: blur(8px); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); @@ -2266,6 +2194,10 @@ input[type="search"]::-webkit-search-results-decoration { transition-duration: 150ms; } +.\[background\:linear-gradient\(theme\(colors\.white\)\2c theme\(colors\.white\)\)_padding-box\2c linear-gradient\(120deg\2c theme\(colors\.violet\.400\)\2c theme\(colors\.purple\.300\)\2c theme\(colors\.violet\.400\)\)_border-box\]{ + background: linear-gradient(#fff,#fff) padding-box,linear-gradient(120deg,#a78bfa,#d8b4fe,#a78bfa) border-box; +} + .\[background\:linear-gradient\(theme\(colors\.white\)\2c theme\(colors\.white\)\)_padding-box\2c linear-gradient\(120deg\2c theme\(colors\.zinc\.300\)\2c theme\(colors\.zinc\.100\)\2c theme\(colors\.zinc\.300\)\)_border-box\]{ background: linear-gradient(#fff,#fff) padding-box,linear-gradient(120deg,#d4d4d8,#f4f4f5,#d4d4d8) border-box; } @@ -2278,6 +2210,10 @@ input[type="search"]::-webkit-search-results-decoration { background: linear-gradient(#27272a,#27272a) padding-box,linear-gradient(120deg,#3f3f46,rgb(63 63 70 / 0),#3f3f46) border-box; } +.\[background\:linear-gradient\(theme\(colors\.violet\.50\)\2c theme\(colors\.violet\.50\)\)_padding-box\2c linear-gradient\(120deg\2c theme\(colors\.violet\.400\)\2c theme\(colors\.purple\.300\)\2c theme\(colors\.violet\.400\)\)_border-box\]{ + background: linear-gradient(#f5f3ff,#f5f3ff) padding-box,linear-gradient(120deg,#a78bfa,#d8b4fe,#a78bfa) border-box; +} + /* See Alpine.js: https://github.com/alpinejs/alpine#x-cloak */ [x-cloak=""] { @@ -2452,11 +2388,21 @@ input[type="search"]::-webkit-search-results-decoration { background-color: rgb(39 39 42 / var(--tw-bg-opacity)); } +.hover\:bg-zinc-100:hover{ + --tw-bg-opacity: 1; + background-color: rgb(244 244 245 / var(--tw-bg-opacity)); +} + .hover\:text-zinc-900:hover{ --tw-text-opacity: 1; color: rgb(24 24 27 / var(--tw-text-opacity)); } +.hover\:text-white:hover{ + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + .hover\:underline:hover{ text-decoration-line: underline; } @@ -2565,18 +2511,6 @@ input[type="search"]::-webkit-search-results-decoration { } @media (min-width: 640px){ - .sm\:-left-\[37px\]{ - left: -37px; - } - - .sm\:-left-\[39px\]{ - left: -39px; - } - - .sm\:left-4{ - left: 1rem; - } - .sm\:col-span-6{ grid-column: span 6 / span 6; } @@ -2639,16 +2573,6 @@ input[type="search"]::-webkit-search-results-decoration { padding-right: 1.5rem; } - .sm\:pl-12{ - padding-left: 3rem; - } - - .sm\:text-2xl{ - font-size: 1.5rem; - line-height: 1.415; - letter-spacing: -0.017em; - } - .sm\:text-\[0\.9375rem\]{ font-size: 0.9375rem; } @@ -2696,10 +2620,6 @@ input[type="search"]::-webkit-search-results-decoration { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .md\:grid-cols-\[15\%_15\%_1fr\]{ - grid-template-columns: 15% 15% 1fr; - } - .md\:gap-0{ gap: 0px; } @@ -2724,6 +2644,11 @@ input[type="search"]::-webkit-search-results-decoration { padding-bottom: 5rem; } + .md\:py-24{ + padding-top: 6rem; + padding-bottom: 6rem; + } + .md\:pb-16{ padding-bottom: 4rem; } @@ -2736,6 +2661,10 @@ input[type="search"]::-webkit-search-results-decoration { padding-top: 10rem; } + .md\:pb-14{ + padding-bottom: 3.5rem; + } + .md\:text-3xl{ font-size: 2rem; line-height: 1.3125;