dotCMS logodotCMS logo
OverviewAuthorBuildManageReference
dotCMS Github RepodotCMS Github RepodotCMS Discourse CommunityChat With Us
Headless and SDKs
Build
Getting StartedContent ModelingHeadless and SDKsTemplates and ThemesServer Side ScriptingAPIsExtending dotCMSIntegrationsSearch

SDK Libraries

  • Headless SDK
  • SDK Example Projects
  • SDK: @dotcms/analytics Library
  • SDK: @dotcms/angular Library
  • SDK: @dotcms/client Library
  • SDK: @dotcms/experiments Library
  • SDK: @dotcms/react Library
  • SDK: @dotcms/types Library
  • SDK: @dotcms/uve Library
  • SDK: dotcms/php-sdk Library (alpha)

Example Projects

  • SDK: .NET Example
  • SDK: Angular Example
  • SDK: Astro Example
  • SDK: Laravel Example
  • SDK: Next.js Example
  • SDK: Symfony Example

dotCMS

Universal content management, made simple.

GitHubTwitterLinkedIndotCMS Discourse Community
dotDev HomeBlogChangelogsCurrent releasesAboutContactPrivacy PolicyTrust Center

© 2026 dotCMS. All rights reserved.

    Assistant

    Responses are generated using AI and may contain mistakes.

    Hi, I'm an AI assistant with access to documentation and other content.

    Tip: You can toggle this pane with ⌘/ or ⌘K.

    Try asking

    Enter to send · Shift+Enter for newline

    @dotcms/react

    The @dotcms/react SDK is the DotCMS official React library. It empowers React developers to build powerful, editable websites and applications in no time.

    Prerequisites & Setup#


    Get a dotCMS Environment#

    Version Compatibility#

    • Recommended: dotCMS Evergreen
    • Minimum: dotCMS v25.05
    • Best Experience: Latest Evergreen release

    Environment Setup#

    For Production Use:

    • ☁️ Cloud hosting options - managed solutions with SLA
    • 🛠️ Self-hosted options - deploy on your infrastructure

    For Testing & Development:

    • 🧑🏻‍💻 dotCMS demo site - perfect for trying out the SDK
    • 📘 Learn how to use the demo site
    • 📝 Read-only access, ideal for building proof-of-concepts

    For Local Development:

    • 🐳 Docker setup guide
    • 💻 Local installation guide

    Configure The Universal Visual Editor App#

    For a step-by-step guide on setting up the Universal Visual Editor, check out our easy-to-follow instructions and get started in no time!

    Create a dotCMS API Key#

    [!TIP] Make sure your API Token has read-only permissions for Pages, Folders, Assets, and Content. Using a key with minimal permissions follows security best practices.

    This integration requires an API Key with read-only permissions for security best practices:

    1. Go to the dotCMS admin panel.
    2. Click on System > Users.
    3. Select the user you want to create the API Key for.
    4. Go to API Access Key and generate a new key.

    For detailed instructions, please refer to the dotCMS API Documentation - Read-only token.

    Installation#

    npm install @dotcms/react@latest

    This will automatically install the required dependencies:

    • @dotcms/uve: Enables interaction with the Universal Visual Editor for real-time content editing
    • @dotcms/client: Provides the core client functionality for fetching and managing dotCMS data

    dotCMS Client Configuration#

    import { createDotCMSClient } from '@dotcms/client';
    
    type DotCMSClient = ReturnType<typeof createDotCMSClient>;
    
    export const dotCMSClient: DotCMSClient = createDotCMSClient({
        dotcmsUrl: 'https://your-dotcms-instance.com',
        authToken: 'your-auth-token', // Optional for public content
        siteId: 'your-site-id' // Optional site identifier/name
    });

    Proxy Configuration for Static Assets#

    Configure a proxy to leverage the powerful dotCMS image API, allowing you to resize and serve optimized images efficiently. This enhances application performance and improves user experience, making it a strategic enhancement for your project.

    1. Configure Vite#

    // vite.config.ts
    import { defineConfig } from 'vite';
    import dns from 'node:dns';
    
    dns.setDefaultResultOrder('verbatim');
    
    export default defineConfig({
        server: {
            proxy: {
                '/dA': {
                    target: 'your-dotcms-instance.com',
                    changeOrigin: true
                }
            }
        }
    });

    Learn more about Vite configuration here.

    2. Usage in Components#

    Once configured, image URLs in your components will automatically be proxied to your dotCMS instance:

    📚 Learn more about Image Resizing and Processing in dotCMS with Angular and Next.js.

    // /components/my-dotcms-image.tsx
    import type { DotCMSBasicContentlet } from '@dotcms/types';
    
    export const MyDotCMSImageComponent = ({ inode, title }: DotCMSBasicContentlet) => {
        return <img src={`/dA/${inode}`} alt={title} />;
    }

    Quickstart: Render a Page with dotCMS#


    The following example demonstrates how to quickly set up a basic dotCMS page renderer in your React application. This example shows how to:

    • Create a standalone component that renders a dotCMS page
    • Set up dynamic component loading for different content types
    • Handle both regular page viewing and editor mode
    • Subscribe to real-time page updates when in the Universal Visual Editor
    // /src/app/pages/dotcms-page.tsx
    import { useState, useEffect } from 'react';
    import { DotCMSLayoutBody, useEditableDotCMSPage } from '@dotcms/react';
    import { DotCMSPageResponse } from '@dotcms/types';
    
    import { dotCMSClient } from './dotCMSClient';
    import { BlogComponent } from './BlogComponent';
    import { ProductComponent } from './ProductComponent';
    
    const COMPONENTS_MAP = {
        Blog: BlogComponent,
        Product: ProductComponent
    };
    
    const MyPage = () => {
        const [response, setResponse] = useState<DotCMSPageResponse | null>(null);
        const { pageAsset } = useEditableDotCMSPage(response);
    
        useEffect(() => {
            dotCMSClient.page.get('/').then((response) => {
                setResponse(response);
            });
        }, []);
    
        return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} mode="development" />;
    };
    
    export default MyPage;

    Example Project 🚀#

    Looking to get started quickly? We've got you covered! Our Next.js starter project is the perfect launchpad for your dotCMS + Next.js journey. This production-ready template demonstrates everything you need:

    📦 Fetch and render dotCMS pages with best practices 🧩 Register and manage components for different content types 🔍 Listing pages with search functionality 📝 Detail pages for blogs 📈 Image and assets optimization for better performance ✨ Enable seamless editing via the Universal Visual Editor (UVE) ⚡️ Leverage React's hooks and state management for optimal performance

    [!TIP] This starter project is more than just an example, it follows all our best practices. We highly recommend using it as the base for your next dotCMS + Next.js project!

    SDK Reference#


    All components and hooks should be imported from @dotcms/react:

    DotCMSLayoutBody#

    DotCMSLayoutBody is a component used to render the layout for a DotCMS page, supporting both production and development modes.

    InputTypeRequiredDefaultDescription
    pageDotCMSPageAsset✅-The page asset containing the layout to render
    componentsDotCMSPageComponent✅{}Map of content type → React component
    modeDotCMSPageRendererMode❌'production'Rendering mode ('production' or 'development')
    slotsRecord<string, ReactNode>❌{}Pre-rendered server component nodes keyed by contentlet identifier. See buildSlots.

    Next.js App Router#

    DotCMSLayoutBody requires a "use client" parent because components is a map of React component functions, which React cannot serialize across the server→client boundary. The recommended pattern is to fetch data in the server page and pass the plain result to a client wrapper:

    // page.tsx — server component, fetches data only
    export default async function Page() {
        const pageContent = await getDotCMSPage(path);
        return <PageView pageContent={pageContent} />;
    }
    // PageView.tsx — "use client", owns components and renders layout
    'use client';
    
    export function PageView({ pageContent }) {
        const { pageAsset } = useEditableDotCMSPage(pageContent);
        return <DotCMSLayoutBody page={pageAsset} components={pageComponents} />;
    }

    Usage#

    import type { DotCMSPageResponse } from '@dotcms/types';
    import { DotCMSLayoutBody } from '@dotcms/react';
    
    import { MyBlogCard } from './MyBlogCard';
    import { DotCMSProductComponent } from './DotCMSProductComponent';
    
    const COMPONENTS_MAP = {
        Blog: MyBlogCard,
        Product: DotCMSProductComponent
    };
    
    const MyPage = ({ pageAsset }: DotCMSPageResponse) => {
        return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} />;
    };

    buildSlots#

    Use buildSlots when you have Next.js async server components that need to fetch their own data. Since async server components can't be called from inside a client component tree, pre-render them on the server and pass the result into the layout via slots:

    import { buildSlots, DotCMSLayoutBody } from '@dotcms/react';
    
    // BlogListContainer is an async server component that fetches its own data
    const slots = buildSlots(pageContent.pageAsset.containers, {
        BlogList: BlogListContainer,
    });
    
    <DotCMSLayoutBody page={pageAsset} components={pageComponents} slots={slots} />

    The layout renders the pre-rendered slot node for a contentlet if one exists, otherwise falls back to the matching entry in components.

    Layout Body Modes#

    • production: Performance-optimized mode that only renders content with explicitly mapped components, leaving unmapped content empty.
    • development: Debug-friendly mode that renders default components for unmapped content types and provides visual indicators and console logs for empty containers and missing mappings.

    Component Mapping#

    The DotCMSLayoutBody component uses a components prop to map content type variable names to React components. This allows you to render different components for different content types. Example:

    const DYNAMIC_COMPONENTS = {
        Blog: MyBlogCard,
        Product: DotCMSProductComponent
    };
    • Keys (e.g., Blog, Product): Match your content type variable names in dotCMS
    • Values: Dynamic imports of your React components that render each content type
    • Supports lazy loading through dynamic imports
    • Components must be standalone or declared in a module

    [!TIP] Always use the exact content type variable name from dotCMS as the key. You can find this in the Content Types section of your dotCMS admin panel.

    DotCMSEditableText#

    DotCMSEditableText is a component for inline editing of text fields in dotCMS, supporting plain text, text area, and WYSIWYG fields.

    InputTypeRequiredDescription
    contentletT extends DotCMSBasicContentlet✅The contentlet containing the editable field
    fieldNamekeyof T✅Name of the field to edit, which must be a valid key of the contentlet type T
    mode'plain' | 'full'❌plain (default): Supports text editing. Does not show style controls.
    full: Enables a bubble menu with style options. This mode only works with WYSIWYG fields.
    format'text' | 'html'❌text (default): Renders HTML tags as plain text
    html: Interprets and renders HTML markup

    Usage#

    import type { DotCMSBasicContentlet } from '@dotcms/types';
    import { DotCMSEditableText } from '@dotcms/react';
    
    const MyBannerComponent = ({ contentlet }: { contentlet: DotCMSBasicContentlet }) => {
        const { inode, title, link } = contentlet;
    
        return (
            <div className="flex overflow-hidden relative justify-center items-center w-full h-96 bg-gray-200">
                <img className="object-cover w-full" src={`/dA/${inode}`} alt={title} />
                <div className="flex absolute inset-0 flex-col justify-center items-center p-4 text-center text-white">
                    <h2 className="mb-2 text-6xl font-bold text-shadow">
                        <DotCMSEditableText fieldName="title" contentlet={contentlet} />
                    </h2>
                    <a
                        href={link}
                        className="p-4 text-xl bg-red-400 rounded-sm transition duration-300 hover:bg-red-500">
                        See more
                    </a>
                </div>
            </div>
        );
    };
    
    export default MyBannerComponent;

    Editor Integration#

    • Detects UVE edit mode and enables inline TinyMCE editing
    • Triggers a Save workflow action on blur without needing full content dialog.

    DotCMSBlockEditorRenderer#

    DotCMSBlockEditorRenderer is a component for rendering Block Editor content from dotCMS with support for custom block renderers.

    InputTypeRequiredDefaultDescription
    blocksBlockEditorContent✅-The Block Editor content to render
    customRenderersCustomRenderers❌-Custom rendering functions for specific block types
    classNamestring❌-CSS class to apply to the container
    styleCSSProperties❌-Inline styles for the container
    isDevModeboolean❌falseWhen true, shows a visible error message if the blocks data is invalid. When false (default), invalid blocks render nothing silently.

    Usage#

    import type { DotCMSBasicContentlet } from '@dotcms/types';
    import { DotCMSBlockEditorRenderer } from '@dotcms/react';
    
    import { MyCustomBannerBlock } from './MyCustomBannerBlock';
    import { MyCustomH1 } from './MyCustomH1';
    
    const CUSTOM_RENDERERS = {
        customBannerBlock: MyCustomBannerBlock,
        h1: MyCustomH1
    };
    
    const DetailPage = ({ contentlet }: { contentlet: DotCMSBasicContentlet }) => {
        return (
            <DotCMSBlockEditorRenderer
                blocks={contentlet['YOUR_BLOCK_EDITOR_FIELD']}
                customRenderers={CUSTOM_RENDERERS}
            />
        );
    };

    Next.js Server Components#

    DotCMSBlockEditorRenderer can be used directly in a Next.js server component — it has no hooks or browser dependencies:

    // app/article/page.tsx — server component
    import { DotCMSBlockEditorRenderer } from '@dotcms/react';
    
    export default async function ArticlePage() {
        const { pageAsset } = await getDotCMSPage('/article');
        const blocks = pageAsset.containers['...'].contentlets[0].blockEditorContent;
    
        return (
            <DotCMSBlockEditorRenderer
                blocks={blocks}
                isDevMode={process.env.NODE_ENV === 'development'}
            />
        );
    }

    Recommendations#

    • Should not be used with DotCMSEditableText
    • Take into account the CSS cascade can affect the look and feel of your blocks.
    • DotCMSBlockEditorRenderer only works with Block Editor fields. For other fields, use DotCMSEditableText.

    📘 For advanced examples, customization options, and best practices, refer to the DotCMSBlockEditorRenderer README.

    DotCMSShow#

    DotCMSShow is a component for conditionally rendering content based on the current UVE mode. Useful for mode-based behaviors outside of render logic.

    InputTypeRequiredDescription
    childrenReactNode✅Content to be conditionally rendered
    whenUVE_MODE✅The UVE mode when content should be displayed:
    UVE_MODE.EDIT: Only visible in edit mode
    UVE_MODE.PREVIEW: Only visible in preview mode
    UVE_MODE.PUBLISHED: Only visible in published mode

    Usage#

    import { UVE_MODE } from '@dotcms/types';
    import { DotCMSShow } from '@dotcms/react';
    
    const MyComponent = () => {
        return (
            <DotCMSShow when={UVE_MODE.EDIT}>
                <div>This will only render in UVE EDIT mode</div>
            </DotCMSShow>
        );
    };

    📚 Learn more about the UVE_MODE enum in the dotCMS UVE Package Documentation.

    useEditableDotCMSPage#

    useEditableDotCMSPage is a hook that enables real-time page updates when using the Universal Visual Editor.

    ParamTypeRequiredDescription
    pageResponseDotCMSPageResponse✅The page data object from client.page.get()

    Service Lifecycle & Operations#

    When you use the hook, it:

    1. Initializes the UVE with your page data
    2. Sets up communication channels with the editor
    3. Tracks content changes in real-time
    4. Updates your page automatically when:
      • Content is edited inline
      • Blocks are added or removed
      • Layout changes are made
      • Components are moved
    5. Cleans up all listeners and connections on destroy

    Usage#

    'use client';
    
    import { useEditableDotCMSPage, DotCMSLayoutBody } from '@dotcms/react';
    import type { DotCMSPageResponse } from '@dotcms/types';
    
    const COMPONENTS_MAP = {
        Blog: BlogComponent,
        Product: ProductComponent
    };
    
    export function DotCMSPage({ pageResponse }: { pageResponse: DotCMSPageResponse }) {
        const { pageAsset } = useEditableDotCMSPage(pageResponse);
        return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} />;
    }

    useDotCMSShowWhen#

    useDotCMSShowWhen is a hook for conditionally showing content based on the current UVE mode. Useful for mode-based behaviors outside of render logic.

    ParamTypeRequiredDescription
    whenUVE_MODE✅The UVE mode when content should be displayed:
    UVE_MODE.EDIT: Only visible in edit mode
    UVE_MODE.PREVIEW: Only visible in preview mode
    UVE_MODE.PUBLISHED: Only visible in published mode

    Usage#

    import { UVE_MODE } from '@dotcms/types';
    import { useDotCMSShowWhen } from '@dotcms/react';
    
    const MyEditButton = () => {
        const isEditMode = useDotCMSShowWhen(UVE_MODE.EDIT); // returns a boolean
    
        if (isEditMode) {
            return <button>Edit</button>;
        }
    
        return null;
    };

    useAISearch#

    useAISearch is a hook that enables AI-powered semantic search capabilities for your dotCMS content. It manages search state, handles API calls, and provides real-time status updates.

    ParamTypeRequiredDescription
    clientDotCMSClient✅The dotCMS client instance created with createDotCMSClient()
    indexNamestring✅Name of the AI search index to query
    paramsDotCMSAISearchParams✅Search configuration including query params (limit, offset) and AI config

    Return Value#

    The hook returns an object with the following properties:

    PropertyTypeDescription
    responseDotCMSAISearchResponse<T> | nullFull search response including metadata and results
    resultsDotCMSAISearchContentletData<T>[] | undefinedArray of search results with match scores
    statusDotCMSEntityStatusCurrent state: IDLE, LOADING, SUCCESS, or ERROR
    search(prompt: string) => Promise<void>Function to execute a search with a text prompt
    reset() => voidFunction to reset search state to idle

    Usage#

    'use client';
    
    import { useState } from 'react';
    import { useAISearch } from '@dotcms/react';
    import type { DotCMSBasicContentlet } from '@dotcms/types';
    import { dotCMSClient } from '@/lib/dotCMSClient';
    
    interface BlogPost extends DotCMSBasicContentlet {
        body: string;
        author: string;
    }
    
    const AISearchComponent = () => {
        const [searchQuery, setSearchQuery] = useState('');
    
        const { results, status, search, reset } = useAISearch<BlogPost>({
            client: dotCMSClient,
            indexName: 'blog-search-index',
            params: {
                query: {
                    limit: 10,
                    offset: 0,
                    contentType: 'Blog'
                },
                config: {
                    threshold: 0.5,
                    responseLength: 1024
                }
            }
        });
    
        const handleSearch = async () => {
            if (searchQuery.trim()) {
                await search(searchQuery);
            }
        };
    
        const handleReset = () => {
            setSearchQuery('');
            reset();
        };
    
        return (
            <div className="search-container">
                <div className="search-bar">
                    <input
                        type="text"
                        value={searchQuery}
                        onChange={(e) => setSearchQuery(e.target.value)}
                        placeholder="Search with AI..."
                    />
                    <button onClick={handleSearch} disabled={status.state === 'LOADING'}>
                        {status.state === 'LOADING' ? 'Searching...' : 'Search'}
                    </button>
                    <button onClick={handleReset}>Reset</button>
                </div>
    
                {status.state === 'ERROR' && (
                    <div className="error">
                        Error: {status.error.message}
                    </div>
                )}
    
                {status.state === 'SUCCESS' && results && (
                    <div className="results">
                        <h2>Found {results.length} results</h2>
                        {results.map((result) => (
                            <article key={result.identifier}>
                                <h3>{result.title}</h3>
                                <p>Author: {result.author}</p>
                                {result.matches?.map((match, idx) => (
                                    <div key={idx} className="match">
                                        <span>Relevance: {match.distance.toFixed(2)}</span>
                                        <p>{match.extractedText}</p>
                                    </div>
                                ))}
                            </article>
                        ))}
                    </div>
                )}
            </div>
        );
    };
    
    export default AISearchComponent;

    Features#

    • Automatic State Management: Handles loading, success, error, and idle states
    • Type-Safe Results: Generic typing ensures type safety for your content types
    • Search Validation: Automatically validates and trims search prompts
    • Configurable Parameters: Support for pagination, thresholds, and AI configuration
    • Error Handling: Provides detailed error information through status state
    • Reset Capability: Easy state reset for clearing search results

    Configuration Options#

    Query Parameters (params.query):

    • limit: Maximum number of results (default: 1000)
    • offset: Number of results to skip (default: 0)
    • siteId: Filter by specific site
    • contentType: Filter by content type
    • languageId: Filter by language

    AI Configuration (params.config):

    • threshold: Minimum similarity score (default: 0.5)
    • distanceFunction: Vector distance algorithm (default: cosine)
    • responseLength: Maximum response text length (default: 1024)

    Troubleshooting#


    Common Issues & Solutions#

    Universal Visual Editor (UVE)#

    1. UVE Not Loading: Page loads but UVE controls are not visible
      • Possible Causes:
        • Incorrect UVE configuration
        • Missing API token permissions
        • Missing the useEditableDotCMSPage hook to enable UVE.
      • Solutions:
        • Verify UVE app configuration in dotCMS admin
        • Check API token has edit permissions
        • Ensure dotcmsUrl matches your instance URL exactly

    Missing Content#

    1. Components Not Rendering: Empty spaces where content should appear

      • Possible Causes:
        • Missing component mappings
        • Incorrect content type variable names
      • Solutions:
        • Check component registration in components prop
        • Verify content type variable names match exactly
        • Enable development mode for detailed logging
    2. Asset Loading Issues: Images or files not loading

      • Possible Causes:
        • Proxy configuration issues
        • CORS restrictions
      • Solutions:
        • Verify proxy settings in vite.config.ts
        • Check network tab for CORS errors
        • Ensure /dA path is properly configured

    Development Setup#

    1. Build Errors: npm install fails

      • Solutions:
        • Clear npm cache: npm cache clean --force
        • Delete node_modules and reinstall
        • Verify Node.js version compatibility
    2. Runtime Errors: Console errors about missing imports or components not rendering

      • Solutions:
        • Check all imports are from @dotcms/react
        • Verify all peer dependencies are installed
        • Update to latest compatible versions

    Next.js App Router Integration#

    1. Server Component Errors: Errors about React class components in Server Components

      • Possible Causes:

        • Using dotCMS components directly in Server Components
        • Missing 'use client' directive
        • Incorrect data fetching pattern
      • Solutions:

        1. Split your code into Server and Client Components:

          // app/page.tsx (Server Component)
          import { DotCMSPage } from '@/components/DotCMSPage';
          import { dotCMSClient } from '@/lib/dotCMSClient';
          
          export default async function Page() {
              const pageResponse = await dotCMSClient.page.get('/index');
              return <DotCMSPage pageResponse={pageResponse} />;
          }
          // components/DotCMSPage.tsx (Client Component)
          'use client';
          
          import { useEditableDotCMSPage, DotCMSLayoutBody } from '@dotcms/react';
          import type { DotCMSPageResponse } from '@dotcms/types';
          
          const COMPONENTS_MAP = {
              Blog: BlogComponent,
              Product: ProductComponent
          };
          
          export function DotCMSPage({ pageResponse }: { pageResponse: DotCMSPageResponse }) {
              const { pageAsset } = useEditableDotCMSPage(pageResponse);
              return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} />;
          }
        2. Always fetch data in Server Components for better performance

        3. Use Client Components only for rendering dotCMS interactive components

    Debugging Tips#

    1. Enable Development Mode

      <DotCMSLayoutBody
          page={pageAsset}
          components={COMPONENTS_MAP}
          mode="development"
      />

      This will:

      • Show detailed error messages
      • Highlight unmapped components
      • Log component lifecycle events
    2. Check Browser Console

      • Check for errors in the browser console
      • Check for errors in the browser network tab
    3. Network Monitoring

      • Use browser dev tools to monitor API calls
      • Check for 401/403 errors (auth issues)
      • Verify asset loading paths

    Still Having Issues?#

    If you're still experiencing problems after trying these solutions:

    1. Search existing GitHub issues
    2. Ask questions on the community forum to engage with other users.
    3. Create a new issue with:
      • Detailed reproduction steps
      • Environment information
      • Error messages
      • Code samples

    Support#


    We offer multiple channels to get help with the dotCMS React SDK:

    • GitHub Issues: For bug reports and feature requests, please open an issue in the GitHub repository.
    • Community Forum: Join our community discussions to ask questions and share solutions.
    • Stack Overflow: Use the tag dotcms-react when posting questions.
    • Enterprise Support: Enterprise customers can access premium support through the dotCMS Support Portal.

    When reporting issues, please include:

    • SDK version you're using
    • React version
    • Minimal reproduction steps
    • Expected vs. actual behavior

    Contributing#


    GitHub pull requests are the preferred method to contribute code to dotCMS. We welcome contributions to the dotCMS React SDK! If you'd like to contribute, please follow these steps:

    1. Fork the repository dotCMS/core
    2. Create a feature branch (git checkout -b feature/amazing-feature)
    3. Commit your changes (git commit -m 'Add some amazing feature')
    4. Push to the branch (git push origin feature/amazing-feature)
    5. Open a Pull Request

    Please ensure your code follows the existing style and includes appropriate tests.

    Licensing#


    dotCMS is available under either the Business Source License 1.1 (BSL) or a commercial license.

    Under the BSL, dotCMS can be used at no cost by individual developers, small businesses or agencies under $5M in total finances, and by larger organizations in non-production environments. Every BSL release automatically converts to GPL v3 four years after its release date. For full terms and FAQs, visit dotcms.com/bsl and dotcms.com/bsl-faq.

    Production use in larger organizations, along with access to managed cloud, SLAs, support, and enterprise capabilities, is available under a commercial license from dotCMS. For details on commercial plans, features, and support options, see dotcms.com/pricing.

    Package: @dotcms/react
    Tag: latest

    Found an issue with this documentation? View the source