From 958c1bdbdd2b66106a8cde768f39ccc1fee4b9a2 Mon Sep 17 00:00:00 2001 From: Peter Gonda Date: Wed, 14 Oct 2026 08:32:34 +0200 Subject: [PATCH 1/2] chore: make lint-and-typecheck green (biome + TS7 typecheck) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PR gate never passed (PR #1 was the repo's first), so both steps had pre-existing debt unrelated to any feature change. biome: - biome format across the repo (formatting + organizeImports), 45 files - ignore the generated apps/docs/public/openapi.json (exceeds size rule) - relax style/complexity nits for apps/docs/scripts/** (codegen; delete is intentional) typecheck (under the repo's TypeScript 7.0.2 native compiler + React 19): - bump framer-motion 11.3.19 -> 14.2.0 (its motion types resolve under TS7/React 19; same import path and APIs) — clears 11 motion className errors - useRef(undefined) / RefObject cast for React 19 (use-debounce, number-ticker) - type getTags/getPostsByTag returns in lib/ghost.ts (no more unknown in blog pages) - blog code renderer: drop the removed react-markdown inline prop; coerce img src - OG route: wrap Buffer in Uint8Array (valid BodyInit) - ContactFormModal: map the extra 'other' inquiry type to '' for ContactForm Both `pnpm biome ci` and `pnpm typecheck` pass locally. --- .claude/launch.json | 9 +- apps/docs/app/docs/[[...slug]]/page.tsx | 2 +- apps/docs/app/llms.txt/route.ts | 4 +- apps/docs/components/NavLinks.tsx | 8 +- .../content/docs/core/dns-providers/meta.json | 5 +- .../docs/core/secrets-providers/meta.json | 9 +- apps/docs/next.config.mjs | 4 +- apps/docs/scripts/fix-api-paths.mjs | 2 +- apps/docs/scripts/fix-openapi.mjs | 9 +- apps/website/app/api/contact/route.ts | 4 +- .../app/api/github-contributors/route.ts | 10 +- apps/website/app/api/og/route.ts | 4 +- .../app/blog/[slug]/components/shared.ts | 8 +- apps/website/app/blog/[slug]/page.tsx | 35 ++- apps/website/app/comparison/page.tsx | 9 +- apps/website/app/contact/page.tsx | 2 +- apps/website/app/deploy-ai/page.tsx | 18 +- .../application-deployment-platform/page.tsx | 59 +++-- .../application-management-software/page.tsx | 40 +-- apps/website/app/features/audit-logs/page.tsx | 10 +- .../container-server-monitoring/page.tsx | 23 +- .../database-management-tool/page.tsx | 39 +-- .../role-based-access-control/page.tsx | 16 +- apps/website/app/features/security/page.tsx | 7 +- .../app/features/white-labeling/page.tsx | 12 +- .../app/industries/higher-education/page.tsx | 6 +- apps/website/app/jobs/page.tsx | 12 +- apps/website/app/nomploy-vs-caprover/page.tsx | 163 ++++++++++--- apps/website/app/nomploy-vs-coolify/page.tsx | 99 ++++++-- apps/website/app/nomploy-vs-dokku/page.tsx | 111 ++++++--- .../website/app/nomploy-vs-portainer/page.tsx | 193 +++++++++++---- apps/website/app/nomploy-vs-render/page.tsx | 118 ++++++--- apps/website/app/nomploy-vs-vercel/page.tsx | 121 +++++++--- apps/website/app/partners/page.tsx | 12 +- apps/website/app/privacy/page.tsx | 69 +++--- apps/website/app/robots.ts | 5 +- apps/website/app/self-hosted-paas/page.tsx | 56 +++-- apps/website/app/terms-of-service/page.tsx | 228 +++++++++--------- apps/website/components/ContactForm.tsx | 89 +++---- apps/website/components/ContactFormModal.tsx | 5 +- apps/website/components/PartnerForm.tsx | 10 +- apps/website/components/comparison-stats.tsx | 8 +- apps/website/components/shared/Logo.tsx | 7 +- apps/website/components/stats.tsx | 38 ++- .../website/components/ui/navigation-menu.tsx | 216 ++++++++--------- apps/website/components/ui/number-ticker.tsx | 7 +- apps/website/lib/ghost.ts | 13 +- apps/website/lib/hooks/use-debounce.ts | 2 +- apps/website/lib/slack.ts | 8 +- apps/website/package.json | 2 +- apps/website/tsconfig.json | 72 +++--- biome.json | 23 +- pnpm-lock.yaml | 33 ++- 53 files changed, 1267 insertions(+), 807 deletions(-) diff --git a/.claude/launch.json b/.claude/launch.json index 9e5453e4..7de61887 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -4,7 +4,14 @@ { "name": "website", "runtimeExecutable": "pnpm", - "runtimeArgs": ["--filter=website", "exec", "next", "dev", "--port", "3020"], + "runtimeArgs": [ + "--filter=website", + "exec", + "next", + "dev", + "--port", + "3020" + ], "port": 3020 }, { diff --git a/apps/docs/app/docs/[[...slug]]/page.tsx b/apps/docs/app/docs/[[...slug]]/page.tsx index 8df18d5c..3e5a1dd7 100644 --- a/apps/docs/app/docs/[[...slug]]/page.tsx +++ b/apps/docs/app/docs/[[...slug]]/page.tsx @@ -1,5 +1,5 @@ import { CopyMarkdownButton } from "@/components/copy-markdown-button"; -import { getPageImage, getLLMText, source } from "@/lib/source"; +import { getLLMText, getPageImage, source } from "@/lib/source"; import { getMDXComponents } from "@/mdx-components"; import { DocsBody, diff --git a/apps/docs/app/llms.txt/route.ts b/apps/docs/app/llms.txt/route.ts index 34c25469..ae6902e5 100644 --- a/apps/docs/app/llms.txt/route.ts +++ b/apps/docs/app/llms.txt/route.ts @@ -6,9 +6,7 @@ const baseUrl = "https://docs.nomploy.com"; export function GET() { const pages = source.getPages(); - const docsPages = pages.filter( - (page) => !page.url.startsWith("/docs/api/"), - ); + const docsPages = pages.filter((page) => !page.url.startsWith("/docs/api/")); const lines = [ "# Nomploy Documentation", diff --git a/apps/docs/components/NavLinks.tsx b/apps/docs/components/NavLinks.tsx index 996c9e94..5744abe8 100644 --- a/apps/docs/components/NavLinks.tsx +++ b/apps/docs/components/NavLinks.tsx @@ -6,13 +6,7 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Menu } from "lucide-react"; -import { - Github, - Globe, - Heart, - LayoutGrid, - MessagesSquare, -} from "lucide-react"; +import { Github, Globe, Heart, LayoutGrid, MessagesSquare } from "lucide-react"; export function NavLinks() { const links = [ diff --git a/apps/docs/content/docs/core/dns-providers/meta.json b/apps/docs/content/docs/core/dns-providers/meta.json index b7d79c59..6518e581 100644 --- a/apps/docs/content/docs/core/dns-providers/meta.json +++ b/apps/docs/content/docs/core/dns-providers/meta.json @@ -1,7 +1,4 @@ { "title": "DNS Providers", - "pages": [ - "cloudflare", - "route53" - ] + "pages": ["cloudflare", "route53"] } diff --git a/apps/docs/content/docs/core/secrets-providers/meta.json b/apps/docs/content/docs/core/secrets-providers/meta.json index 47eb50d0..543e0904 100644 --- a/apps/docs/content/docs/core/secrets-providers/meta.json +++ b/apps/docs/content/docs/core/secrets-providers/meta.json @@ -1,11 +1,4 @@ { "title": "Secrets Providers", - "pages": [ - "hashicorp", - "infisical", - "aws", - "doppler", - "azure", - "scaleway" - ] + "pages": ["hashicorp", "infisical", "aws", "doppler", "azure", "scaleway"] } diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs index 1083afe4..bbca3006 100644 --- a/apps/docs/next.config.mjs +++ b/apps/docs/next.config.mjs @@ -7,7 +7,9 @@ const config = { reactStrictMode: true, output: "standalone", outputFileTracingIncludes: { - "/**": ["../../node_modules/.pnpm/@swc+helpers@*/node_modules/@swc/helpers/**"], + "/**": [ + "../../node_modules/.pnpm/@swc+helpers@*/node_modules/@swc/helpers/**", + ], }, images: { remotePatterns: [ diff --git a/apps/docs/scripts/fix-api-paths.mjs b/apps/docs/scripts/fix-api-paths.mjs index 06819028..36774c13 100644 --- a/apps/docs/scripts/fix-api-paths.mjs +++ b/apps/docs/scripts/fix-api-paths.mjs @@ -3,7 +3,7 @@ * Converts slash notation (/tag/operation) to dot notation (/tag.operation) * so they match our OpenAPI schema paths and display the real API path. */ -import { readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { readFileSync, readdirSync, writeFileSync } from "node:fs"; import { join } from "node:path"; const API_DOCS_DIR = join(process.cwd(), "content", "docs", "api"); diff --git a/apps/docs/scripts/fix-openapi.mjs b/apps/docs/scripts/fix-openapi.mjs index a1ba17ca..2b91318d 100644 --- a/apps/docs/scripts/fix-openapi.mjs +++ b/apps/docs/scripts/fix-openapi.mjs @@ -10,7 +10,10 @@ try { let unwrapped = false; // If the spec is nested (e.g. result.data.json from a migrated/source API), use the inner spec - if (openapi.result?.data?.json && typeof openapi.result.data.json === "object") { + if ( + openapi.result?.data?.json && + typeof openapi.result.data.json === "object" + ) { openapi = openapi.result.data.json; unwrapped = true; console.log("✓ Unwrapped nested OpenAPI spec (result.data.json)"); @@ -114,7 +117,9 @@ try { } if (removed > 0) { writeFileSync(openapiPath, JSON.stringify(openapi, null, 2)); - console.log(`✓ Removed ${removed} slash path alias(es), keeping dot paths only`); + console.log( + `✓ Removed ${removed} slash path alias(es), keeping dot paths only`, + ); } if (!(unwrapped || fixed > 0 || securityFixed) && removed === 0) { diff --git a/apps/website/app/api/contact/route.ts b/apps/website/app/api/contact/route.ts index 51316bb0..eac7eba9 100644 --- a/apps/website/app/api/contact/route.ts +++ b/apps/website/app/api/contact/route.ts @@ -57,9 +57,7 @@ export async function POST(request: NextRequest) { // Notify the team on Slack (sales and support go to the same channel) const slackSuccess = await notifySlack(body); if (!slackSuccess) { - console.error( - `Failed to deliver ${body.inquiryType} inquiry to Slack`, - ); + console.error(`Failed to deliver ${body.inquiryType} inquiry to Slack`); return NextResponse.json( { error: diff --git a/apps/website/app/api/github-contributors/route.ts b/apps/website/app/api/github-contributors/route.ts index bb99cfc3..e64e6af0 100644 --- a/apps/website/app/api/github-contributors/route.ts +++ b/apps/website/app/api/github-contributors/route.ts @@ -12,8 +12,7 @@ export async function GET() { { contributors_count: cachedContributors.count }, { headers: { - "Cache-Control": - "public, s-maxage=1800, stale-while-revalidate=3600", + "Cache-Control": "public, s-maxage=1800, stale-while-revalidate=3600", }, }, ); @@ -43,9 +42,7 @@ export async function GET() { if (linkHeader) { // Parse last page number from Link header: <...?page=N>; rel="last" - const lastMatch = linkHeader.match( - /[&?]page=(\d+)[^>]*>;\s*rel="last"/, - ); + const lastMatch = linkHeader.match(/[&?]page=(\d+)[^>]*>;\s*rel="last"/); if (lastMatch) { count = Number.parseInt(lastMatch[1], 10); } @@ -60,8 +57,7 @@ export async function GET() { { contributors_count: count }, { headers: { - "Cache-Control": - "public, s-maxage=1800, stale-while-revalidate=3600", + "Cache-Control": "public, s-maxage=1800, stale-while-revalidate=3600", }, }, ); diff --git a/apps/website/app/api/og/route.ts b/apps/website/app/api/og/route.ts index 784bcba3..9517e705 100644 --- a/apps/website/app/api/og/route.ts +++ b/apps/website/app/api/og/route.ts @@ -22,7 +22,7 @@ export async function GET(request: NextRequest) { label: "Nomploy - Open Source Templates", }); - return new Response(ogImage, { + return new Response(new Uint8Array(ogImage), { headers: { "Content-Type": "image/png", "Cache-Control": "public, max-age=86400, stale-while-revalidate", @@ -65,7 +65,7 @@ export async function GET(request: NextRequest) { readingTime: post.reading_time, }); - return new Response(ogImage, { + return new Response(new Uint8Array(ogImage), { headers: { "Content-Type": "image/png", "Cache-Control": "public, max-age=31536000, immutable", diff --git a/apps/website/app/blog/[slug]/components/shared.ts b/apps/website/app/blog/[slug]/components/shared.ts index d30727f6..8400997e 100644 --- a/apps/website/app/blog/[slug]/components/shared.ts +++ b/apps/website/app/blog/[slug]/components/shared.ts @@ -10,9 +10,9 @@ export async function highlight(code: string, lang: BundledLanguage) { lang, theme: "houston", }); - return toJsxRuntime(out, { - Fragment: react.Fragment, - jsx: jsxRuntime.jsx, - jsxs: jsxRuntime.jsxs + return toJsxRuntime(out, { + Fragment: react.Fragment, + jsx: jsxRuntime.jsx, + jsxs: jsxRuntime.jsxs, }) as JSX.Element; } diff --git a/apps/website/app/blog/[slug]/page.tsx b/apps/website/app/blog/[slug]/page.tsx index 9f92e193..1d667112 100644 --- a/apps/website/app/blog/[slug]/page.tsx +++ b/apps/website/app/blog/[slug]/page.tsx @@ -87,21 +87,20 @@ export default async function BlogPostPage({ params }: Props) { const scripts = doc.querySelectorAll( 'script[type="application/ld+json"], script', ); - scripts.forEach((script) => script.remove()); + for (const script of scripts) script.remove(); const unwantedElements = doc.querySelectorAll("style, meta, link"); - unwantedElements.forEach((el) => el.remove()); + for (const el of unwantedElements) el.remove(); return doc.body.innerHTML; - } else { - return html - .replace( - /]*type="application\/ld\+json"[^>]*>[\s\S]*?<\/script>/gi, - "", - ) - .replace(/]*>[\s\S]*?<\/script>/gi, "") - .replace(/]*>[\s\S]*?<\/style>/gi, "") - .replace(/]*>/gi, "") - .replace(/]*>/gi, ""); } + return html + .replace( + /]*type="application\/ld\+json"[^>]*>[\s\S]*?<\/script>/gi, + "", + ) + .replace(/]*>[\s\S]*?<\/script>/gi, "") + .replace(/]*>[\s\S]*?<\/style>/gi, "") + .replace(/]*>/gi, "") + .replace(/]*>/gi, ""); }; const turndownService = new TurndownService({ @@ -186,7 +185,7 @@ export default async function BlogPostPage({ params }: Props) { ), img: ({ node, src, alt }) => ( @@ -194,13 +193,13 @@ export default async function BlogPostPage({ params }: Props) { code: ({ className, children, - inline, }: { - className: string; - children: React.ReactNode; - inline: boolean; + className?: string; + children?: React.ReactNode; }) => { - if (inline || !className || !/language-(\w+)/.test(className)) { + // react-markdown no longer passes an `inline` prop — treat code without a + // language-* class as inline. + if (!className || !/language-(\w+)/.test(className)) { return ( {children} diff --git a/apps/website/app/comparison/page.tsx b/apps/website/app/comparison/page.tsx index da1a1f9d..b2df4a61 100644 --- a/apps/website/app/comparison/page.tsx +++ b/apps/website/app/comparison/page.tsx @@ -1,15 +1,15 @@ -import { Container } from "@/components/Container"; import { CallToAction } from "@/components/CallToAction"; +import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; -import { ArrowRight, GitBranch, Activity, Users, Gauge } from "lucide-react"; -import Link from "next/link"; +import { Activity, ArrowRight, Gauge, GitBranch, Users } from "lucide-react"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Nomploy Vs. and PaaS Comparison Pages | Nomploy", description: - "How does Nomploy compare to other application deployment, database management, and PaaS solutions? Learn on our \"Nomploy vs.\" alternative comparison pages.", + 'How does Nomploy compare to other application deployment, database management, and PaaS solutions? Learn on our "Nomploy vs." alternative comparison pages.', }; const competitors = [ @@ -170,7 +170,6 @@ export default function ComparisonPage() { - {/* Final CTA */} diff --git a/apps/website/app/contact/page.tsx b/apps/website/app/contact/page.tsx index 2a53001c..91156eca 100644 --- a/apps/website/app/contact/page.tsx +++ b/apps/website/app/contact/page.tsx @@ -1,7 +1,7 @@ "use client"; -import { Container } from "@/components/Container"; import { ContactForm } from "@/components/ContactForm"; +import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { cn } from "@/lib/utils"; import { useState } from "react"; diff --git a/apps/website/app/deploy-ai/page.tsx b/apps/website/app/deploy-ai/page.tsx index 5096b2b0..511e2b40 100644 --- a/apps/website/app/deploy-ai/page.tsx +++ b/apps/website/app/deploy-ai/page.tsx @@ -2,20 +2,20 @@ import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { + Activity, Bot, Boxes, - Activity, - Users, + FlaskConical, + KeyRound, MousePointerClick, Network, - KeyRound, - ShieldCheck, - FlaskConical, Rocket, + ShieldCheck, Sparkles, + Users, } from "lucide-react"; -import Link from "next/link"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Deploy AI Apps Securely with Nomploy", @@ -133,7 +133,11 @@ export default function DeployAIPage() { className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0]" asChild > - + Contact Us diff --git a/apps/website/app/features/application-deployment-platform/page.tsx b/apps/website/app/features/application-deployment-platform/page.tsx index 35bf5f9b..ea8030dd 100644 --- a/apps/website/app/features/application-deployment-platform/page.tsx +++ b/apps/website/app/features/application-deployment-platform/page.tsx @@ -1,37 +1,37 @@ -import { Container } from "@/components/Container"; import { CallToAction } from "@/components/CallToAction"; -import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; +import { Container } from "@/components/Container"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { + Bot, + Clock, + Cloud, + CloudCog, Code2, - Layers, - Wrench, - GitBranch, - Webhook, Eye, + FileCode, FolderInput, - Server, - Cloud, + GitBranch, + Layers, + LayoutDashboard, LayoutTemplate, - Workflow, - FileCode, RotateCcw, - LayoutDashboard, - CloudCog, - Clock, - Users, - Bot, + Server, Shield, + Users, + Webhook, + Workflow, + Wrench, } from "lucide-react"; +import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; -import type { Metadata } from "next"; export const metadata: Metadata = { title: "Application & Software Deployment Platform", @@ -247,7 +247,11 @@ export default function ApplicationDeploymentPlatformPage() { className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0]" asChild > - + Contact Us @@ -295,7 +299,9 @@ export default function ApplicationDeploymentPlatformPage() { Deploy the apps your teams are already building with AI

- AI coding tools are changing how applications get written. Nomploy handles the deployment side, from AI-generated code to a live URL, powered by your existing workflows. + AI coding tools are changing how applications get written. Nomploy + handles the deployment side, from AI-generated code to a live URL, + powered by your existing workflows.

@@ -315,9 +321,12 @@ export default function ApplicationDeploymentPlatformPage() { ))}
-

