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/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 152259f0..f6967dd4 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -13,7 +13,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18.18.0 + node-version-file: .nvmrc cache: "pnpm" - run: pnpm install --frozen-lockfile - run: pnpm biome ci diff --git a/.nvmrc b/.nvmrc index 842f8cc4..ee3b4246 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1,3 +1 @@ -18.18.0 - - +24.4.0 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.