Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docs rewrite #66

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open

Docs rewrite #66

wants to merge 8 commits into from

Conversation

sergi0g
Copy link
Collaborator

@sergi0g sergi0g commented Jan 30, 2025

I pretty much recreated the codebase (hopefully nothing is missing), so the diff will be big and weird here.

Changes

  • Updated Nextra to v4
  • Migrated project to Next.js app router
  • Redesigned the home page

Copy link
Contributor

coderabbitai bot commented Jan 30, 2025

Note

Reviews paused

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Walkthrough

This pull request represents a comprehensive restructuring of the Runtipi documentation repository. The changes involve migrating from an older project structure to a more modern Next.js and Nextra-based documentation setup. The modifications span across configuration files, components, documentation content, and project-level settings, focusing on improving code quality, consistency, and developer experience.

Changes

File/Group Change Summary
Config Files Replaced/updated ESLint, Prettier, PostCSS, Tailwind, and TypeScript configurations with more modern setups
Project Metadata Updated package.json with new dependencies, scripts, and project details
Components Removed old components, introduced new React components in src/app/components/ with enhanced functionality
Documentation Restructured documentation files, updated metadata, corrected capitalization, and improved formatting
Layout & Routing Migrated from Pages Router to App Router, updated layout and page components

Sequence Diagram

sequenceDiagram
    participant Dev as Developer
    participant Repo as Repository
    participant Build as Build Process
    participant Docs as Documentation Site

    Dev->>Repo: Commits changes
    Repo->>Build: Triggers build
    Build->>Build: Processes configuration
    Build->>Build: Compiles components
    Build->>Build: Generates static pages
    Build->>Docs: Deploys updated site
    Docs->>Dev: Renders new documentation
Loading

Possibly related PRs

Poem

🐰 A Rabbit's Ode to Refactoring 🔧

With config files crisp and clean,
Nextra's magic now can be seen,
Components dance, docs shine bright,
Our code's transformed with pure delight!

Hop, hop, hooray! 🎉


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🔭 Outside diff range comments (1)
src/content/docs/guides/uninstalling.mdx (1)

Line range hint 11-19: Add a warning about data loss and fix grammar.

  1. Add a comma before "too" for correct grammar.
  2. Add a warning about permanent data loss.