Need a governed environment for AI tools?

+

+ Need a governed environment for AI tools? +

- See how Nomploy handles sandboxed deploys, non-technical users, and enterprise security for AI-built apps. + See how Nomploy handles sandboxed deploys, non-technical users, + and enterprise security for AI-built apps.

@@ -435,9 +444,9 @@ export default function ApplicationDeploymentPlatformPage() { Hundreds of templates to get started

- Deploy popular open-source apps in one click with Nomploy Templates, - a ready-to-run library of pre-configured apps you can deploy fast, - without rebuilding the same stack from scratch. + Deploy popular open-source apps in one click with Nomploy + Templates, a ready-to-run library of pre-configured apps you can + deploy fast, without rebuilding the same stack from scratch.

diff --git a/apps/website/app/features/application-management-software/page.tsx b/apps/website/app/features/application-management-software/page.tsx index 3e231b2b..c91cde38 100644 --- a/apps/website/app/features/application-management-software/page.tsx +++ b/apps/website/app/features/application-management-software/page.tsx @@ -1,32 +1,32 @@ -import { Container } from "@/components/Container"; import { CallToAction } from "@/components/CallToAction"; -import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; +import { Container } from "@/components/Container"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { Activity, - FileText, - RotateCcw, + CheckCircle2, Clock, - Eye, - Settings2, - Server, Cloud, Cpu, - Network, - Terminal, + Eye, + FileText, HardDrive, Lock, - CheckCircle2, + Network, + RotateCcw, + Server, + Settings2, + Terminal, } from "lucide-react"; +import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; -import type { Metadata } from "next"; export const metadata: Metadata = { title: "Application Management Software and Solutions", @@ -198,7 +198,11 @@ export default function ApplicationManagementSoftwarePage() { className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0]" asChild > - + Contact Us @@ -412,7 +416,9 @@ export default function ApplicationManagementSoftwarePage() { Deploy AI in a controlled environment

- Use Nomploy to create sandbox environments separated from production infrastructure, where technical and non-technical employees can launch AI-coded apps safely. + Use Nomploy to create sandbox environments separated from + production infrastructure, where technical and non-technical + employees can launch AI-coded apps safely.

@@ -444,7 +450,9 @@ export default function ApplicationManagementSoftwarePage() { {step.number}

{step.title}

-

{step.description}

+

+ {step.description} +

))} @@ -465,7 +473,9 @@ export default function ApplicationManagementSoftwarePage() {

diff --git a/apps/website/app/features/audit-logs/page.tsx b/apps/website/app/features/audit-logs/page.tsx index 17a2d2dc..14bc5fb6 100644 --- a/apps/website/app/features/audit-logs/page.tsx +++ b/apps/website/app/features/audit-logs/page.tsx @@ -2,17 +2,17 @@ import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { - ScrollText, + AlertCircle, Building2, - Search, FileCheck, - AlertCircle, - Shield, KeyRound, Paintbrush, + ScrollText, + Search, + Shield, } from "lucide-react"; -import Link from "next/link"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Audit Logs for Enterprise Compliance", diff --git a/apps/website/app/features/container-server-monitoring/page.tsx b/apps/website/app/features/container-server-monitoring/page.tsx index 6685174f..4546a132 100644 --- a/apps/website/app/features/container-server-monitoring/page.tsx +++ b/apps/website/app/features/container-server-monitoring/page.tsx @@ -2,19 +2,19 @@ import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { + Bell, Cpu, - MemoryStick, + Database, HardDrive, + LayoutDashboard, + MemoryStick, Network, - Bell, - Settings, Server, + Settings, Shield, - Database, - LayoutDashboard, } from "lucide-react"; -import Link from "next/link"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Server & Container Monitoring | Network, CPU, Memory Monitoring Tool", @@ -65,8 +65,7 @@ const alertFeatures = [ { icon: Settings, title: "Easy alert management", - description: - "Disable alerts by just setting your limits to zero.", + description: "Disable alerts by just setting your limits to zero.", }, ]; @@ -359,7 +358,9 @@ export default function ContainerServerMonitoringPage() {

{faq.question}

-

{faq.answer}

+

+ {faq.answer} +

))} @@ -374,8 +375,8 @@ export default function ContainerServerMonitoringPage() { Container and Server monitoring tool

- Take advantage of Nomploy's comprehensive container and server - monitoring software alongside the rest of the platform. + Take advantage of Nomploy's comprehensive container and + server monitoring software alongside the rest of the platform.

diff --git a/apps/website/app/features/database-management-tool/page.tsx b/apps/website/app/features/database-management-tool/page.tsx index 1de72136..e1aa75e5 100644 --- a/apps/website/app/features/database-management-tool/page.tsx +++ b/apps/website/app/features/database-management-tool/page.tsx @@ -1,34 +1,34 @@ -import { Container } from "@/components/Container"; import { CallToAction } from "@/components/CallToAction"; -import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; +import { Container } from "@/components/Container"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { - Database, Activity, - Shield, + AlertTriangle, Archive, - FileText, - RotateCcw, - Link2, Container as ContainerIcon, - Terminal, - HardDrive, Cpu, + Database, + FileText, + HardDrive, + KeyRound, Keyboard, - AlertTriangle, + Link2, Lock, - KeyRound, + RotateCcw, + Shield, ShieldCheck, + Terminal, } from "lucide-react"; +import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; -import type { Metadata } from "next"; export const metadata: Metadata = { title: "Database Management Tool & Deployment Software", @@ -213,7 +213,11 @@ export default function DatabaseManagementToolPage() { className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0]" asChild > - + Contact Us @@ -357,9 +361,8 @@ export default function DatabaseManagementToolPage() {

Your database data is stored on your own server. Nomploy creates - Docker containers on your infrastructure, so you have full - control over your data—no third parties, no external - dependencies. + Docker containers on your infrastructure, so you have full control + over your data—no third parties, no external dependencies.

@@ -396,7 +399,9 @@ export default function DatabaseManagementToolPage() {

diff --git a/apps/website/app/features/role-based-access-control/page.tsx b/apps/website/app/features/role-based-access-control/page.tsx index d814302e..0d3cc1fb 100644 --- a/apps/website/app/features/role-based-access-control/page.tsx +++ b/apps/website/app/features/role-based-access-control/page.tsx @@ -2,17 +2,17 @@ import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { - Shield, - Users, FolderLock, - SlidersHorizontal, - UserPlus, KeyRound, - ScrollText, Paintbrush, + ScrollText, + Shield, + SlidersHorizontal, + UserPlus, + Users, } from "lucide-react"; -import Link from "next/link"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Role-Based Access Control for Teams", @@ -186,8 +186,8 @@ export default function RoleBasedAccessControlPage() { Ready to take your business to the next level?

- Talk to us about fine-grained RBAC and the rest of - Nomploy's higher-tier feature set. + Talk to us about fine-grained RBAC and the rest of Nomploy's + higher-tier feature set.

))} diff --git a/apps/website/app/features/white-labeling/page.tsx b/apps/website/app/features/white-labeling/page.tsx index 23b46884..d4faec6e 100644 --- a/apps/website/app/features/white-labeling/page.tsx +++ b/apps/website/app/features/white-labeling/page.tsx @@ -2,17 +2,17 @@ import { Container } from "@/components/Container"; import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Button } from "@/components/ui/button"; import { - Paintbrush, - Type, - Palette, + KeyRound, Link2, MonitorCheck, - Shield, - KeyRound, + Paintbrush, + Palette, ScrollText, + Shield, + Type, } from "lucide-react"; -import Link from "next/link"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "White Label Deployment Platform", diff --git a/apps/website/app/industries/higher-education/page.tsx b/apps/website/app/industries/higher-education/page.tsx index eb91163a..d7ee816d 100644 --- a/apps/website/app/industries/higher-education/page.tsx +++ b/apps/website/app/industries/higher-education/page.tsx @@ -139,7 +139,8 @@ const data: IndustryPageData = { }, { area: "Git workflows", - support: "GitHub, GitLab, Bitbucket, Gitea, and webhook-based auto deploys", + support: + "GitHub, GitLab, Bitbucket, Gitea, and webhook-based auto deploys", }, { area: "Access control", @@ -178,7 +179,8 @@ const data: IndustryPageData = { "Yes. Nomploy supports multiple deployment methods, including Git-based apps, Dockerfiles, and Docker Compose. It also supports common databases used in coursework, including PostgreSQL, MySQL, MongoDB, Redis, and MariaDB.", }, { - question: "Can universities connect Nomploy to existing identity systems?", + question: + "Can universities connect Nomploy to existing identity systems?", answer: "Nomploy Enterprise includes single sign-on options through providers such as Auth0, Keycloak, and other OIDC/SAML providers. That makes it easier to fit Nomploy into existing institutional access workflows.", }, diff --git a/apps/website/app/jobs/page.tsx b/apps/website/app/jobs/page.tsx index 587698ab..e76d3554 100644 --- a/apps/website/app/jobs/page.tsx +++ b/apps/website/app/jobs/page.tsx @@ -1,10 +1,10 @@ import { Container } from "@/components/Container"; +import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import AnimatedGridPattern from "@/components/ui/animated-grid-pattern"; -import { MapPin, ArrowRight } from "lucide-react"; -import Link from "next/link"; +import { ArrowRight, MapPin } from "lucide-react"; import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { title: "Nomploy Jobs & Open Positions", @@ -41,8 +41,9 @@ export default function JobsPage() {

We're a small, focused team building tools that developers - actually love. If you care about open source, developer experience, - and shipping things that matter — you'll fit right in. + actually love. If you care about open source, developer + experience, and shipping things that matter — you'll fit + right in.