> ## Documentation Index
> Fetch the complete documentation index at: https://www.rootset.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Open-source structured data

> Typed tables, a spreadsheet UI, REST API and MCP. Self-host Rootset on PostgreSQL and own your data.

export const ThemeImage = ({light, dark, alt, width, height, sizes, priority = false}) => <>
    <div className="oss-product-light">
      <img src={light} alt={alt} width={width} height={height} sizes={sizes} loading={priority ? "eager" : "lazy"} fetchPriority={priority ? "high" : "auto"} />
    </div>
    <div className="oss-product-dark">
      <img src={dark || light} alt={alt} width={width} height={height} sizes={sizes} loading={priority ? "eager" : "lazy"} fetchPriority={priority ? "high" : "auto"} />
    </div>
  </>;

export const Points = ({children}) => <div className="oss-ownership-points">{children}</div>;

export const SectionIntro = ({children}) => <div className="oss-section-intro">{children}</div>;

export const SplitSection = ({id, children}) => <section className="oss-ownership" aria-labelledby={id}>
    {children}
  </section>;

export const Eyebrow = ({children}) => <p className="oss-feature-label">{children}</p>;

export const FeatureImage = ({children}) => <div className="oss-feature-image">{children}</div>;

export const FeatureCopy = ({children}) => <div className="oss-feature-copy">{children}</div>;

export const Feature = ({id, children}) => <section className="oss-feature" aria-labelledby={id}>
    {children}
  </section>;

export const FeatureGroup = ({children}) => <div className="oss-features">{children}</div>;

export const Highlights = ({children, ...props}) => <section {...props} className="oss-highlights">
    {children}
  </section>;

export const ProductFrame = ({children}) => <div className="oss-product">
    <div className="oss-product-frame">{children}</div>
  </div>;

export const InlineLink = ({children, ...props}) => <a {...props} className="oss-link">
    {children}
  </a>;

export const ActionLink = ({variant = "primary", children, ...props}) => <a {...props} data-oss-action={variant} className="group pl-3 pr-2 py-2 relative inline-flex items-center text-sm font-medium">
    <span className="absolute inset-0 bg-primary-dark rounded-xl group-hover:opacity-[0.9]" aria-hidden="true" />
    <div className="z-10 gap-1 flex items-center">
      <span className="text-white">{children}</span>
    </div>
  </a>;

export const Actions = ({children}) => <div className="oss-actions">{children}</div>;

export const Hero = ({id, children}) => <section className="oss-hero" aria-labelledby={id}>
    {children}
  </section>;

export const Home = ({children, ...props}) => <div {...props} className="oss-home">
    {children}
  </div>;

