diff --git a/README.md b/README.md index 6b6cf901..970dd926 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@
-QuickStack Logo +QuickStack Logo + +

QuickStack

Free, open-source, self-hosted PaaS alternative to Vercel, Netlify, Railway and Heroku. @@ -16,7 +18,7 @@ Deploy and manage **applications** and **databases** on your own VPS, Bare Metal QuickStack Logo
-*Deploying a Demo app with PostgreSQL in under two minutes.* +*Deploying a Next.JS app with PostgreSQL.*
@@ -40,28 +42,35 @@ After installation, open QuickStack in your browser and start deploying your app ## Key Features -- **Flexible deployments:** Deploy from public or private Git repos and registries using Railpack or your own Dockerfile. +- **Flexible deployments:** Deploy from public or private Git repos and registries using Railpack, guided framework builds, or your own Dockerfile. +- **Framework builds:** Deploy Next.js, React, Angular, Nuxt, Astro, and SvelteKit with preconfigured build commands, output paths, and ports—then adjust them when your project needs it. +- **Project Canvas:** Manage each project's Apps, databases, network connections, configuration, builds, logs, backups, and lifecycle actions from one visual workspace. - **One-click apps and databases:** Launch popular apps, PostgreSQL, MySQL, MariaDB, MongoDB, and Redis in seconds. -- **Runtime controls:** Scale replicas, set CPU and memory resources, and configure health checks, env vars, and file mounts. +- **Runtime controls:** Scale replicas, set CPU and memory resources, and configure health checks, environment variables, Dockerfile build arguments, and file mounts. - **Multi-server support:** Add nodes and keep persistent data on replicated Longhorn volumes. - **Secure networking:** Isolate apps by default and add unlimited custom domains with automatic Let's Encrypt SSL. - **Monitoring:** Stream logs and monitor CPU, RAM, storage, and health in real time. -- **Backups you control:** Schedule volume backups to S3-compatible storage and create native database dumps. +- **Backups you control:** Schedule volume backups to S3-compatible storage, optionally run them before deployments, and create native database dumps. - **Team-ready access:** Control project and app access with user groups, roles, OIDC SSO, 2FA, and expiring API keys. - **Automation and rollbacks:** Deploy via webhook or REST API and roll back to a previous version in one click. +- **MCP integration (canary):** Enable the remote Model Context Protocol server for controlled QuickStack access from compatible AI clients. - **Self-hosted and open source:** Install with one command, update from the UI, and avoid lock-in with GPL-3.0 source code. QuickStack app overview ## How QuickStack Compares -QuickStack is a self-hosted, Kubernetes-native alternative to platforms like [Coolify](https://coolify.io), [Dokku](https://dokku.com), [Dokploy](https://dokploy.com), [Portainer](https://www.portainer.io) and [CapRover](https://caprover.com). Under the hood, QuickStack installs and manages [K3s](https://docs.k3s.io/), a lightweight Kubernetes distribution, together with [Longhorn](https://longhorn.io/docs/latest/what-is-longhorn/) for distributed persistent storage across nodes. This gives you proven Kubernetes primitives such as scheduling, services, ingress, persistent volumes, jobs, probes and multi-node orchestration through a simple web interface for day-to-day deployments. +QuickStack is a self-hosted alternative to platforms like [Coolify](https://coolify.io), [Dokku](https://dokku.com), [Dokploy](https://dokploy.com), [Portainer](https://www.portainer.io) and [CapRover](https://caprover.com). Under the hood, QuickStack installs and manages [K3s](https://docs.k3s.io/), a lightweight Kubernetes distribution, together with [Longhorn](https://longhorn.io/docs/latest/what-is-longhorn/) for distributed persistent storage across nodes. This gives you proven Kubernetes primitives such as scheduling, services, ingress, persistent volumes, jobs, probes and multi-node orchestration through a simple web interface for day-to-day deployments. No knowledge of Kubernetes is required to use QuickStack. ## Contributing Contributions are very welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for details. +## Security + +To report a vulnerability privately, see [SECURITY.md](SECURITY.md). + ## About QuickStack was originally developed as a student project by [glueh-wyy-huet](https://github.com/glueh-wyy-huet) and [biersoeckli](https://github.com/biersoeckli) at the [Eastern Switzerland University of Applied Sciences](https://ost.ch/). Since then, new features have been added to make QuickStack a powerful and user-friendly platform for self-hosting. diff --git a/github-assets/qs-app-detail.png b/github-assets/qs-app-detail.png deleted file mode 100644 index 482b6a60..00000000 Binary files a/github-assets/qs-app-detail.png and /dev/null differ diff --git a/github-assets/qs-app-overview-2.png b/github-assets/qs-app-overview-2.png deleted file mode 100644 index 28920629..00000000 Binary files a/github-assets/qs-app-overview-2.png and /dev/null differ diff --git a/github-assets/qs-app-overview.png b/github-assets/qs-app-overview.png index 842342b6..25c1105e 100644 Binary files a/github-assets/qs-app-overview.png and b/github-assets/qs-app-overview.png differ diff --git a/github-assets/qs-logo-header.svg b/github-assets/qs-logo-header.svg deleted file mode 100644 index 67bc2a6b..00000000 --- a/github-assets/qs-logo-header.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/github-assets/quickstack-github-readme-demo-video.gif b/github-assets/quickstack-github-readme-demo-video.gif index 0b0be933..5d3d1e77 100644 Binary files a/github-assets/quickstack-github-readme-demo-video.gif and b/github-assets/quickstack-github-readme-demo-video.gif differ diff --git a/github-assets/quickstack-icon.svg b/github-assets/quickstack-icon.svg new file mode 100644 index 00000000..e910967b --- /dev/null +++ b/github-assets/quickstack-icon.svg @@ -0,0 +1,19 @@ + + QuickStack icon — light mode + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/quick-stack-logo-light.png b/public/quick-stack-logo-light.png deleted file mode 100644 index 3c0f0ace..00000000 Binary files a/public/quick-stack-logo-light.png and /dev/null differ diff --git a/public/quickstack-icon-dark.png b/public/quickstack-icon-dark.png index d29009cb..63586efa 100644 Binary files a/public/quickstack-icon-dark.png and b/public/quickstack-icon-dark.png differ diff --git a/public/quickstack-icon.png b/public/quickstack-icon.png new file mode 100644 index 00000000..6e0525f7 Binary files /dev/null and b/public/quickstack-icon.png differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index ff7e1f6c..739fdfe3 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -25,9 +25,9 @@ export const metadata: Metadata = { title: "QuickStack", description: "", // todo icons: [ - { rel: "favicon", url: "/quickstack-icon-dark.png" }, - { rel: "icon", url: "/quickstack-icon-dark.png" }, - { rel: "apple-touch-icon", url: "/quickstack-icon-dark.png" } + { rel: "favicon", url: "/quickstack-icon.png" }, + { rel: "icon", url: "/quickstack-icon.png" }, + { rel: "apple-touch-icon", url: "/quickstack-icon.png" } ], }; diff --git a/src/app/sidebar-client.tsx b/src/app/sidebar-client.tsx index a8640459..95d7937f 100644 --- a/src/app/sidebar-client.tsx +++ b/src/app/sidebar-client.tsx @@ -109,8 +109,8 @@ export function SidebarCient({ -
- +
+
QuickStack diff --git a/src/components/custom/quickstack-logo.tsx b/src/components/custom/quickstack-logo.tsx index 2e858f89..415b06ae 100644 --- a/src/components/custom/quickstack-logo.tsx +++ b/src/components/custom/quickstack-logo.tsx @@ -1,82 +1,23 @@ +import { cn } from "@/frontend/utils/utils"; +import Image from "next/image"; -const defaultLight = (className?: string) => - - - - - - - - - - - - - -; - -const defaultDark = (className?: string) => - - - - - - - - - - - - - -; - -const allLight = (className?: string) => - - - - - - - - - - - - - -; - -export default function QuickStackLogo({ - color = "light", - className, -}: { - color: "light" | "dark" | "light-all" - className?: string; -}) { - if (color === "light") { - return defaultLight(className); - } - if (color === "dark") { - return defaultDark(className); - } - if (color === "light-all") { - return allLight(className); - } - return null; +export default function QuickStackLogo({ className }: { className?: string }) { + return ( + <> + + + + ); }