diff --git a/web/app/docs/about/code-of-conduct/page.tsx b/web/app/docs/about/code-of-conduct/page.tsx index cbe96b1..d147e71 100644 --- a/web/app/docs/about/code-of-conduct/page.tsx +++ b/web/app/docs/about/code-of-conduct/page.tsx @@ -64,4 +64,4 @@ export default async function CodeOfConductPage() { ) -} \ No newline at end of file +} diff --git a/web/app/docs/about/faq/page.tsx b/web/app/docs/about/faq/page.tsx index 48cf871..5b8a952 100644 --- a/web/app/docs/about/faq/page.tsx +++ b/web/app/docs/about/faq/page.tsx @@ -206,4 +206,4 @@ export default function FaqPage() { ); -} \ No newline at end of file +} diff --git a/web/app/docs/create-vm/page.tsx b/web/app/docs/create-vm/page.tsx index ebf98d7..b98a2dc 100644 --- a/web/app/docs/create-vm/page.tsx +++ b/web/app/docs/create-vm/page.tsx @@ -84,7 +84,7 @@ export default function VirtualMachinesPage() { diff --git a/web/app/docs/create-vm/synology/page.tsx b/web/app/docs/create-vm/synology/page.tsx index e137689..b18603e 100644 --- a/web/app/docs/create-vm/synology/page.tsx +++ b/web/app/docs/create-vm/synology/page.tsx @@ -241,7 +241,7 @@ export default function Page() {

You can upload custom loaders from the local storage options:

@@ -345,7 +345,7 @@ export default function Page() {

@@ -355,7 +355,7 @@ export default function Page() {

@@ -372,7 +372,7 @@ export default function Page() {

@@ -382,7 +382,7 @@ export default function Page() {

@@ -399,7 +399,7 @@ export default function Page() {

@@ -410,7 +410,7 @@ export default function Page() {

@@ -433,7 +433,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -443,7 +443,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -453,7 +453,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -476,12 +476,12 @@ export default function Page() { {activeLoader === "arc" && (
@@ -491,17 +491,17 @@ export default function Page() { {activeLoader === "rr" && (
@@ -511,12 +511,12 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -541,7 +541,7 @@ export default function Page() { automatically reboot once the process is complete.

@@ -550,22 +550,22 @@ export default function Page() { the loader:

@@ -575,17 +575,17 @@ export default function Page() { {activeLoader === "rr" && (
@@ -595,22 +595,22 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -634,7 +634,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -644,7 +644,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -654,7 +654,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -677,7 +677,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -687,7 +687,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -697,7 +697,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -719,7 +719,7 @@ export default function Page() {

Follow the on-screen steps to complete the DSM installation.

@@ -729,7 +729,7 @@ export default function Page() { is nearing completion.

@@ -833,4 +833,3 @@ function StepNumber({ number }: { number: number }) {
) } - diff --git a/web/app/docs/create-vm/system-linux/page.tsx b/web/app/docs/create-vm/system-linux/page.tsx index c677e2b..c53706f 100644 --- a/web/app/docs/create-vm/system-linux/page.tsx +++ b/web/app/docs/create-vm/system-linux/page.tsx @@ -49,7 +49,7 @@ export default function LinuxVMContent() {
@@ -351,7 +351,7 @@ export default function LinuxVMContent() {
@@ -411,7 +411,7 @@ export default function LinuxVMContent() {
diff --git a/web/app/docs/create-vm/system-nas/page.tsx b/web/app/docs/create-vm/system-nas/page.tsx index 716cde5..cbd3777 100644 --- a/web/app/docs/create-vm/system-nas/page.tsx +++ b/web/app/docs/create-vm/system-nas/page.tsx @@ -164,7 +164,7 @@ export default function SystemNASPage() {
diff --git a/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx b/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx index 88a859c..cfdf2a7 100644 --- a/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx +++ b/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx @@ -468,7 +468,7 @@ export default function OtherNASSystemsPage() {

Shell Interface

TrueNAS SCALE Shell InterfaceWeb Interface
TrueNAS SCALE Web InterfaceShell Interface
TrueNAS CORE Shell InterfaceWeb Interface
TrueNAS CORE Web InterfaceShell Interface
OpenMediaVault Shell InterfaceWeb Interface
OpenMediaVault Web InterfaceShell Interface
Rockstor Shell InterfaceWeb Interface
Rockstor Web Interface @@ -412,7 +412,7 @@ export default function WindowsVMPage() {
@@ -492,7 +492,7 @@ export default function WindowsVMPage() { During Windows installation, if no disks are shown on the “Where do you want to install Windows?” screen, it means the required storage drivers for your selected disk interface (such as SCSI or VirtIO) are not available. You'll need to load them manually.

@@ -505,7 +505,7 @@ export default function WindowsVMPage() { Click the “Load driver” button to browse the mounted VirtIO ISO. This will allow you to load the necessary storage drivers so Windows can detect the virtual disk.

@@ -519,7 +519,7 @@ export default function WindowsVMPage() { For example, the viostor folder contains storage drivers, and you'll find subfolders organized by version (e.g., Windows 10, 11, Server).

@@ -532,7 +532,7 @@ export default function WindowsVMPage() { After selecting the folder, Windows will list the available drivers. Choose the appropriate one — usually “Red Hat VirtIO SCSI controller” — and click “Next” to proceed with the installation.

@@ -545,7 +545,7 @@ export default function WindowsVMPage() { Pro Tip: If you selected VirtIO as the network interface, Windows will not recognize it by default. To enable internet access during installation, load the VirtIO network driver from the ISO by browsing to the NetKVM folder and selecting the correct subfolder for your Windows version.

diff --git a/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx b/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx index d16fb43..e8f48ed 100644 --- a/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx +++ b/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx @@ -31,7 +31,7 @@ export default function IGPUAccelerationLXC() {

You will be presented with a list of your LXC containers to choose from.

- Select LXC Container + Select LXC Container

The script applies the following changes to your container:

diff --git a/web/app/docs/help-info/page.tsx b/web/app/docs/help-info/page.tsx index 66955d1..c6b0658 100644 --- a/web/app/docs/help-info/page.tsx +++ b/web/app/docs/help-info/page.tsx @@ -97,7 +97,7 @@ export default function HelpAndInfoPage() {
diff --git a/web/app/docs/installation/page.tsx b/web/app/docs/installation/page.tsx index 2dae8dd..d96eaea 100644 --- a/web/app/docs/installation/page.tsx +++ b/web/app/docs/installation/page.tsx @@ -46,7 +46,7 @@ export default function InstallationPage() {

Installation Progress

The installation process will look like this:

- ProxMenux Installation + ProxMenux Installation

How to Use

@@ -78,4 +78,4 @@ export default function InstallationPage() {

) -} \ No newline at end of file +} diff --git a/web/app/docs/introduction/page.tsx b/web/app/docs/introduction/page.tsx index fb0134f..1e11974 100644 --- a/web/app/docs/introduction/page.tsx +++ b/web/app/docs/introduction/page.tsx @@ -8,7 +8,7 @@ export default function IntroductionPage() { {/* Logo + Title Section */}
ProxMenux Logo ) } - diff --git a/web/app/docs/post-install/basic-settings/page.tsx b/web/app/docs/post-install/basic-settings/page.tsx index 346c02f..cda4b2a 100644 --- a/web/app/docs/post-install/basic-settings/page.tsx +++ b/web/app/docs/post-install/basic-settings/page.tsx @@ -63,7 +63,7 @@ export default function BasicSettingsPage() {
System Utilities Selection Menu @@ -83,7 +83,7 @@ export default function BasicSettingsPage() {

Example usage:

dialog --title "Hello" --msgbox "Hello, World!" 10 20 Dialog Example @@ -103,7 +103,7 @@ export default function BasicSettingsPage() {

To start htop, simply type:

htop htop Example @@ -113,7 +113,7 @@ export default function BasicSettingsPage() {

To start btop, type:

btop btop Example @@ -123,7 +123,7 @@ export default function BasicSettingsPage() {

To start iftop (requires root):

iftop iftop Example @@ -133,7 +133,7 @@ export default function BasicSettingsPage() {

To start iotop (requires root):

siotop iotop Example @@ -155,7 +155,7 @@ export default function BasicSettingsPage() {

To start iptraf-ng:

iptraf-ng iptraf-ng Example @@ -212,7 +212,7 @@ export default function BasicSettingsPage() { tmux Example @@ -383,4 +383,3 @@ sudo apt-get install -y zfsutils-linux proxmox-backup-restore-image chrony
) } - diff --git a/web/app/docs/post-install/customization/page.tsx b/web/app/docs/post-install/customization/page.tsx index bf8a4a4..84ae3f4 100644 --- a/web/app/docs/post-install/customization/page.tsx +++ b/web/app/docs/post-install/customization/page.tsx @@ -139,4 +139,3 @@ echo "DPkg::Post-Invoke { \\"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxl
) } - diff --git a/web/app/docs/post-install/monitoring/page.tsx b/web/app/docs/post-install/monitoring/page.tsx index 108e29b..6fcc757 100644 --- a/web/app/docs/post-install/monitoring/page.tsx +++ b/web/app/docs/post-install/monitoring/page.tsx @@ -95,4 +95,3 @@ fi
) } - diff --git a/web/app/docs/post-install/network/page.tsx b/web/app/docs/post-install/network/page.tsx index 8bd4bac..4cc774f 100644 --- a/web/app/docs/post-install/network/page.tsx +++ b/web/app/docs/post-install/network/page.tsx @@ -304,4 +304,3 @@ sudo sysctl -p /etc/sysctl.d/99-network-performance.conf
) } - diff --git a/web/app/docs/post-install/optional/page.tsx b/web/app/docs/post-install/optional/page.tsx index cb2d6ac..351003a 100644 --- a/web/app/docs/post-install/optional/page.tsx +++ b/web/app/docs/post-install/optional/page.tsx @@ -244,7 +244,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

ProxMenux

ProxMenux Logo @@ -252,7 +252,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Proxmox

Proxmox Logo @@ -260,7 +260,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Helper-Scripts

Helper-Scripts Logo @@ -268,7 +268,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Home-Labs-Club

Home-Labs-Club Logo @@ -276,7 +276,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Proxmology

Proxmology Logo @@ -336,7 +336,7 @@ echo "clear && fastfetch" >> ~/.bashrc
Figurine Example Output ) } - diff --git a/web/app/docs/post-install/performance/page.tsx b/web/app/docs/post-install/performance/page.tsx index fef5175..bf9760e 100644 --- a/web/app/docs/post-install/performance/page.tsx +++ b/web/app/docs/post-install/performance/page.tsx @@ -139,4 +139,3 @@ export default function PerformanceSettingsPage() {
) } - diff --git a/web/app/docs/post-install/storage/page.tsx b/web/app/docs/post-install/storage/page.tsx index 5b10fa2..e6e8c4c 100644 --- a/web/app/docs/post-install/storage/page.tsx +++ b/web/app/docs/post-install/storage/page.tsx @@ -164,4 +164,3 @@ EOF
) } - diff --git a/web/app/docs/post-install/system/page.tsx b/web/app/docs/post-install/system/page.tsx index 181bf8c..ff3a190 100644 --- a/web/app/docs/post-install/system/page.tsx +++ b/web/app/docs/post-install/system/page.tsx @@ -337,4 +337,3 @@ sudo systemctl restart systemd-journald
) } - diff --git a/web/app/docs/post-install/virtualization/page.tsx b/web/app/docs/post-install/virtualization/page.tsx index 7de2e33..eb59e6e 100644 --- a/web/app/docs/post-install/virtualization/page.tsx +++ b/web/app/docs/post-install/virtualization/page.tsx @@ -145,4 +145,3 @@ sudo systemctl start ksm
) } - diff --git a/web/app/docs/storage/disk-passthrough-ct/page.tsx b/web/app/docs/storage/disk-passthrough-ct/page.tsx index 3a5340e..cc7627f 100644 --- a/web/app/docs/storage/disk-passthrough-ct/page.tsx +++ b/web/app/docs/storage/disk-passthrough-ct/page.tsx @@ -1,163 +1,69 @@ import { Steps } from "@/components/ui/steps" -import { HardDrive, ArrowRight } from "lucide-react" -import { ImageWithCaption } from "@/components/ui/image-with-caption" -import type { Metadata } from "next" +import CopyableCode from "@/components/CopyableCode" -export const metadata: Metadata = { - title: "Disk Passthrough to a CT | ProxMenux Documentation", - description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", - openGraph: { - title: "Disk Passthrough to a CT | ProxMenux Documentation", - description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", - type: "article", - url: "https://macrimi.github.io/ProxMenux/docs/disk-ct", - images: [ - { - url: "https://macrimi.github.io/ProxMenux/disk-ct/disk-selection.png", - width: 1200, - height: 630, - alt: "Disk Passthrough to a CT", - }, - ], - }, - twitter: { - card: "summary_large_image", - title: "Disk Passthrough to a CT | ProxMenux Documentation", - description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", - images: ["https://macrimi.github.io/ProxMenux/disk-ct/disk-selection.png"], - }, +export const metadata = { + title: "Disk Passthrough to a VM | ProxMenux Documentation", + description: "Step-by-step guide to configure disk passthrough to a virtual machine in Proxmox VE using ProxMenux.", } -export default function DiskPassthroughCT() { +export default function DiskPassthroughVM() { return (
-
- - -

- Disk Passthrough to a CT -

-
- +

Disk Passthrough to a VM

+

- This guide explains how to assign a dedicated physical disk to a container (CT) in{" "} - Proxmox VE using ProxMenux. Assigning a full disk to a container is useful - when you need isolation, ease of access, or the ability to move the disk between systems, especially for - services handling large volumes of data such as Samba, Nextcloud, or video surveillance software, among others. + This guide explains how to assign physical disks to virtual machines (VMs) in Proxmox VE using ProxMenux. + Disk passthrough allows a VM to have direct access to a physical disk, providing improved performance and compatibility for certain applications.

- -

- While it's more common to passthrough entire disks to virtual machines (VMs), there are scenarios where giving - full disk access to an LXC container can be very useful. -

- -
    -
  • - A user running a video surveillance system like Frigate or Agent DVR might - want recordings saved on a dedicated disk, so they can easily transfer it to another system for review. -
  • -
  • - A Nextcloud container might need full disk access to manage user files and take advantage of - the entire disk capacity. -
  • -
  • - A container may be used for downloads, storing files on a dedicated disk and sharing them over the local - network. -
  • -
  • Another use case could be writing backups to an isolated disk.
  • -
- -

- As you can see, there are many different use cases where assigning a physical disk directly to a CT is the ideal - solution. -

- -

Description

+ +

Overview

+

The script automates the following steps:

    -
  1. Lists physical disks on the Proxmox host, excluding the system disk and mounted system disks.
  2. -
  3. Displays all existing LXC containers (CTs) for user selection.
  4. -
  5. - Allows the user to select one physical disk per execution. -
  6. -
  7. - Formats the disk (with user confirmation) or reuses it, then assigns it as a mount point in the selected CT. -
  8. +
  9. Lists available physical disks on the Proxmox host, excluding the system disk.
  10. +
  11. Displays a list of available virtual machines (VMs) for selection.
  12. +
  13. Allows the user to select multiple disks to assign to a VM.
  14. +
  15. Ensures selected disks are not already in use by another VM.
  16. +
  17. Configures the selected disks for passthrough to the chosen VM.
- -

Step-by-Step Instructions

+ +

Implementation Steps

- - - -

The user selects the destination LXC container (CT) to which the disk will be assigned.

+ + Disk Selection Menu +

The script scans the system and displays a list of available physical disks, excluding the system disk.

- - -

- The script lists all physical disks, excluding those used by the system. It also displays metadata like ZFS, - LVM, and RAID, and shows warnings if the disk is already in use. -

+ +

The user selects the virtual machine (VM) to which the disk(s) will be assigned.

- + + Disk Assigment Menu

The script performs the following actions:

    -
  • Detects whether the disk has a supported filesystem (ext4, xfs, btrfs).
  • -
  • Offers to format the disk if no valid filesystem is found.
  • -
  • - Prompts the user to define the mount point (e.g. /mnt/disk_passthrough). -
  • +
  • Ensures the selected disk is not in use by another VM.
  • +
  • Provides an interface choice (SATA, SCSI, VirtIO, or IDE).
  • +
  • Automatically configures the disk passthrough and assigns it to the VM.
- - -

- The selected disk is mounted inside the container at the specified path, and permissions are set - automatically. -

+ +

The script verifies the operation and confirms the successful disk passthrough.

- +

Expected Results

    -
  • The selected disk is successfully mounted and accessible within the specified container.
  • -
  • The script shows a summary of the operation, including any warnings or errors.
  • -
  • The container can use the assigned storage immediately.
  • - +
  • The selected physical disk(s) are successfully assigned to the specified VM.
  • +
  • Users are provided with a confirmation of the disk assignment.
  • +
  • The VM is configured to recognize the disk(s) upon startup.
- - +

Important Considerations

-
-

Important:

-

- The container must be privileged to allow direct read/write access to the physical disk. -

-
    -
  • - Only one disk can be assigned per script execution. -
  • -
  • Avoid assigning the same disk to multiple VMs or CTs that may run at the same time, as this can lead to data corruption or file loss.
  • -
  • - Clean any RAID, ZFS, or LVM metadata manually before assigning the disk. -
  • +
  • Ensure the selected disk is not already in use by another VM.
  • +
  • VMs must be powered off before adding disks to prevent data corruption.
  • +
  • Using disk passthrough limits certain VM features, such as live migration.
+ +
) } diff --git a/web/app/docs/storage/disk-passthrough-vm/page.tsx b/web/app/docs/storage/disk-passthrough-vm/page.tsx index 1cbd84b..cc7627f 100644 --- a/web/app/docs/storage/disk-passthrough-vm/page.tsx +++ b/web/app/docs/storage/disk-passthrough-vm/page.tsx @@ -29,14 +29,14 @@ export default function DiskPassthroughVM() {

Implementation Steps

- Disk Selection Menu + Disk Selection Menu

The script scans the system and displays a list of available physical disks, excluding the system disk.

The user selects the virtual machine (VM) to which the disk(s) will be assigned.

- Disk Assigment Menu + Disk Assigment Menu

The script performs the following actions:

  • Ensures the selected disk is not in use by another VM.
  • diff --git a/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx b/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx index e7f72c9..72ab46d 100644 --- a/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx +++ b/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx @@ -76,7 +76,7 @@ export default function UUPDumpISOCreatorPage() {
@@ -240,7 +240,7 @@ export default function UUPDumpISOCreatorPage() { ) and select the Windows version you want to download.

@@ -258,7 +258,7 @@ export default function UUPDumpISOCreatorPage() { Preview builds, or specific versions.

@@ -275,7 +275,7 @@ export default function UUPDumpISOCreatorPage() { Choose the language for the Windows image. You can select any language available for that specific build.

@@ -293,7 +293,7 @@ export default function UUPDumpISOCreatorPage() { (Home, Pro, Enterprise, etc.).

@@ -313,7 +313,7 @@ export default function UUPDumpISOCreatorPage() { edition.

@@ -341,7 +341,7 @@ export default function UUPDumpISOCreatorPage() { that the URL contains all the necessary parameters.

@@ -356,7 +356,7 @@ export default function UUPDumpISOCreatorPage() {

Access the Utilities section in ProxMenux and select "UUP Dump ISO Creator".

@@ -374,7 +374,7 @@ export default function UUPDumpISOCreatorPage() { ISO image. The ISO will be immediately available for use in creating virtual machines in Proxmox.

diff --git a/web/app/layout.tsx b/web/app/layout.tsx index cdea253..b2098b2 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -22,16 +22,16 @@ export const metadata = { address: false, telephone: false, }, - metadataBase: new URL(`https://macrimi.github.io/ProxMenux/`), + metadataBase: new URL(`https://proxmenux.com`), openGraph: { title: "ProxMenux", description: "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks.", - url: "https://macrimi.github.io/ProxMenux/", + url: "https://proxmenux.com", siteName: "ProxMenux", images: [ { - url: "https://macrimi.github.io/ProxMenux/main.png", + url: "https://proxmenux.com/main.png", width: 1363, height: 735, alt: "ProxMenux", @@ -45,14 +45,14 @@ export const metadata = { title: "ProxMenux", description: "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks.", - images: ["https://macrimi.github.io/ProxMenux/main.png"], + images: ["https://proxmenux.com/main.png"], }, icons: { icon: [ - { url: "https://macrimi.github.io/ProxMenux/favicon.ico", sizes: "any" }, - { url: "https://macrimi.github.io/ProxMenux/icon.svg", type: "image/svg+xml" }, + { url: "https://proxmenux.com/favicon.ico", sizes: "any" }, + { url: "https://proxmenux.com/icon.svg", type: "image/svg+xml" }, ], - apple: [{ url: "https://macrimi.github.io/ProxMenux/apple-touch-icon.png", sizes: "180x180" } as const], + apple: [{ url: "https://proxmenux.com/apple-touch-icon.png", sizes: "180x180" } as const], }, } diff --git a/web/app/metadata.ts b/web/app/metadata.ts index 1499c93..926db59 100644 --- a/web/app/metadata.ts +++ b/web/app/metadata.ts @@ -1,11 +1,9 @@ -import type { Metadata } from 'next' +import type { Metadata } from "next" - - -const description = "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks." +const description = + "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks." export const metadata: Metadata = { - title: "ProxMenux", description, generator: "Next.js", @@ -20,11 +18,11 @@ export const metadata: Metadata = { address: false, telephone: false, }, - metadataBase: new URL(`https://macrimi.github.io/ProxMenux/`), + metadataBase: new URL(`https://proxmenux.com`), openGraph: { title: "ProxMenux", description, - url: `https://macrimi.github.io/ProxMenux/`, + url: `https://proxmenux.com`, siteName: "ProxMenux", images: [ { @@ -49,4 +47,4 @@ export const metadata: Metadata = { ], apple: [{ url: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/web/public//apple-touch-icon.png" }], }, -} \ No newline at end of file +} diff --git a/web/app/rss.xml/route.ts b/web/app/rss.xml/route.ts index 6a0d54c..c81ab7f 100644 --- a/web/app/rss.xml/route.ts +++ b/web/app/rss.xml/route.ts @@ -10,25 +10,24 @@ interface ChangelogEntry { title: string } -// Function to clean and format markdown content for RSS function formatContentForRSS(content: string): string { return ( content - // Convert ### headers to bold text - .replace(/^### (.+)$/gm, "**$1**") - // Convert ** bold ** to simple bold - .replace(/\*\*(.*?)\*\*/g, "$1") - // Clean code blocks - remove ``` and format nicely + // Convert ### headers to

tags + .replace(/^### (.+)$/gm, "

$1

") + // Convert ** bold ** to tags + .replace(/\*\*(.*?)\*\*/g, "$1") + // Convert code blocks to
 tags
       .replace(/```[\s\S]*?```/g, (match) => {
         const code = match.replace(/```/g, "").trim()
-        return `\n${code}\n`
+        return `
${code}
` }) - // Convert - bullet points to • - .replace(/^- /gm, "• ") - // Clean up multiple newlines - .replace(/\n{3,}/g, "\n\n") - // Remove backslashes used for line breaks - .replace(/\\\s*$/gm, "") + // Convert - bullet points to
  • tags + .replace(/^- (.+)$/gm, "
  • $1
  • ") + // Wrap consecutive
  • tags in
      + .replace(/(
    • .*?<\/li>\s*)+/g, (match) => `
        ${match}
      `) + // Convert double newlines to

      for paragraphs + .replace(/\n\n/g, "

      ") // Clean up extra spaces .replace(/\s+/g, " ") .trim() @@ -75,7 +74,7 @@ async function parseChangelog(): Promise { currentEntry = { version, date, - url: `https://macrimi.github.io/ProxMenux/changelog#${version}`, + url: `https://proxmenux.com/changelog#${version}`, title: `ProxMenux ${version}`, } } else if (dateMatch) { @@ -83,7 +82,7 @@ async function parseChangelog(): Promise { currentEntry = { version: date, date, - url: `https://macrimi.github.io/ProxMenux/changelog#${date}`, + url: `https://proxmenux.com/changelog#${date}`, title: `ProxMenux Update ${date}`, } } @@ -115,13 +114,13 @@ async function parseChangelog(): Promise { export async function GET() { const entries = await parseChangelog() - const siteUrl = "https://macrimi.github.io/ProxMenux" + const siteUrl = "https://proxmenux.com" const rssXml = ` - + ProxMenux Changelog - Latest updates and changes in ProxMenux + Latest updates and changes in ProxMenux - An Interactive Menu for Proxmox VE Management ${siteUrl}/changelog en-US @@ -134,7 +133,7 @@ export async function GET() { (entry) => ` ${entry.title} - 1000 ? entry.content.substring(0, 1000) + "..." : entry.content}]]> + ${entry.url} ${entry.url} ${new Date(entry.date).toUTCString()} diff --git a/web/components/footer.tsx b/web/components/footer.tsx index 6a0dc37..b765fe5 100644 --- a/web/components/footer.tsx +++ b/web/components/footer.tsx @@ -22,7 +22,7 @@ export default function Footer() { className="hover:opacity-90 transition-opacity flex items-center" > Support me on Ko-fi ) } - diff --git a/web/components/footer2.tsx b/web/components/footer2.tsx index f10e72a..02ba795 100644 --- a/web/components/footer2.tsx +++ b/web/components/footer2.tsx @@ -19,7 +19,7 @@ export default function Footer() { className="hover:opacity-90 transition-opacity" > Support me on Ko-fi ) } - diff --git a/web/components/hero2.tsx b/web/components/hero2.tsx index b471f34..3680566 100644 --- a/web/components/hero2.tsx +++ b/web/components/hero2.tsx @@ -36,7 +36,7 @@ export default function Hero() {
      ProxMenux Logo ) } - diff --git a/web/components/mouse-move-effect.tsx b/web/components/mouse-move-effect.tsx index d2d9f1c..3b91f02 100644 --- a/web/components/mouse-move-effect.tsx +++ b/web/components/mouse-move-effect.tsx @@ -26,4 +26,3 @@ export default function MouseMoveEffect() { /> ) } - diff --git a/web/components/navbar.tsx b/web/components/navbar.tsx index eac7443..76217d6 100644 --- a/web/components/navbar.tsx +++ b/web/components/navbar.tsx @@ -20,13 +20,7 @@ export default function Navbar() {
      - ProxMenux Logo + ProxMenux Logo ProxMenux @@ -46,7 +40,7 @@ export default function Navbar() { {/* RSS Feed Link */} setIsMenuOpen(false)} target="_blank" diff --git a/web/components/rss-link.tsx b/web/components/rss-link.tsx index 34daa21..9557681 100644 --- a/web/components/rss-link.tsx +++ b/web/components/rss-link.tsx @@ -6,7 +6,7 @@ import { useState } from "react" export default function RSSLink() { const [copied, setCopied] = useState(false) - const rssUrl = "https://macrimi.github.io/ProxMenux/rss.xml" + const rssUrl = "https://proxmenux.com/rss.xml" const copyToClipboard = async () => { try { diff --git a/web/components/support-project.tsx b/web/components/support-project.tsx index 9cd06c5..9e16ed8 100644 --- a/web/components/support-project.tsx +++ b/web/components/support-project.tsx @@ -26,4 +26,3 @@ export default function SupportProject() { ) } - diff --git a/web/components/testimonials.tsx b/web/components/testimonials.tsx index 9044196..da84986 100644 --- a/web/components/testimonials.tsx +++ b/web/components/testimonials.tsx @@ -32,4 +32,3 @@ export default function Testimonials() { ) } - diff --git a/web/components/ui/image-with-caption.tsx b/web/components/ui/image-with-caption.tsx index 57b7ed9..2bf5bf1 100644 --- a/web/components/ui/image-with-caption.tsx +++ b/web/components/ui/image-with-caption.tsx @@ -23,4 +23,4 @@ export function ImageWithCaption({ src, alt, caption, width = 800, height = 450
      {caption}
      ) -} \ No newline at end of file +} diff --git a/web/components/ui/steps.tsx b/web/components/ui/steps.tsx index 58c6ae9..0aafab4 100644 --- a/web/components/ui/steps.tsx +++ b/web/components/ui/steps.tsx @@ -32,4 +32,3 @@ const Steps: React.FC & { Step: typeof Step } = ({ children }) => ( Steps.Step = Step export { Steps } -