-If you want to purge every Docker image/volume/network created too you can run this command:
+If you want to purge every Docker image/volume/network created, too, you can run this command:
+
+> ⚠️ **Warning**: This will permanently delete all Docker data. Make sure you have backups of any important data before proceeding.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~11-~11: Possible missing comma found.
Context: ...ery Docker image/volume/network created too you can run this command: ```bash dock...

(AI_HYDRA_LEO_MISSING_COMMA)

🧹 Nitpick comments (55)
src/content/docs/reference/environment-variables.mdx (3)

3-3: Improve sentence structure with proper punctuation.

Add a comma before "as" to separate the independent clauses and improve readability.

-Here is a list of environment variables used by Runtipi and their usage. These values are set in the `.env` file and cannot be manually changed as the file is generated by the `start` command.
+Here is a list of environment variables used by Runtipi and their usage. These values are set in the `.env` file and cannot be manually changed, as the file is generated by the `start` command.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ... the .env file and cannot be manually changed as the file is generated by the start...

(AI_HYDRA_LEO_MISSING_COMMA)


Line range hint 15-17: Add security notes for sensitive environment variables.

Consider adding security recommendations for sensitive credentials like POSTGRES_PASSWORD, REDIS_PASSWORD, and JWT_SECRET.

| `POSTGRES_PASSWORD`        | The password of the postgres database.                                                                           |
| `POSTGRES_PORT`            | The port used by postgres (default 5432)                                                                         |
| `POSTGRES_USERNAME`        | The username of the postgres database.                                                                           |
+| `POSTGRES_PASSWORD`        | The password of the postgres database. Should be a strong, unique password stored securely.                      |
+| `POSTGRES_PORT`            | The port used by postgres (default 5432)                                                                         |
+| `POSTGRES_USERNAME`        | The username of the postgres database.                                                                           |
🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ... the .env file and cannot be manually changed as the file is generated by the start...

(AI_HYDRA_LEO_MISSING_COMMA)


Line range hint 33-33: Consider removing or deprecating legacy variables.

The DNS_IP variable is marked as legacy and not used anymore. Consider either removing it from the documentation or adding a deprecation notice with migration instructions.

-| `DNS_IP`                   | The IP address of the DNS server. Legacy variable, not used anymore. Kept for compatibility.                     |
+| `DNS_IP`                   | [DEPRECATED] The IP address of the DNS server. Will be removed in future versions.                               |
🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ... the .env file and cannot be manually changed as the file is generated by the start...

(AI_HYDRA_LEO_MISSING_COMMA)

src/app/components/GridPattern.tsx (3)

1-3: Add TypeScript types and consider component customization.

The component could benefit from:

  1. Proper TypeScript type definitions
  2. Props for customization (e.g., custom colors, sizes)
  3. Explicit ARIA attributes for accessibility

Consider this implementation:

-export default function GridPattern() {
+interface GridPatternProps {
+  className?: string;
+  bgLight?: string;
+  bgDark?: string;
+}
+
+export default function GridPattern({
+  className,
+  bgLight = 'bg-white',
+  bgDark = 'dark:bg-[#111111]',
+}: GridPatternProps) {
   return (
-    <div className="absolute inset-0 -z-10 overflow-hidden bg-white dark:bg-[#111111]">
+    <div
+      className={`absolute inset-0 -z-10 overflow-hidden ${bgLight} ${bgDark} ${className ?? ''}`}
+      aria-hidden="true"
+    >

4-7: Improve SVG responsiveness and maintainability.

The SVG configuration could be enhanced by:

  1. Adding a viewBox attribute for better scaling
  2. Extracting complex class string to a constant
  3. Using CSS custom properties for dimensions

Consider this implementation:

+const GRID_SVG_CLASSES = [
+  'absolute',
+  'top-0',
+  'left-[max(50%,25rem)]',
+  'h-[64rem]',
+  'w-[128rem]',
+  '-translate-x-1/2',
+  'stroke-gray-200',
+  '[mask-image:radial-gradient(64rem_64rem_at_top,white,transparent)]',
+  'dark:stroke-gray-800',
+].join(' ');
+
 <svg
-  className="absolute top-0 left-[max(50%,25rem)] h-[64rem] w-[128rem] -translate-x-1/2 stroke-gray-200 [mask-image:radial-gradient(64rem_64rem_at_top,white,transparent)] dark:stroke-gray-800"
+  className={GRID_SVG_CLASSES}
+  viewBox="0 0 1024 512"
   aria-hidden="true"
 >

20-29: Extract path coordinates for better maintainability.

The path coordinates are hardcoded and could be difficult to maintain.

Consider extracting the coordinates to a constant:

+const GRID_PATHS = [
+  { x: -100.5, y: 0 },
+  { x: 699.5, y: 0 },
+  { x: 499.5, y: 400 },
+  { x: -300.5, y: 600 },
+];
+
 <svg
   x="50%"
   y={-1}
   className="overflow-visible fill-gray-50 dark:fill-gray-900"
 >
   <path
-    d="M-100.5 0h201v201h-201Z M699.5 0h201v201h-201Z M499.5 400h201v201h-201Z M-300.5 600h201v201h-201Z"
+    d={GRID_PATHS.map(({x, y}) => `M${x} ${y}h201v201h-201Z`).join(' ')}
     strokeWidth={0}
   />
 </svg>
postcss.config.mjs (1)

3-5: Consider adding autoprefixer.

The previous configuration included autoprefixer which helps ensure CSS compatibility across different browsers. Consider adding it back.

Apply this diff to add autoprefixer:

   plugins: {
     "tailwindcss": {},
+    "autoprefixer": {},
   },
src/content/docs/getting-started/_meta.ts (1)

1-14: Maintain consistent naming convention for keys.

There's an inconsistency in the naming convention for keys:

  • installation uses camelCase
  • using-the-cli, custom-settings, custom-environment-variables use kebab-case

For consistency with other metadata files and URL-friendly paths, consider using kebab-case for all keys.

Apply this diff to maintain consistency:

 export default {
-  installation: {
+  "installation": {
     title: "Installation",
   },
src/content/docs/reference/_meta.ts (1)

1-17: Maintain consistent capitalization in titles.

There are inconsistencies in title capitalization:

  • Most titles use Title Case (e.g., "Folder Structure")
  • "Third-party services" and "config.json options" don't follow the same pattern

Consider using Title Case consistently across all titles.

Apply this diff to maintain consistency:

   "third-party-services": {
-    title: "Third-party services",
+    title: "Third-Party Services",
   },
   "config-json": {
-    title: "config.json options",
+    title: "Config.json Options",
   },
next.config.ts (2)

10-12: Consider enabling image optimization for better performance.

Setting unoptimized: true disables Next.js image optimization features. While this works for static exports, consider using a CDN or image optimization service to ensure optimal loading times.


12-17: Consider adding size limits to remote images.

While the remote pattern for GitHub raw content is correct, consider adding sizes constraints to prevent loading unnecessarily large images:

 remotePatterns: [
   {
     protocol: "https",
     hostname: "raw.githubusercontent.com",
+    pathname: '/**',
+    port: '',
   },
 ],
src/mdx-components.ts (1)

8-13: Consider adding JSDoc documentation.

The implementation looks good! For better maintainability, consider adding JSDoc documentation to describe the purpose and parameters of the useMDXComponents function.

+/**
+ * Merges custom MDX components with default theme components
+ * @param components - Custom MDX components to merge
+ * @returns Combined MDX components
+ */
 export function useMDXComponents(components: MDXComponents) {
src/content/_meta.ts (1)

1-23: Add TypeScript interface for metadata structure.

The metadata structure is well-organized. Consider adding TypeScript interfaces to improve type safety and documentation:

interface ThemeConfig {
  sidebar?: boolean;
  toc?: boolean;
  breadcrumb?: boolean;
  pagination?: boolean;
  timestamp?: boolean;
  layout?: 'full' | 'default';
  typesetting?: 'article' | 'default';
}

interface PageConfig {
  type?: 'page';
  title: string;
  theme?: ThemeConfig;
}

interface MetaConfig {
  index: { theme: ThemeConfig };
  docs: PageConfig;
  about: PageConfig;
}

const config: MetaConfig = {
  // ... your existing config
};

export default config;
src/content/docs/_meta.ts (1)

1-20: Maintain consistent naming convention.

The object keys use a mix of camelCase (introduction, guides) and kebab-case (apps-available, getting-started). Consider using a consistent naming convention:

 export default {
   introduction: {
     title: "Introduction",
   },
-  "apps-available": {
+  appsAvailable: {
     title: "Apps Available",
   },
-  "getting-started": {
+  gettingStarted: {
     title: "Getting Started",
   },
   // ... rest of the config
 };

Also, consider adding TypeScript interfaces similar to the root _meta.ts file for better type safety.

eslint.config.mjs (1)

12-14: Consider enhancing TypeScript-specific rules.

The configuration extends Next.js and TypeScript configs which is good. Consider adding TypeScript-specific rules to enforce stricter type checking.

 const eslintConfig = [
   ...compat.extends("next/core-web-vitals", "next/typescript"),
+  {
+    rules: {
+      "@typescript-eslint/no-explicit-any": "error",
+      "@typescript-eslint/explicit-function-return-type": "error",
+      "@typescript-eslint/no-unused-vars": "error"
+    }
+  }
 ];
src/app/components/Button.tsx (1)

5-9: Enhance ButtonProps interface for better accessibility and flexibility.

Consider adding props for aria-label and handling external links.

 interface ButtonProps {
   href: string;
   className?: string;
   children: ReactNode;
+  ariaLabel?: string;
+  isExternal?: boolean;
 }
src/app/components/AppScreenshot.tsx (1)

4-5: Use absolute imports for better maintainability.

Replace relative imports with absolute imports using the @ alias.

-import appstore_light from "../../../public/images/appstore.png";
-import appstore_dark from "../../../public/images/appstore-dark.png";
+import appstore_light from "@/public/images/appstore.png";
+import appstore_dark from "@/public/images/appstore-dark.png";
src/content/docs/guides/_meta.ts (1)

23-25: Maintain consistent key naming convention

The key uninstalling breaks the kebab-case pattern used by other entries.

-  uninstalling: {
+  "uninstalling": {
src/app/components/Card.tsx (2)

28-30: Add semantic heading level prop for better accessibility

The h3 heading level is hardcoded, which might not match the document outline.

+interface CardProps {
+  title: string;
+  children: ReactNode;
+  icon?: IconType;
+  footer?: ReactNode;
+  headingLevel?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
+}

 export default function Card({
   title,
   children,
   icon: Icon,
   footer,
+  headingLevel: Heading = 'h3',
 }: CardProps) {
   // ...
-          <h3 className="text-lg leading-none font-medium text-black/90 dark:text-white/90">
+          <Heading className="text-lg leading-none font-medium text-black/90 dark:text-white/90">
             {title}
-          </h3>
+          </Heading>

22-24: Use more semantic size classes

The size-16 and size-8 utility classes could be more semantic using width/height.

-            <div className="flex size-16 transform items-center justify-center rounded-xl bg-blue-50 shadow-sm transition-transform duration-300 group-hover:scale-105 dark:bg-slate-950 dark:shadow-lg">
-              <Icon className="size-8 text-blue-500 dark:text-blue-800" />
+            <div className="flex h-16 w-16 transform items-center justify-center rounded-xl bg-blue-50 shadow-sm transition-transform duration-300 group-hover:scale-105 dark:bg-slate-950 dark:shadow-lg">
+              <Icon className="h-8 w-8 text-blue-500 dark:text-blue-800" />
src/app/components/Head.tsx (1)

12-12: Move hardcoded URLs to configuration

The OG image URL should be moved to a configuration file for better maintainability.

Consider creating a config.ts file:

export const config = {
  siteUrl: 'https://runtipi.io',
  ogImage: 'https://runtipi.io/images/tipi-og.png',
  // ... other config
};
src/app/layout.tsx (1)

37-44: Improve footer link accessibility

The footer link could be more descriptive and include better aria attributes.

       <a
         href="https://www.flaticon.com/free-icons/tipi"
-        title="tipi icons"
+        aria-label="View Tipi icons on Flaticon (opens in new window)"
         target="_blank"
-        rel="noreferrer"
+        rel="noreferrer noopener"
       >
-        Tipi logo created by Freepik - Flaticon
+        <span className="sr-only">Opens in new window: </span>
+        Tipi logo created by Freepik - Flaticon
       </a>
src/app/components/CopyableCode.tsx (1)

25-65: Consider moving icons to a separate file and optimizing SVGs.

The icon components could be better organized and optimized.

  1. Move icons to a separate file (e.g., icons/CopyIcons.tsx)
  2. Consider using an SVG optimization tool to reduce the SVG size
  3. Add aria-hidden="true" to the SVGs since they're decorative
src/app/components/AppsList.tsx (1)

12-27: Clean up type definitions and add documentation.

The ApiResponse type contains commented-out properties and lacks documentation.

+/** Represents an application with its metadata */
 type App = {
   name: string;
   description: string;
   logo: string;
   link: string;
 };

+/** Response from GitHub API contents endpoint */
 type ApiResponse = {
   name: string;
-  // path: string;
-  // sha: string;
-  // size: number;
-  // url: string;
-  // html_url: string;
-  // git_url: string;
-  // download_url: string | null;
   type: "dir" | "file";
-  // _links: {
-  //   self: string;
-  //   git: string;
-  //   html: string;
-  // };
 }[];
src/app/components/Browser.tsx (2)

7-153: Consider optimizing SVG and adding TypeScript types.

The component could benefit from some improvements:

  1. Add TypeScript interface for props
  2. Use CSS variables for dimensions
  3. Consider extracting SVG paths to separate files
  4. Add aria-label to the SVG for accessibility
+interface BrowserProps {
+  className?: string;
+}

-export function Browser() {
+export function Browser({ className }: BrowserProps) {
   return (
     <>
       <svg
         viewBox={`0 0 ${1203} ${753}`}
         fill="none"
         xmlns="http://www.w3.org/2000/svg"
         className="m-8 hidden size-full max-h-[753px] max-w-[1203px] lg:block"
+        aria-label="Browser window frame"
+        role="img"
       >

154-252: Optimize mobile SVG and extract common patterns.

Consider optimizing the mobile SVG implementation:

  1. Extract common SVG patterns to reusable components
  2. Use an SVG optimization tool to reduce size
  3. Consider using CSS transforms instead of SVG for some effects
  4. Add aria-label to the mobile SVG for accessibility
 <svg
   viewBox={`0 0 ${433} ${882}`}
   fill="none"
   xmlns="http://www.w3.org/2000/svg"
   className="m-8 size-full max-h-[882px] max-w-[433px] lg:hidden"
+  aria-label="Mobile device frame"
+  role="img"
 >
src/app/components/pages/home.tsx (2)

8-18: Optimize icon imports using dynamic imports.

Consider optimizing the icon imports to reduce the initial bundle size.

-import {
-  IconAdjustments,
-  IconApps,
-  IconCircleArrowUp,
-  IconDownload,
-  IconHandClick,
-  IconLockCheck,
-  IconMessage,
-  IconPuzzle,
-  IconRestore,
-  IconShoppingBag,
-} from "@tabler/icons-react";
+import dynamic from 'next/dynamic';
+
+const IconAdjustments = dynamic(() => import('@tabler/icons-react').then(mod => mod.IconAdjustments));
+const IconApps = dynamic(() => import('@tabler/icons-react').then(mod => mod.IconApps));
// ... other icons

28-62: Add semantic HTML and prepare for internationalization.

Consider improving the semantic structure and text management:

+import { useTranslations } from 'next-intl';

 export default async function Home() {
+  const t = useTranslations('home');
   return (
     <>
-      <div className="mx-auto flex w-auto flex-col justify-center px-4 pt-16 pb-8 sm:pt-24 md:flex-row lg:max-w-7xl lg:px-8">
+      <header className="mx-auto flex w-auto flex-col justify-center px-4 pt-16 pb-8 sm:pt-24 md:flex-row lg:max-w-7xl lg:px-8">
         <div className="flex w-full flex-col items-center justify-between md:mr-4">
-          <div>
+          <section>
             <h1 className="mx-auto max-w-5xl text-center text-6xl leading-none font-extrabold tracking-tighter text-black sm:text-7xl dark:text-white">
               <span className="inline-block bg-linear-to-r/oklch from-red-500 to-blue-500 bg-clip-text text-transparent">
-                Homeserver
+                {t('hero.title')}
               </span>
src/content/docs/apps-available.mdx (1)

1-7: LGTM! Consider enhancing the documentation with additional details.

The structure and content look good. The AppsList component integration and repository link are properly implemented.

Consider adding:

  • A brief description of what Runtipi's app store offers
  • Instructions on how to request new apps
  • Any limitations or requirements for app installations
README.md (2)

3-5: LGTM! Clear architecture documentation.

The architecture section provides a good overview of the tech stack.

Consider rephrasing "don't play well together at the moment" to "currently don't play well together" for better conciseness.

🧰 Tools
🪛 LanguageTool

[style] ~5-~5: For conciseness, consider replacing this expression with an adverb.
Context: ...ext.js and Bun don't play well together at the moment). Docs pages are written in [MDX](https...

(AT_THE_MOMENT)


14-18: Consider removing $ prefix from commands.

The commands are clear, but according to markdown best practices, the $ prefix should be removed when not showing command output.

-$ git clone https://github.com/runtipi/runtipi-docs
-$ cd runtipi-docs
-$ bun install
+git clone https://github.com/runtipi/runtipi-docs
+cd runtipi-docs
+bun install
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

15-15: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


16-16: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


17-17: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)

src/content/about.mdx (1)

5-5: Add hyphen for compound adjective.

The term "open source" should be hyphenated when used as a compound adjective before a noun.

-Runtipi is an open source personal homeserver orchestrator that enables you to manage and run multiple services on a single server.
+Runtipi is an open-source personal homeserver orchestrator that enables you to manage and run multiple services on a single server.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~5-~5: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...AppScreenshot"; # About Runtipi is an open source personal homeserver orchestrator that e...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

src/content/docs/contributing/running-locally.mdx (2)

3-3: Improve sentence structure and clarity.

The opening sentence could be improved for better readability and flow.

-In this guide we will show you how to run Runtipi locally on your machine. This is useful if you want to contribute to the project or if you want to test new apps you added to the appstore.
+In this guide, we will show you how to run Runtipi locally on your machine. This is useful for contributing to the project or testing new apps you've added to the appstore.
🧰 Tools
🪛 LanguageTool

[typographical] ~3-~3: It appears that a comma is missing.
Context: # Running locally In this guide we will show you how to run Runtipi loc...

(DURING_THAT_TIME_COMMA)


[style] ~3-~3: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... to contribute to the project or if you want to test new apps you added to the appstore...

(REP_WANT_TO_VB)


37-37: Simplify wordy phrase.

The sentence could be more concise.

-You can change the repository Runtipi is using to retrieve the appstore in order to test new apps you added.
+You can change the repository Runtipi uses to retrieve the appstore to test your new apps.
🧰 Tools
🪛 LanguageTool

[style] ~37-~37: Consider a shorter alternative to avoid wordiness.
Context: ...ntipi is using to retrieve the appstore in order to test new apps you added. Create a `set...