<Home>
  <Hero id="hero-heading">
    <h1 id="hero-heading">
      Open-source

      <br />

      <span>structured data</span>
    </h1>

    <p>
      Typed tables for your team, applications and AI tools.
      <br />A spreadsheet UI, REST API and MCP, on PostgreSQL you own.
    </p>

    <Actions>
      <ActionLink href="/self-hosting/installation">
        Install Rootset →
      </ActionLink>

      <ActionLink variant="secondary" href="https://github.com/avgeek-oss/rootset">
        Explore on GitHub ↗
      </ActionLink>
    </Actions>
  </Hero>

  <ProductFrame>
    <ThemeImage light="/assets/screenshots/rows-light.png" dark="/assets/screenshots/rows-dark.png" alt="Rootset product catalog with typed spreadsheet columns" width={3840} height={2160} priority />
  </ProductFrame>

  <Highlights aria-label="What you can do with Rootset">
    <div>
      <h2>Define your data</h2>

      <p>
        Group tables into databases and choose text, numbers, dates, JSON, links
        and images.
      </p>

      <InlineLink href="/fields">Explore field types →</InlineLink>
    </div>

    <div>
      <h2>Edit in place</h2>

      <p>
        Double-click a cell, filter the table and review its latest 200 saved
        changes.
      </p>

      <InlineLink href="/rows">Work with rows →</InlineLink>
    </div>

    <div>
      <h2>Connect your tools</h2>

      <p>
        Read and write the same data through REST and MCP with scoped personal
        or team keys.
      </p>

      <InlineLink href="/api-guide">Use the API →</InlineLink>
    </div>
  </Highlights>

  <FeatureGroup>
    <Feature id="fields-heading">
      <FeatureCopy>
        <Eyebrow>Schema</Eyebrow>
        <h2 id="fields-heading">Columns with clear rules.</h2>

        <p>
          Choose a type, set required values and defaults, and add bounds where
          they make sense. Field names are the same keys your API clients use.
        </p>

        <InlineLink href="/fields">Define fields →</InlineLink>
      </FeatureCopy>

      <FeatureImage>
        <ThemeImage light="/assets/screenshots/fields-light.png" dark="/assets/screenshots/fields-dark.png" alt="Rootset fields table with types, defaults and constraints" width={3840} height={2160} />
      </FeatureImage>
    </Feature>

    <Feature id="filters-heading">
      <FeatureCopy>
        <Eyebrow>Browse</Eyebrow>
        <h2 id="filters-heading">Find the records you need.</h2>

        <p>
          Build typed filters without setting up search indexes. Rootset loads
          bounded row windows as you scroll, keeping the spreadsheet focused on
          the current view.
        </p>

        <InlineLink href="/filters">Filter your table →</InlineLink>
      </FeatureCopy>

      <FeatureImage>
        <ThemeImage light="/assets/screenshots/filters-light.png" dark="/assets/screenshots/filters-dark.png" alt="Rootset filter form with field and match controls" width={3840} height={2160} />
      </FeatureImage>
    </Feature>

    <Feature id="rules-heading">
      <FeatureCopy>
        <Eyebrow>Integrity</Eyebrow>
        <h2 id="rules-heading">Keep combinations unique.</h2>

        <p>
          Create unique rules for one field or a combination. Rootset checks
          existing records before enforcing them on new writes.
        </p>

        <InlineLink href="/unique-rules">Create a unique rule →</InlineLink>
      </FeatureCopy>

      <FeatureImage>
        <ThemeImage light="/assets/screenshots/unique-rule-editor-light.png" dark="/assets/screenshots/unique-rule-editor-dark.png" alt="Create unique rule modal" width={3840} height={2160} />
      </FeatureImage>
    </Feature>

    <Feature id="exports-heading">
      <FeatureCopy>
        <Eyebrow>Export</Eyebrow>
        <h2 id="exports-heading">Take your table with you.</h2>

        <p>
          Request a complete CSV or JSONL snapshot. Follow its progress and
          download the finished file from Export Requests.
        </p>

        <InlineLink href="/export-requests">Export your data →</InlineLink>
      </FeatureCopy>

      <FeatureImage>
        <ThemeImage light="/assets/screenshots/export-editor-light.png" dark="/assets/screenshots/export-editor-dark.png" alt="Export request form with CSV and JSONL formats" width={3840} height={2160} />
      </FeatureImage>
    </Feature>
  </FeatureGroup>

  <SplitSection id="ownership-heading">
    <SectionIntro>
      <Eyebrow>Self-hosted</Eyebrow>
      <h2 id="ownership-heading">Your infrastructure. Your data.</h2>

      <p>
        Deploy matching API, worker and UI images, connect PostgreSQL, and give
        your workspace the services it needs.
      </p>
    </SectionIntro>

    <Points>
      <div>
        <h3>Versioned container images</h3>

        <p>
          Run separate API, worker and UI images on one release version.
          Migrations reuse the API image.
        </p>
      </div>

      <div>
        <h3>One database connection</h3>

        <p>
          Use your own PostgreSQL instance or the optional Compose database.
          There are no separate identity or DDL database credentials.
        </p>
      </div>

      <div>
        <h3>Workspace permissions</h3>

        <p>
          Admin, Member and Viewer roles apply across the UI, API and MCP. Team
          keys give automation its own scoped access.
        </p>
      </div>
    </Points>
  </SplitSection>

  <Actions>
    <ActionLink href="/self-hosting/installation">Set up Rootset →</ActionLink>

    <ActionLink variant="secondary" href="/quickstart">
      Explore the documentation →
    </ActionLink>
  </Actions>
</Home>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.