(IN_ORDER_TO_PREMIUM)

src/content/docs/introduction.mdx (1)

15-18: Fix compound adjective and maintain consistent capitalization.

  1. Add hyphen for compound adjective "open-source"
  2. Maintain consistent capitalization of "Runtipi"
-Runtipi is an open source personal homeserver orchestrator that enables you to manage and run multiple services on a single server.
+Runtipi is an open-source personal homeserver orchestrator that enables you to manage and run multiple services on a single server.
 It is based on Docker and comes with a user-friendly web interface that simplifies service management.
-With runtipi, you no longer need to worry about manual configuration or networking.
+With Runtipi, you no longer need to worry about manual configuration or networking.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~15-~15: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ing feedback. Runtipi is an open source personal homeserver orchestrator that e...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

src/content/docs/getting-started/using-the-cli.mdx (2)

71-73: Improve reset password instructions clarity.

The reset password instructions could be clearer and better formatted.

-To reset your password run the following command and visit the Runtipi rest page at `http://<your-ip>/reset-password`
-it should prompt you to enter your new password.
+To reset your password:
+1. Run the following command
+2. Visit the Runtipi reset page at `http://<your-ip>/reset-password`
+3. Follow the prompts to enter your new password

110-110: Fix spelling error.

Correct the compound word spelling.

-This command is used to display help for an other command in Runtipi cli.
+This command is used to display help for another command in Runtipi CLI.
🧰 Tools
🪛 LanguageTool

[misspelling] ~110-~110: This word is normally spelled as one.
Context: ...his command is used to display help for an other command in Runtipi cli. To use this co...

(EN_COMPOUNDS_AN_OTHER)

src/content/docs/guides/local-certificate.mdx (2)

10-10: Improve clarity of the introduction.

The sentence structure could be clearer. Consider rephrasing for better flow.

-With Runtipi you can access your dashboard and apps locally using a secure connection. When installing runtipi, a self-signed SSL certificate is generated for you.
+Runtipi generates a self-signed SSL certificate during installation, allowing you to access your dashboard and apps locally using a secure connection.

47-47: Improve readability of DNS server recommendation.

The text could be more structured and include a comma after "For example".

-You can use **Pi-hole** or **AdGuard Home** for this. Both are available as apps in the Runtipi App store.
-For example using AdGuard Home you can add the domain to the `DNS rewrites` section of the app.
+You can use **Pi-hole** or **AdGuard Home** for this, both of which are available in the Runtipi App store.
+For example, with AdGuard Home, you can add the domain to the `DNS rewrites` section of the app.

Also applies to: 49-49

src/content/docs/guides/dns-challenge-cloudflare.mdx (2)

8-9: Improve clarity and grammar in the overview section.

The sentence structure needs improvement, and "very bad" is a weak descriptor for a security concern.

-In this guide, we will show you how to set up your Runtipi instance with a dns challenge and cloudflare. By default Runtipi uses an http challenge to obtain ssl certificates requiring you to expose the dashboard to the internet which is a very bad security practice.
+In this guide, we will show you how to set up your Runtipi instance with a DNS challenge using Cloudflare. By default, Runtipi uses an HTTP challenge to obtain SSL certificates, which requires exposing the dashboard to the internet—a significant security risk.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~8-~8: Did you mean: “By default,”?
Context: ...ce with a dns challenge and cloudflare. By default Runtipi uses an http challenge to obtai...

(BY_DEFAULT_COMMA)


[style] ~8-~8: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ... the dashboard to the internet which is a very bad security practice. With a DNS challenge...

(EN_WEAK_ADJECTIVE)


[formatting] ~9-~9: Consider inserting a comma here, unless the first half is essential to the meaning of the sentence.
Context: ... very bad security practice. With a DNS challenge you can get trusted ssl certificates wi...

(WITH_THAT_COMMA)


13-13: Fix typo in requirements section.

There's a typo in the word "instance".

-A Runtipi instace
+A Runtipi instance
src/content/docs/getting-started/installation.mdx (2)

7-7: Improve clarity of the introduction sentence.

Add a comma before "and" in the compound sentence.

-This guide will help you install Runtipi on your server. Make sure your server is secured and you have followed basic security practices before installing Runtipi.
+This guide will help you install Runtipi on your server. Make sure your server is secured, and you have followed basic security practices before installing Runtipi.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~7-~7: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...server. Make sure your server is secured and you have followed basic security practi...

(COMMA_COMPOUND_SENTENCE)


76-76: Improve error handling message.

The current wording about installation issues could be more specific and helpful.

-If you have some issue with the command above, you can also download the script directly from GitHub:
+If the installation command fails (for example, due to network issues or firewall restrictions), you can alternatively download the script directly from GitHub:

Also applies to: 77-77, 78-78

🧰 Tools
🪛 LanguageTool

[style] ~76-~76: Consider an alternative verb to strengthen your wording.
Context: ...s://setup.runtipi.io | bash ``` If you have some issue with the command above, you ...

(IF_YOU_HAVE_THIS_PROBLEM)

src/content/docs/reference/folder-structure.mdx (2)

116-116: Improve link formatting consistency.

The documentation uses both inline links and reference-style links. Consider using a consistent style throughout.

Consider using reference-style links consistently throughout the documentation for better maintainability. For example:

-Additionally you can also customize Runtipi's Docker Compose file using the `tipi-compose.yml` file. See [Customize Runtipi compose and traefik config](https://runtipi.io/docs/guides/customize-compose-and-traefik).
+Additionally you can also customize Runtipi's Docker Compose file using the `tipi-compose.yml` file. See [Customize Runtipi compose and traefik config](/docs/guides/customize-compose-and-traefik).

120-122: Improve clarity of Docker Compose section.

The explanation about file regeneration could be clearer.

-This is the default Docker Compose file for your Runtipi instance.
-It gets regenerated every time by the CLI and uses the values from the `.env` file to configure your instance (see below).
-This file is not meant to be edited, if you want to modify it please take a look at [Customize Runtipi compose and traefik config](https://runtipi.io/docs/guides/customize-compose-and-traefik).
+This is the default Docker Compose file for your Runtipi instance. The CLI automatically regenerates this file using values from the `.env` file to configure your instance (see below).
+Warning: Do not edit this file directly as your changes will be lost. For customizations, refer to [Customize Runtipi compose and traefik config](/docs/guides/customize-compose-and-traefik).
🧰 Tools
🪛 LanguageTool

[typographical] ~122-~122: It seems that a comma is missing.
Context: ...t to be edited, if you want to modify it please take a look at [Customize Runtipi compo...

(IF_PLEASE_COMMA)


[style] ~122-~122: To make your writing clearer, consider a more direct alternative.
Context: ...edited, if you want to modify it please take a look at [Customize Runtipi compose and ...

(TAKE_A_LOOK)

src/content/docs/reference/dynamic-compose.mdx (1)

138-138: Consider rephrasing to be more precise.

The phrase "can be added very easily" could be more concise and professional.

Consider this revision:

-Another important thing in a Docker Compose file are the environment variables, environment variables can be added very easily using this simple format:
+Another important aspect of a Docker Compose file is environment variables, which can be configured using this format:
🧰 Tools
🪛 LanguageTool

[style] ~138-~138: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...les, environment variables can be added very easily using this simple format: ```json { ...

(EN_WEAK_ADJECTIVE)

src/content/docs/guides/auto-backup-apps.mdx (2)

5-5: Add missing comma for better readability.

Add a comma after the introductory phrase.

-In this guide we will show you how to automate backing up all your apps every week, month or day using Runtipi's
+In this guide, we will show you how to automate backing up all your apps every week, month or day using Runtipi's
🧰 Tools
🪛 LanguageTool

[typographical] ~5-~5: It appears that a comma is missing.
Context: ...to backup your apps using cron In this guide we will show you how to automate backin...

(DURING_THAT_TIME_COMMA)


Line range hint 107-107: Add missing comma in compound sentence.

Add a comma before the coordinating conjunction.

-A bug was making updates impossible if the CLI wasn't able to stop Runtipi. This could have caused issues if we released a bugged version making users unable to update. Now an update will still be performed even if Runtipi fails to stop.
+A bug was making updates impossible if the CLI wasn't able to stop Runtipi. This could have caused issues if we released a bugged version, making users unable to update. Now an update will still be performed even if Runtipi fails to stop.
🧰 Tools
🪛 LanguageTool

[typographical] ~5-~5: It appears that a comma is missing.
Context: ...to backup your apps using cron In this guide we will show you how to automate backin...

(DURING_THAT_TIME_COMMA)

src/content/docs/reference/config-json.mdx (3)

27-27: Fix grammatical issue in form field description.

The word "install" is incorrectly used as a noun.

-Form fields allow you to promt the user for input during the install, like a username or a password
+Form fields allow you to prompt the user for input during installation, like a username or a password
🧰 Tools
🪛 LanguageTool

[grammar] ~27-~27: The word ‘install’ is not a noun.
Context: ... to promt the user for input during the install, like a username or a password ...

(A_INSTALL)


29-29: Add missing comma in compound sentence.

Add a comma before the coordinating conjunction.

-If the app is deprecated it won't exist in the app store and it will notify users that is no longer maintained.
+If the app is deprecated, it won't exist in the app store, and it will notify users that it is no longer maintained.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~29-~29: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...precated it won't exist in the app store and it will notify users that is no longer ...

(COMMA_COMPOUND_SENTENCE)


27-27: Fix typo in table header.

The table header contains a typo in "form_fiels".

-| **form_fiels**              | Form fields allow you to promt the user for input during the install, like a username or a password
+| **form_fields**             | Form fields allow you to prompt the user for input during installation, like a username or a password
🧰 Tools
🪛 LanguageTool

[grammar] ~27-~27: The word ‘install’ is not a noun.
Context: ... to promt the user for input during the install, like a username or a password ...

(A_INSTALL)

src/content/docs/reference/release-notes.mdx (2)

42-42: Consider adding more context about the Docker ignore approach.

The technical note about "exclude first approach" could benefit from a brief explanation or link to documentation about Docker ignore patterns, making it more accessible to contributors who might not be familiar with the concept.

-Refactored the Docker ignore file to an exclude first approach. This will make the Docker build faster and smaller during development @meienberger
+Refactored the Docker ignore file to an exclude first approach (ignoring everything by default and explicitly including needed files). This optimization makes Docker builds faster and reduces image size during development @meienberger

107-107: Improve sentence structure with proper punctuation.

The sentence needs a comma to separate the two independent clauses for better readability.

-A bug was making updates impossible if the CLI wasn't able to stop Runtipi. This could have caused issues if we released a bugged version making users unable to update.
+A bug was making updates impossible if the CLI wasn't able to stop Runtipi. This could have caused issues if we released a bugged version, making users unable to update.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~107-~107: Possible missing comma found.
Context: ...e caused issues if we released a bugged version making users unable to update. Now an u...

(AI_HYDRA_LEO_MISSING_COMMA)

src/content/docs/contributing/adding-a-new-app.mdx (2)

270-271: Enhance guidance about supported image sources.

The documentation should be more specific about which image hosting services are supported and provide examples of recommended image URLs.

-Make sure that when using images they are coming from GitHub or an image service since Runtipi doesn't support loading images from local storage in the description.
+Make sure that images in the description are hosted on reliable services (e.g., GitHub, Imgur, or other CDNs). Local image references are not supported. Example of a valid image URL: `https://raw.githubusercontent.com/username/repo/branch/path/to/image.jpg`

161-162: Improve clarity of form field documentation.

The description of the encoding option could be more clearly structured.

-| **encoding**      | Used only in addintion to random type. Specify the random value encoding. Can be `base64` or `hex` | base64                                     | false    |
+| **encoding**      | Specifies the encoding format for random values. Only applicable when type is "random". Supported values are `base64` or `hex` | base64                                     | false    |
🧰 Tools
🪛 LanguageTool

[style] ~162-~162: To form a complete sentence, be sure to include a subject.
Context: ...ype. Specify the random value encoding. Can be base64 or hex | base64 ...

(MISSING_IT_THERE)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 51dc34c and 47e80ff.

⛔ Files ignored due to path filters (15)
  • bun.lockb is excluded by !**/bun.lockb
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/images/after.png is excluded by !**/*.png
  • public/images/app-dark.png is excluded by !**/*.png
  • public/images/app.png is excluded by !**/*.png
  • public/images/appstore-dark.png is excluded by !**/*.png
  • public/images/appstore.png is excluded by !**/*.png
  • public/images/before.png is excluded by !**/*.png
  • public/images/hero-dark.png is excluded by !**/*.png
  • public/images/hero-mobile-dark.png is excluded by !**/*.png
  • public/images/hero-mobile.png is excluded by !**/*.png
  • public/images/hero.png is excluded by !**/*.png
  • public/images/screenshot.png is excluded by !**/*.png
  • src/app/apple-icon.png is excluded by !**/*.png
  • src/app/favicon.ico is excluded by !**/*.ico
📒 Files selected for processing (81)
  • .eslintignore (0 hunks)
  • .eslintrc.js (0 hunks)
  • .gitignore (1 hunks)
  • .prettierignore (0 hunks)
  • .prettierrc (1 hunks)
  • .prettierrc.js (0 hunks)
  • README.md (1 hunks)
  • components/AppLogo/AppLogo.module.scss (0 hunks)
  • components/AppLogo/AppLogo.tsx (0 hunks)
  • components/AppLogo/index.ts (0 hunks)
  • components/AppScreenshot.tsx (0 hunks)
  • components/AppsList.tsx (0 hunks)
  • components/Container.tsx (0 hunks)
  • components/pages/home.tsx (0 hunks)
  • eslint.config.mjs (1 hunks)
  • next-env.d.ts (1 hunks)
  • next.config.mjs (0 hunks)
  • next.config.ts (1 hunks)
  • package.json (1 hunks)
  • pages/_app.tsx (0 hunks)
  • pages/_document.tsx (0 hunks)
  • pages/_meta.ts (0 hunks)
  • pages/docs/_meta.ts (0 hunks)
  • pages/docs/apps-available.mdx (0 hunks)
  • pages/docs/contributing/_meta.ts (0 hunks)
  • pages/docs/getting-started/_meta.ts (0 hunks)
  • pages/docs/guides/_meta.ts (0 hunks)
  • pages/docs/reference/_meta.ts (0 hunks)
  • postcss.config.js (0 hunks)
  • postcss.config.mjs (1 hunks)
  • src/app/[...mdxPath]/page.tsx (1 hunks)
  • src/app/components/AppScreenshot.tsx (1 hunks)
  • src/app/components/AppsList.tsx (1 hunks)
  • src/app/components/Browser.tsx (1 hunks)
  • src/app/components/Button.tsx (1 hunks)
  • src/app/components/Card.tsx (1 hunks)
  • src/app/components/CopyableCode.tsx (1 hunks)
  • src/app/components/GridPattern.tsx (1 hunks)
  • src/app/components/Head.tsx (1 hunks)
  • src/app/components/pages/home.tsx (1 hunks)
  • src/app/components/pages/styles.css (1 hunks)
  • src/app/globals.css (1 hunks)
  • src/app/layout.tsx (1 hunks)
  • src/app/page.mdx (1 hunks)
  • src/content/_meta.ts (1 hunks)
  • src/content/about.mdx (1 hunks)
  • src/content/docs/_meta.ts (1 hunks)
  • src/content/docs/apps-available.mdx (1 hunks)
  • src/content/docs/contributing/_meta.ts (1 hunks)
  • src/content/docs/contributing/adding-a-new-app.mdx (6 hunks)
  • src/content/docs/contributing/running-locally.mdx (2 hunks)
  • src/content/docs/getting-started/_meta.ts (1 hunks)
  • src/content/docs/getting-started/custom-settings.mdx (2 hunks)
  • src/content/docs/getting-started/installation.mdx (4 hunks)
  • src/content/docs/getting-started/using-the-cli.mdx (5 hunks)
  • src/content/docs/guides/_meta.ts (1 hunks)
  • src/content/docs/guides/auto-backup-apps.mdx (6 hunks)
  • src/content/docs/guides/auto-update-with-cron.mdx (3 hunks)
  • src/content/docs/guides/backup-and-restore.mdx (2 hunks)
  • src/content/docs/guides/customize-app-config.mdx (4 hunks)
  • src/content/docs/guides/customize-compose-and-traefik.mdx (6 hunks)
  • src/content/docs/guides/dns-challenge-cloudflare.mdx (4 hunks)
  • src/content/docs/guides/expose-apps-with-cloudflare-tunnels.mdx (6 hunks)
  • src/content/docs/guides/expose-your-apps.mdx (2 hunks)
  • src/content/docs/guides/linking-a-domain-to-your-dashboard.mdx (1 hunks)
  • src/content/docs/guides/local-certificate.mdx (2 hunks)
  • src/content/docs/guides/uninstalling.mdx (1 hunks)
  • src/content/docs/introduction.mdx (2 hunks)
  • src/content/docs/reference/_meta.ts (1 hunks)
  • src/content/docs/reference/architecture.mdx (1 hunks)
  • src/content/docs/reference/breaking-updates.mdx (1 hunks)
  • src/content/docs/reference/config-json.mdx (2 hunks)
  • src/content/docs/reference/dynamic-compose.mdx (3 hunks)
  • src/content/docs/reference/environment-variables.mdx (2 hunks)
  • src/content/docs/reference/folder-structure.mdx (2 hunks)
  • src/content/docs/reference/release-notes.mdx (3 hunks)
  • src/content/docs/reference/third-party-services.mdx (1 hunks)
  • src/mdx-components.ts (1 hunks)
  • tailwind.config.js (0 hunks)
  • theme.config.tsx (0 hunks)
  • tsconfig.json (1 hunks)
💤 Files with no reviewable changes (24)
  • .eslintignore
  • postcss.config.js
  • .prettierignore
  • pages/docs/_meta.ts
  • components/AppLogo/index.ts
  • pages/docs/getting-started/_meta.ts
  • pages/docs/contributing/_meta.ts
  • pages/docs/reference/_meta.ts
  • components/AppLogo/AppLogo.module.scss
  • next.config.mjs
  • tailwind.config.js
  • components/AppLogo/AppLogo.tsx
  • .prettierrc.js
  • pages/docs/guides/_meta.ts
  • components/Container.tsx
  • components/pages/home.tsx
  • components/AppScreenshot.tsx
  • pages/_meta.ts
  • pages/docs/apps-available.mdx
  • components/AppsList.tsx
  • theme.config.tsx
  • pages/_app.tsx
  • .eslintrc.js
  • pages/_document.tsx
✅ Files skipped from review due to trivial changes (15)
  • next-env.d.ts
  • src/content/docs/guides/auto-update-with-cron.mdx
  • src/content/docs/reference/third-party-services.mdx
  • src/content/docs/guides/backup-and-restore.mdx
  • src/app/page.mdx
  • src/content/docs/guides/customize-app-config.mdx
  • .prettierrc
  • src/content/docs/reference/breaking-updates.mdx
  • src/content/docs/guides/expose-your-apps.mdx
  • src/content/docs/guides/linking-a-domain-to-your-dashboard.mdx
  • src/content/docs/guides/expose-apps-with-cloudflare-tunnels.mdx
  • .gitignore
  • src/content/docs/getting-started/custom-settings.mdx
  • src/content/docs/reference/architecture.mdx
  • src/app/components/pages/styles.css
🧰 Additional context used
🪛 LanguageTool
README.md

[style] ~5-~5: For conciseness, consider replacing this expression with an adverb.
Context: ...ext.js and Bun don't play well together at the moment). Docs pages are written in [MDX](https...

(AT_THE_MOMENT)

src/content/about.mdx

[uncategorized] ~5-~5: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...AppScreenshot"; # About Runtipi is an open source personal homeserver orchestrator that e...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

src/content/docs/contributing/adding-a-new-app.mdx

[style] ~29-~29: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...license for personal use) - The app you want to add has an official and maintained Dock...

(REP_WANT_TO_VB)


[style] ~162-~162: To form a complete sentence, be sure to include a subject.
Context: ...ype. Specify the random value encoding. Can be base64 or hex | base64 ...

(MISSING_IT_THERE)

src/content/docs/contributing/running-locally.mdx

[typographical] ~3-~3: It appears that a comma is missing.
Context: # Running locally In this guide we will show you how to run Runtipi loc...

(DURING_THAT_TIME_COMMA)


[style] ~3-~3: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... to contribute to the project or if you want to test new apps you added to the appstore...

(REP_WANT_TO_VB)


[style] ~37-~37: Consider a shorter alternative to avoid wordiness.
Context: ...ntipi is using to retrieve the appstore in order to test new apps you added. Create a `set...

(IN_ORDER_TO_PREMIUM)

src/content/docs/getting-started/installation.mdx

[uncategorized] ~7-~7: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...server. Make sure your server is secured and you have followed basic security practi...

(COMMA_COMPOUND_SENTENCE)


[uncategorized] ~37-~37: Missing comma.
Context: ...ntu 18.04 LTS or higher is recommended. However other major Linux distribution are supported ...

(HOWEVER_OTHER_COMMA)


[style] ~76-~76: Consider an alternative verb to strengthen your wording.
Context: ...s://setup.runtipi.io | bash ``` If you have some issue with the command above, you ...

(IF_YOU_HAVE_THIS_PROBLEM)

src/content/docs/getting-started/using-the-cli.mdx

[misspelling] ~110-~110: This word is normally spelled as one.
Context: ...his command is used to display help for an other command in Runtipi cli. To use this co...

(EN_COMPOUNDS_AN_OTHER)

src/content/docs/guides/auto-backup-apps.mdx

[typographical] ~5-~5: It appears that a comma is missing.
Context: ...to backup your apps using cron In this guide we will show you how to automate backin...

(DURING_THAT_TIME_COMMA)

src/content/docs/guides/customize-compose-and-traefik.mdx

[typographical] ~20-~20: It appears that a comma is missing.
Context: ...e a custom Docker Compose file In this example we will expose the traefik dashboard by...

(DURING_THAT_TIME_COMMA)


[typographical] ~21-~21: Consider adding a comma after ‘Firstly’ for more clarity.
Context: ...editing the main Runtipi compose file. Firstly we need to figure out what port traefik...

(RB_LY_COMMA)

src/content/docs/guides/dns-challenge-cloudflare.mdx

[grammar] ~4-~4: This sentence should probably be started with a verb instead of the noun ‘Setup’. If not, consider inserting a comma for better clarity.
Context: ...ts"; import Image from "next/image"; # Setup a DNS challenge with Cloudflare ## Ove...

(SENT_START_NN_DT)


[uncategorized] ~8-~8: Did you mean: “By default,”?
Context: ...ce with a dns challenge and cloudflare. By default Runtipi uses an http challenge to obtai...

(BY_DEFAULT_COMMA)


[style] ~8-~8: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ... the dashboard to the internet which is a very bad security practice. With a DNS challenge...

(EN_WEAK_ADJECTIVE)


[formatting] ~9-~9: Consider inserting a comma here, unless the first half is essential to the meaning of the sentence.
Context: ... very bad security practice. With a DNS challenge you can get trusted ssl certificates wi...

(WITH_THAT_COMMA)


[typographical] ~109-~109: Consider adding a comma after ‘Finally’ for more clarity.
Context: ...Callout> ### Restart Runtipi and test Finally we need to restart Runtipi with this co...

(RB_LY_COMMA)


[style] ~110-~110: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...## Restart Runtipi and test Finally we need to restart Runtipi with this command: ```...

(REP_NEED_TO_VB)


[typographical] ~115-~115: Consider adding a comma here.
Context: ...bash sudo ./runtipi-cli restart After that you can go to your Runtipi dashboard an...

(FOR_THAT_COMMA)


[misspelling] ~116-~116: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... it traefik should automatically obtain an ssl certificate from Let's Encrypt, be ...

(EN_A_VS_AN)

src/content/docs/guides/local-certificate.mdx

[typographical] ~49-~49: After the expression ‘for example’ a comma is usually used.
Context: ... as apps in the Runtipi App store. For example using AdGuard Home you can add the doma...

(COMMA_FOR_EXAMPLE)

src/content/docs/guides/uninstalling.mdx

[uncategorized] ~11-~11: Possible missing comma found.
Context: ...ery Docker image/volume/network created too you can run this command: ```bash dock...

(AI_HYDRA_LEO_MISSING_COMMA)

src/content/docs/introduction.mdx

[uncategorized] ~15-~15: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ing feedback. Runtipi is an open source personal homeserver orchestrator that e...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

src/content/docs/reference/config-json.mdx

[grammar] ~27-~27: The word ‘install’ is not a noun.
Context: ... to promt the user for input during the install, like a username or a password ...

(A_INSTALL)


[uncategorized] ~29-~29: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...precated it won't exist in the app store and it will notify users that is no longer ...

(COMMA_COMPOUND_SENTENCE)

src/content/docs/reference/dynamic-compose.mdx

[style] ~138-~138: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...les, environment variables can be added very easily using this simple format: ```json { ...

(EN_WEAK_ADJECTIVE)

src/content/docs/reference/environment-variables.mdx

[uncategorized] ~3-~3: Possible missing comma found.
Context: ... the .env file and cannot be manually changed as the file is generated by the start...

(AI_HYDRA_LEO_MISSING_COMMA)

src/content/docs/reference/folder-structure.mdx

[typographical] ~122-~122: It seems that a comma is missing.
Context: ...t to be edited, if you want to modify it please take a look at [Customize Runtipi compo...

(IF_PLEASE_COMMA)


[style] ~122-~122: To make your writing clearer, consider a more direct alternative.
Context: ...edited, if you want to modify it please take a look at [Customize Runtipi compose and ...

(TAKE_A_LOOK)

src/content/docs/reference/release-notes.mdx

[uncategorized] ~107-~107: Possible missing comma found.
Context: ...e caused issues if we released a bugged version making users unable to update. Now an u...

(AI_HYDRA_LEO_MISSING_COMMA)

🪛 markdownlint-cli2 (0.17.2)
README.md

15-15: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


16-16: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


17-17: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)

🪛 ESLint
src/app/components/pages/home.tsx

[error] 80-80: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 94-94: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 102-102: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 103-103: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 147-147: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 212-212: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 212-212: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)


[error] 214-214: " can be escaped with &quot;, &ldquo;, &#34;, &rdquo;.

(react/no-unescaped-entities)


[error] 218-218: ' can be escaped with &apos;, &lsquo;, &#39;, &rsquo;.

(react/no-unescaped-entities)

src/app/[...mdxPath]/page.tsx

[error] 16-16: React Hook "useMDXComponents" cannot be called at the top level. React Hooks must be called in a React function component or a custom React Hook function.

(react-hooks/rules-of-hooks)

src/app/components/AppsList.tsx

[error] 55-55: 'e' is defined but never used.

(@typescript-eslint/no-unused-vars)

🔇 Additional comments (14)
src/content/docs/reference/environment-variables.mdx (1)

Line range hint 44-54: LGTM! Well-documented app-specific variables.

The app-specific variables section is clear, comprehensive, and provides good explanations of the differences between similar variables like APP_DOMAIN and APP_HOST.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ... the .env file and cannot be manually changed as the file is generated by the start...

(AI_HYDRA_LEO_MISSING_COMMA)

src/app/components/GridPattern.tsx (1)

30-35: LGTM!

The rectangle implementation is correct and efficiently fills the SVG area with the defined pattern.

postcss.config.mjs (1)

4-4: ⚠️ Potential issue

Verify the Tailwind CSS plugin name.

The plugin name "@tailwindcss/postcss" seems unusual. The standard Tailwind CSS PostCSS plugin is typically named "tailwindcss".

Apply this diff to use the standard plugin name:

-    "@tailwindcss/postcss": {},
+    "tailwindcss": {},
src/content/docs/contributing/_meta.ts (1)

1-11: LGTM! Well-structured metadata.

The metadata structure follows Nextra's conventions with consistent naming patterns:

  • Keys in kebab-case for URL-friendly paths
  • Values in Title Case for display
src/app/components/Head.tsx (1)

31-34: Verify analytics domain and consider CSP implementation

The analytics script is loaded from an external domain. Consider:

  1. Verifying the domain ownership
  2. Implementing Content Security Policy (CSP)
  3. Adding SRI hash for the script
✅ Verification successful

Self-hosted Plausible Analytics instance verified, CSP recommended

The analytics domain is a valid self-hosted Plausible Analytics instance with proper security headers. While the current setup is acceptable, implementing a Content Security Policy would further enhance security by explicitly allowing this specific analytics source.

Example CSP header to consider:

script-src 'self' https://plausible.foreach.li;
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the analytics domain ownership and script integrity
curl -sI https://plausible.foreach.li/js/script.js | grep -i "content-security-policy\|strict-transport-security"

Length of output: 115


Script:

#!/bin/bash
# Check if domain is accessible
curl -I https://plausible.foreach.li

# Search for analytics related configuration
rg -i "plausible|analytics|tracking" -g '*.{json,js,ts,tsx,md}'

# Look for any environment or configuration files
fd -e env -e config.js -e config.ts -e config.json

Length of output: 2725

src/app/layout.tsx (1)

67-70: Add link to forums in feedback content

The feedback section mentions forums but doesn't provide a link.

src/app/components/Browser.tsx (1)

1-6: LGTM! Good use of Next.js Image optimization.

The component properly uses Next.js Image component for both light and dark theme variants.

src/app/globals.css (2)

1-4: LGTM! Well-structured Tailwind CSS setup.

The Tailwind CSS integration and variant definitions are properly implemented.


8-17: LGTM! Nice background pattern implementation.

The background gradients create a subtle and professional pattern that adapts well to both light and dark modes.

tsconfig.json (2)

3-14: LGTM! Modern TypeScript configuration.

The updated configuration aligns well with modern TypeScript and Next.js best practices:

  • ES2017 target provides good browser compatibility
  • Strict mode enables better type safety
  • Bundler module resolution is optimal for Next.js

16-23: LGTM! Well-structured path aliases.

The Next.js plugin and path aliases are properly configured for optimal module resolution.

package.json (1)

19-20: Verify React v19 compatibility.

React v19 is currently in development and might not be stable enough for production use.

Consider using the stable React v18 instead:

-    "react": "^19.0.0",
-    "react-dom": "^19.0.0",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0",
src/content/docs/reference/release-notes.mdx (1)

Line range hint 1-24: Well-structured release notes format!

The release notes follow a clear and consistent structure with proper categorization of changes, making it easy for users to understand the evolution of the project.

src/content/docs/contributing/adding-a-new-app.mdx (1)

Line range hint 1-24: Excellent documentation structure and content!

The guide provides clear, step-by-step instructions with comprehensive examples and explanations, making it easy for contributors to understand the process of adding new apps.

🧰 Tools
🪛 LanguageTool

[style] ~29-~29: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...license for personal use) - The app you want to add has an official and maintained Dock...

(REP_WANT_TO_VB)

@steveiliop56
Copy link
Collaborator

@coderabbitai resolve

@steveiliop56
Copy link
Collaborator

@coderabbitai pause

Copy link
Contributor

coderabbitai bot commented Jan 30, 2025

✅ Actions performed

Comments resolved.

Copy link
Contributor

coderabbitai bot commented Jan 30, 2025

✅ Actions performed

Reviews paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants