1"use strict";(globalThis.webpackChunksite=globalThis.webpackChunksite||[]).push([[4583],{2881(e,s,a){a.r(s),a.d(s,{default:()=>ys});var i=a(96540),n=a(34164),r=a(28774),t=a(44586),c=a(79139),l=a(51107);const o="heroNav_QxEI",d="heroNavInner_SIYK",h="heroNavLeft_or0u",u="heroNavRight_LICS",m="heroNavLogo_ln4N",x="heroNavScrolled_Lo22",g="heroNavLink_vKzI",p="heroNavExternal_oqWA",j="heroNavToggle_CIww",f="heroNavLogoMobile_qAQB",b="heroSidebar_MnHv",v="heroSidebarBackdrop_si_T",N="heroSidebarOpen_Ga94",y="heroSidebarHeader_QhdF",_="heroSidebarClose_s9dR",w="heroSidebarLinks_Rm4h",L="heroSidebarLink_E62F",k="heroBanner_qdFl",S="heroVideo_l9rg",A="titleDesktop_oKUW",D="titleMobile_ndS9",C="buttons_AeoN",q="useCasesSection__Osl",I="sectionHeader_Gahl",P="mainContent_EI1P",Q="benefits_Hl6G",M="sectionTitle_iy5Q",T="benefitRow__cWH",G="benefitItem_yVAE",B="iconContainer_HFf3",O="keySvg_aA7O",F="benefitTitle_ZR3n",H="benefitDescription_dKMG";var R=a(74848);const E=[{title:"Data Mesh\u2013Ready",svg:"/img/benefits/data-mesh-logo.svg",description:"Build federated, domain-driven schemas without losing visibility or control."},{title:"Geospatial & Analytical Power",svg:"/img/benefits/analytics-logo.svg",description:"Perform spatial joins, aggregations, and OLAP queries \u2014 all in GraphQL."},{title:"Modern Data Stack Support",svg:"/img/benefits/modern-stack-logo.svg",description:"Natively integrates with Postgres, DuckDB, Parquet, Iceberg, Delta Lake, and REST APIs."},{title:"Cluster-Ready & Extensible",svg:"/img/benefits/cluster-logo.svg",description:"Scale with your workloads or embed the engine directly in your Go services."},{title:"Talk-to-data",svg:"/img/benefits/talk-to-data-logo.svg",description:"Comming soon! Leverage natural language queries to access and analyze your data effortlessly."},{title:"Secure by Design",svg:"/img/benefits/security-logo.svg",description:"Enforce fine-grained access policies with built-in authentication and role-based permissions."}],z=({benefit:e})=>(0,R.jsxs)("div",{className:G,children:[(0,R.jsx)("div",{className:B,children:(0,R.jsx)("img",{className:O,src:e.svg,alt:e.title,role:"img"})}),(0,R.jsx)(l.A,{as:"h3",className:F,children:e.title}),(0,R.jsx)("p",{className:H,children:e.description})]});function W(){return(0,R.jsx)("section",{className:Q,children:(0,R.jsxs)("div",{className:"container",children:[(0,R.jsxs)("h2",{className:M,children:["Key ",(0,R.jsx)("span",{className:"highlighted",children:"Benefits"})]}),(0,R.jsx)("div",{className:T,children:E.map((e,s)=>(0,R.jsx)(z,{benefit:e},s))})]})})}const J="useCaseSection_e0IH",K="useCaseGrid_oWJ4",V="useCaseContent_fgrM",$="useCaseVisual_VTtC";function U({title:e,description:s,bullets:a,children:i,childrenLeft:r}){return(0,R.jsx)("section",{className:(0,n.A)(J),children:(0,R.jsxs)("div",{className:K,children:[r&&i&&(0,R.jsx)("div",{className:$,children:i}),(0,R.jsxs)("div",{className:V,children:[(0,R.jsx)("h3",{children:e}),s&&(0,R.jsx)("p",{children:s}),a&&(0,R.jsx)("ul",{children:a.map((e,s)=>(0,R.jsx)("li",{children:e},s))})]}),!r&&i&&(0,R.jsx)("div",{className:$,children:i})]})})}const Y="descriptionSection_lSOX",Z="descriptionGrid_wlC0",X="descriptionVisual_paYO",ee="descriptionContent_A7Gf",se="headline_rue0",ae="paragraph_LQBm",ie="buttons_gE8D";function ne(){return(0,R.jsx)("section",{className:Y,children:(0,R.jsx)("div",{className:"container",children:(0,R.jsxs)("div",{className:Z,children:[(0,R.jsx)("div",{className:X,children:(0,R.jsx)("img",{src:"/img/logo-one.svg",alt:"The hugr Data Mesh platform and GraphQL backend"})}),(0,R.jsxs)("div",{className:ee,children:[(0,R.jsxs)("h3",{className:se,children:["Hugr is an ",(0,R.jsx)("strong",{children:"Open Source Data Mesh Platform"})," and high-performance ",(0,R.jsx)("strong",{children:"GraphQL Backend"}),"."]}),(0,R.jsxs)("p",{className:ae,children:["Designed for seamless access to ",(0,R.jsx)("strong",{children:"distributed data sources"}),", advanced analytics, and geospatial processing \u2014 Hugr powers ",(0,R.jsx)("strong",{children:"rapid backend development"})," for applications and BI tools. It provides a ",(0,R.jsx)("strong",{children:"unified GraphQL API"})," across all your data."]}),(0,R.jsx)("div",{className:ie,children:(0,R.jsx)(r.A,{className:"button button--primary button--lg",to:"/docs/overview",children:"Learn More"})})]})]})})})}const re="duckdbSection_GGdQ",te="content_ansi",ce="logoContainer_ekKA",le="logo_L_K4",oe="textContent_lglI",de="title_gHCW",he="logoLink_WAlS",ue="description_RRO8",me=()=>(0,R.jsx)("section",{className:re,children:(0,R.jsx)("div",{className:"container",children:(0,R.jsxs)("div",{className:te,children:[(0,R.jsx)("div",{className:ce,children:(0,R.jsx)("a",{href:"https://duckdb.org",target:"_blank",rel:"noopener noreferrer",className:he,children:(0,R.jsx)("img",{src:"/img/duckdb-logo.svg",alt:"DuckDB Logo",className:le})})}),(0,R.jsxs)("div",{className:oe,children:[(0,R.jsx)("h3",{className:de,children:"Powered by DuckDB"}),(0,R.jsxs)("p",{className:ue,children:["hugr leverages ",(0,R.jsx)("strong",{children:"DuckDB"})," - the blazing-fast in-process analytical database - as its core engine. This enables lightning-speed cross-source JOINs and aggregations directly in memory, combining data from PostgreSQL, S3 Parquet files, CSV, and geospatial formats in a single GraphQL query. With zero network latency and OLAP-optimized performance, DuckDB makes hugr the perfect choice for analytic workloads and data mesh architectures."]})]})]})})}),xe="dataMeshSection_ZJTZ",ge="mainContent_J2bn",pe="textContent_jWgc",je="imageContent_cDOj",fe="title_l3I2",be="description_wmGL",ve="expandButton_nQlE",Ne="expandedContent_xKay",ye="introText_VkqO",_e="principlesGrid_ERbR",we="principleItem_aYRE",Le="hugrRole_jl_9",ke="comparisonTable_dlAC",Se="tableRow_g7G1",Ae="aspectHeader_eIxT",De="aspectCell_f435",Ce="traditionalHeader_flCw",qe="meshHeader_Ov8V",Ie="traditionalCell_wdwQ",Pe="meshCell_osOh";function Qe(){const[e,s]=(0,i.useState)(!1);return(0,R.jsx)("section",{className:xe,children:(0,R.jsx)("div",{className:"container",children:(0,R.jsxs)("div",{className:ge,children:[(0,R.jsxs)("div",{className:pe,children:[(0,R.jsx)("h2",{className:fe,children:"Understanding Data Mesh"}),(0,R.jsx)("p",{className:be,children:"Data Mesh is a modern approach where teams own and publish their data as a product \u2014 just like they do with APIs or microservices."}),(0,R.jsx)("p",{className:be,children:"Hugr enables this by giving every domain a flexible, secure, and unified way to expose their data using GraphQL."}),(0,R.jsx)("button",{className:ve,onClick:()=>s(!e),children:e?"Show Less":"Read More"})]}),(0,R.jsx)("div",{className:je,children:(0,R.jsx)("img",{src:"/img/data-mesh/image.png",alt:"Data Mesh visualization"})}),e&&(0,R.jsxs)("div",{className:Ne,children:[(0,R.jsx)("p",{className:ye,children:"In traditional data architectures, a centralized data team collects and serves data to the organization. This often leads to bottlenecks and low data ownership."}),(0,R.jsx)("h3",{className:"highlighted",children:"Data Mesh is different:"}),(0,R.jsxs)("div",{className:_e,children:[(0,R.jsxs)("div",{className:we,children:[(0,R.jsx)("h3",{children:"\u2022 Data as a product:"}),(0,R.jsx)("p",{children:"Each dataset has a clear owner and is treated with the same care as software products."})]}),(0,R.jsxs)("div",{className:we,children:[(0,R.jsx)("h3",{children:"\u2022 Domain ownership:"}),(0,R.jsx)("p",{children:"Teams that produce data are responsible for its quality and availability."})]}),(0,R.jsxs)("div",{className:we,children:[(0,R.jsx)("h3",{children:"\u2022 Self
1-serve platform:"}),(0,R.jsx)("p",{children:"Anyone can discover and query data through standardized interfaces."})]}),(0,R.jsxs)("div",{className:we,children:[(0,R.jsx)("h3",{children:"\u2022 Federated governance:"}),(0,R.jsx)("p",{children:"Standards and policies are enforced without a central bottleneck."})]})]}),(0,R.jsx)("div",{className:Le,children:(0,R.jsx)("em",{children:"Hugr makes this possible by giving each team a unified GraphQL API to expose data from SQL, files, or APIs \u2014 with security, caching, and flexible transformations built in."})}),(0,R.jsxs)("div",{className:ke,children:[(0,R.jsxs)("div",{className:Se,children:[(0,R.jsx)("div",{className:Ae,children:"Aspect"}),(0,R.jsx)("div",{className:Ce,children:"Traditional Data Lake"}),(0,R.jsx)("div",{className:qe,children:"Data Mesh"})]}),(0,R.jsxs)("div",{className:Se,children:[(0,R.jsx)("div",{className:De,children:"Ownership"}),(0,R.jsx)("div",{className:Ie,children:"Central data team owns everything"}),(0,R.jsx)("div",{className:Pe,children:"Domain teams own their data"})]}),(0,R.jsxs)("div",{className:Se,children:[(0,R.jsx)("div",{className:De,children:"Access"}),(0,R.jsx)("div",{className:Ie,children:"Complex requests through data team"}),(0,R.jsx)("div",{className:Pe,children:"Self-service APIs for each domain"})]}),(0,R.jsxs)("div",{className:Se,children:[(0,R.jsx)("div",{className:De,children:"Quality"}),(0,R.jsx)("div",{className:Ie,children:"Centralized quality control"}),(0,R.jsx)("div",{className:Pe,children:"Domain experts ensure quality"})]}),(0,R.jsxs)("div",{className:Se,children:[(0,R.jsx)("div",{className:De,children:"Scalability"}),(0,R.jsx)("div",{className:Ie,children:"Bottleneck at central team"}),(0,R.jsx)("div",{className:Pe,children:"Scales with business domains"})]})]})]})]})})})}const Me="setupSection_FfDg",Te="sectionTitle_iv_R",Ge="setupContent_I7yM",Be="setupBlock_geZk",Oe="blockTitle_H3jD",Fe="blockDescription_SpYx",He="osTabs_Jy4_",Re="dbTabs_MQ14",Ee="tabButton_v0DL",ze="active_UNW5",We="commandBlock_m3qF",Je="commandLabel_cuzm",Ke="commandRow_ETfr",Ve="commandColumn_q5vv",$e="dbExample_cSWa",Ue="exampleTitle_S7ka",Ye="exampleDescription_SXxZ",Ze="helpText_Xfe8",Xe="darkCodeBlock_zSzv",es="collapsibleHeader_cFK7",ss="toggleIcon_G4R1",as="collapsibleContent_oIfd",is="open_O46T";var ns=a(83457);function rs(){const[e,s]=(0,i.useState)("mac-linux"),[a,n]=(0,i.useState)("duckdb"),[t,c]=(0,i.useState)(!1),o={"mac-linux":{run:"docker run -d --name hugr -p 15000:15000 -v ./schemas:/schemas ghcr.io/hugr-lab/automigrate:latest",stop:"docker stop hugr",logs:"docker logs -f hugr"},windows:{run:"docker run -d --name hugr -p 15000:15000 -v %cd%/schemas:/schemas ghcr.io/hugr-lab/automigrate:latest",stop:"docker stop hugr",logs:"docker logs -f hugr"}},d={duckdb:{title:"Connect DuckDB Database",description:"Use DuckDB as an embedded analytical database with auto-generated schema",mutation:'mutation AddDuckDBSource {\n core {\n insert_data_sources(data: {\n name: "analytics"\n type: "duckdb"\n description: "DuckDB analytics database"\n path: "/data/analytics.db"\n as_module: true\n self_defined: true\n }) {\n name\n type\n }\n }\n}\n\n# Load the data source\nmutation LoadDuckDBSource {\n function {\n core {\n load_data_source(name: "analytics") {\n success\n message\n }\n }\n }\n}'},postgresql:{title:"Connect PostgreSQL Database",description:(0,R.jsxs)(R.Fragment,{children:["Connect to PostgreSQL with full OLTP support. Before adding the data source, create GraphQL schema file(s) to describe your database tables and place them in the ",(0,R.jsx)("code",{children:"./schemas"})," directory (mapped to ",(0,R.jsx)("code",{children:"/schemas"})," in container)."," ",(0,R.jsx)(r.A,{to:"/docs/engine-configuration/schema-definition",children:"Learn more about schema definition \u2192"})]}),mutation:'mutation AddPostgreSQLSource {\n core {\n insert_data_sources(data: {\n name: "production"\n type: "postgres"\n description: "Production PostgreSQL database"\n path: "postgres://user:password@localhost:5432/mydb"\n as_module: true\n catalogs: [\n {\n name: "schema"\n type: "uri"\n description: "Schema definition"\n path: "/schemas"\n }\n ]\n }) {\n name\n type\n }\n }\n}\n\n# Load the data source\nmutation LoadPostgreSQLSource {\n function {\n core {\n load_data_source(name: "production") {\n success\n message\n }\n }\n }\n}'}};return(0,R.jsx)("section",{className:Me,children:(0,R.jsxs)("div",{className:"container",children:[(0,R.jsxs)(l.A,{as:"h2",className:Te,children:["Quick ",(0,R.jsx)("span",{className:"highlighted",children:"Setup"})," in 2 Minutes"]}),(0,R.jsxs)("div",{className:Ge,children:[(0,R.jsxs)("div",{className:Be,children:[(0,R.jsx)(l.A,{as:"h3",className:Oe,children:"1. Start Hugr in Container"}),(0,R.jsxs)("p",{className:Fe,children:["Make sure you have Docker installed on your machine."," ",(0,R.jsx)(r.A,{to:"/docs/deployment/container",children:"Read deployment guide \u2192"})]}),(0,R.jsxs)("div",{className:He,children:[(0,R.jsx)("button",{className:`${Ee} ${"mac-linux"===e?ze:""}`,onClick:()=>s("mac-linux"),children:"Mac / Linux"}),(0,R.jsx)("button",{className:`${Ee} ${"windows"===e?ze:""}`,onClick:()=>s("windows"),children:"Windows"})]}),(0,R.jsxs)("div",{className:We,children:[(0,R.jsx)("p",{className:Je,children:"Start hugr container:"}),(0,R.jsx)(ns.A,{language:"bash",className:Xe,children:o[e].run}),(0,R.jsx)("p",{className:Je,children:"Access the admin UI:"}),(0,R.jsx)(ns.A,{language:"text",children:"http://localhost:15000/admin"}),(0,R.jsxs)("div",{className:Ke,children:[(0,R.jsxs)("div",{className:Ve,children:[(0,R.jsx)("p",{className:Je,children:"Stop container:"}),(0,R.jsx)(ns.A,{language:"bash",className:Xe,children:o[e].stop})]}),(0,R.jsxs)("div",{className:Ve,children:[(0,R.jsx)("p",{className:Je,children:"View logs:"}),(0,R.jsx)(ns.A,{language:"bash",className:Xe,children:o[e].logs})]})]})]})]}),(0,R.jsxs)("div",{className:Be,children:[(0,R.jsxs)("button",{className:es,onClick:()=>c(!t),"aria-expanded":t,children:[(0,R.jsx)(l.A,{as:"h3",className:Oe,children:"2. Connect Your Database (Optional)"}),(0,R.jsx)("span",{className:ss,children:t?"\u2212":"+"})]}),(0,R.jsxs)("div",{className:`${as} ${t?is:""}`,children:[(0,R.jsxs)("div",{className:Re,children:[(0,R.jsx)("button",{className:`${Ee} ${"duckdb"===a?ze:""}`,onClick:()=>n("duckdb"),children:"DuckDB"}),(0,R.jsx)("button",{className:`${Ee} ${"postgresql"===a?ze:""}`,onClick:()=>n("postgresql"),children:"PostgreSQL"})]}),(0,R.jsxs)("div",{className:$e,children:[(0,R.jsx)(l.A,{as:"h4",className:Ue,children:d[a].title}),(0,R.jsx)("p",{className:Ye,children:d[a].description}),(0,R.jsx)(ns.A,{language:"graphql",children:d[a].mutation}),(0,R.jsxs)("p",{className:Ze,children:["Execute this mutation in the admin UI at"," ",(0,R.jsx)("code",{children:"http://localhost:15000/admin"})]})]})]})]})]})]})})}const ts="faqSection_bWcd",cs="sectionTitle_KgGe",ls="faqList_FXRw",os="faqItem_l5T7",ds="faqQuestion_KqRI",hs="open_a810",us="questionNumber_kOmc",ms="questionText_Ourm",xs="toggleIcon_npAL",gs="faqAnswer_jb4t",ps="answerContent_Sjqp",js=[{question:"What is hugr?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr is an open-source Data Mesh platform and high-performance GraphQL backend for accessing distributed data sources. It provides a unified GraphQL API across diverse sources including databases (PostgreSQL, MySQL, DuckDB, SQL Server), data lakes (DuckLake, Apache Iceberg), file formats (Parquet, Delta Lake), and REST APIs."}),(0,R.jsx)("p",{children:"hugr enables rapid API development, analytics & BI, geospatial processing, and serves as a universal data access layer for applications."}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/overview",children:"Learn more about hugr \u2192"})})]})},{question:"What is Data Mesh?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"Data Mesh is a decentralized approach to data architecture that treats data as a product, with domain-specific ownership. hugr enables Data Mesh by providing:"}),(0,R.jsxs)("ul",{children:[(0,R.jsx)("li",{children:"Modular schema definitions that can be reused across different sources"}),(0,R.jsx)("li",{children:"Federated access through a single GraphQL API"}),(0,R.jsx)("li",{children:"Domain-specific modeling and independent scaling"}),(0,R.jsx)("li",{children:"Decentralized data ownership while maintaining unified access"})]}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/concept",children:"Learn more about Data Mesh architecture \u2192"})})]})},{question:"What data sources are supported?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr supports multiple data source types:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Relational Databases:"})," DuckDB, PostgreSQL (with PostGIS, TimescaleDB, pgvector), MySQL, ",(0,R.jsx)("a",{href:"https://hugr-lab.github.io/mssql-extension/",children:"SQL Server / Azure SQL"})]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Data Lakes:"})," DuckLake (snapshot-based time-travel, schema versioning \u2014 with the catalog in PostgreSQL, DuckDB or ",(0,R.jsx)("a",{href:"https://hugr-lab.github.io/mssql-ducklake/",children:"SQL Server / Azure SQL"}),"), Apache Iceberg (REST catalogs, AWS Glue, S3 Tables \u2014 with time-travel and self-describing schema)"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"File Formats:"})," Parquet, Delta Lake, CSV, JSON"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Spatial Formats:"})," GeoParquet, GeoJSON, Shapefiles (GDAL compatible)"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Services:"})," REST APIs with authentication (HTTP Basic, ApiKey, OAuth2)"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Storage:"})," Local files and cloud object storage (S3-compatible)"]})]}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/engine-configuration/data-sources",children:"Learn more about data sources \u2192"})})]})},{question:"How are data sources described?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"Data sources are described using GraphQL SDL (Schema Definition Language) with hugr-specific directives. Key directives include:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@table"})," - Define database tables"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@view"})," - Define views with SQL expressions"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@field_references"})," - Define relationships between tables"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@join"})," - Define subquery fields in schema for data selection"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@module"})," - Organize schema into logical modules"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@function"})," - Define custom functions"]})]}),(0,R.jsx)("p",{children:"Schema files are stored in catalogs and can be located in file systems, HTTP endpoints, or S3 buckets."}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/references/directives",children:"Learn more about schema directives \u2192"})})]})},{question:"What types of queries and mutations can be performed on tabular data?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:(0,R.jsx)("strong",{children:"Queries:"})}),(0,R.jsxs)("ul",{children:[(0,R.jsx)("li",{children:"Basic CRUD operations with filtering, sorting, and pagination"}),(0,R.jsx)("li",{children:"Complex aggregations (count, sum, avg, min, max) and bucket aggregations"}),(0,R.jsx)("li",{children:"Cross-source queries and relationships"}),(0,R.jsx)("li",{children:"Spatial joins and geospatial operations"}),(0,R.jsx)("li",{children:"Vector search for semantic similarity"})]}),(0,R.jsx)("p",{children:(0,R.jsx)("strong",{children:"Mutations:"})}),(0,R.jsxs)("ul",{children:[(0,R.jsx)("li",{children:"Insert records with
1nested relations"}),(0,R.jsx)("li",{children:"Update multiple records with filters"}),(0,R.jsx)("li",{children:"Delete with conditional filters"}),(0,R.jsx)("li",{children:"Full transaction support within single requests"})]}),(0,R.jsxs)("p",{children:[(0,R.jsx)(r.A,{to:"/docs/graphql/queries",children:"Learn more about queries \u2192"})," | ",(0,R.jsx)(r.A,{to:"/docs/graphql/mutations",children:"Learn more about mutations \u2192"})]})]})},{question:"Is caching supported?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"Yes, hugr provides a comprehensive two-level caching system:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"L1 Cache (In-Memory):"})," Fast local cache for quick access"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"L2 Cache (Distributed):"})," Redis/Memcached for shared cache across cluster nodes"]})]}),(0,R.jsx)("p",{children:"Caching is controlled via directives:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@cache"})," - Enable caching with configurable TTL and tags"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@no_cache"})," - Disable caching for real-time data"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("code",{children:"@invalidate_cache"})," - Force cache refresh"]})]}),(0,R.jsx)("p",{children:"Automatic cache invalidation occurs on mutations based on tags."}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/engine-configuration/cache",children:"Learn more about caching \u2192"})})]})},{question:"What authentication methods are supported?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr supports multiple authentication methods:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"API Keys:"})," Static keys for service-to-service communication, with support for managed keys stored in database"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"OAuth2/JWT:"})," Token-based authentication with standard JWT claims and custom claim mapping"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"OIDC:"})," OpenID Connect for enterprise identity providers (Google, Auth0, Keycloak, Azure AD)"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Anonymous:"})," Unauthenticated access with limited permissions"]})]}),(0,R.jsx)("p",{children:"Multiple methods can be enabled simultaneously, and hugr tries each in order."}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/deployment/auth",children:"Learn more about authentication \u2192"})})]})},{question:"How are permissions and roles configured?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr uses role-based access control (RBAC) managed through GraphQL API:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Roles:"})," Define user roles in the ",(0,R.jsx)("code",{children:"roles"})," table"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Permissions:"})," Configure field-level and type-level access in ",(0,R.jsx)("code",{children:"role_permissions"})," table"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Row-Level Security:"})," Apply mandatory filters to restrict data access"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Default Values:"})," Auto-inject values in mutations (e.g., user_id, tenant_id)"]})]}),(0,R.jsxs)("p",{children:["Permissions support wildcards (",(0,R.jsx)("code",{children:"*"}),") for broad rules with specific exceptions. Access is open by default; add permission entries to restrict."]}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/engine-configuration/access-control",children:"Learn more about access control \u2192"})})]})},{question:"What is DuckDB and why does hugr use it?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"DuckDB is a high-performance analytical database engine optimized for OLAP workloads. hugr uses DuckDB as its core query engine because:"}),(0,R.jsxs)("ul",{children:[(0,R.jsx)("li",{children:"Optimized for analytical queries and aggregations"}),(0,R.jsx)("li",{children:"Native support for multiple data formats (Parquet, CSV, JSON)"}
1),(0,R.jsx)("li",{children:"In-process execution with efficient memory usage"}),(0,R.jsx)("li",{children:"Excellent performance for large-scale data processing"}),(0,R.jsx)("li",{children:"Can attach external databases (PostgreSQL, MySQL) and query them together"})]}),(0,R.jsx)("p",{children:(0,R.jsx)(r.A,{to:"/docs/engine-configuration/data-sources/duckdb",children:"Learn more about DuckDB integration \u2192"})})]})},{question:"Can hugr handle spatial/geospatial data?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"Yes, hugr has native support for geospatial operations:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:["Native ",(0,R.jsx)("code",{children:"Geometry"})," scalar type for spatial fields"]}),(0,R.jsx)("li",{children:"Support for PostGIS (PostgreSQL) and DuckDB spatial extension"}),(0,R.jsx)("li",{children:"Spatial file formats: GeoParquet, GeoJSON, Shapefiles"}),(0,R.jsx)("li",{children:"Spatial joins and aggregations across data sources"}),(0,R.jsx)("li",{children:"Distance-based queries and spatial relationships"}),(0,R.jsx)("li",{children:"H3 clustering for hierarchical spatial indexing"})]}),(0,R.jsxs)("p",{children:[(0,R.jsx)(r.A,{to:"/docs/graphql/queries/spatial",children:"Learn more about spatial queries \u2192"})," | ",(0,R.jsx)(r.A,{to:"/docs/graphql/queries/h3-clustering",children:"Learn more about H3 clustering \u2192"})]})]})},{question:"How does hugr scale for production workloads?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr is designed for enterprise-scale deployments:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Horizontal Scaling:"})," Stateless nodes that can be added/removed dynamically"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Cluster Mode:"})," Multi-node operation with load balancing and fault tolerance"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Caching:"})," Two-level cache (in-memory + Redis/Memcached) reduces database load"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Performance:"})," Query optimization and pushdown to data sources"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Kubernetes Ready:"})," Helm charts for easy K8s deployment"]})]}),(0,R.jsxs)("p",{children:[(0,R.jsx)(r.A,{to:"/docs/deployment/cluster",children:"Learn more about cluster mode \u2192"})," | ",(0,R.jsx)(r.A,{to:"/docs/deployment/container",children:"Learn more about container deployment \u2192"})]})]})},{question:"What output formats are supported?",answer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("p",{children:"hugr supports multiple output formats:"}),(0,R.jsxs)("ul",{children:[(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"GraphQL JSON:"})," Standard GraphQL response format"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Arrow IPC:"})," Efficient binary format for large datasets via Hugr multipart IPC protocol"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"Python Integration:"})," Direct export to pandas DataFrame and GeoDataFrame"]}),(0,R.jsxs)("li",{children:[(0,R.jsx)("strong",{children:"JQ Transformations:"})," Server-side data transformation with custom JSON output"]})]}),(0,R.jsx)("p",{children:"The Arrow IPC protocol enables efficient streaming of large datasets to analytics and ML pipelines."}),(0,R.jsxs)("p",{children:[(0,R.jsx)(r.A,{to:"/docs/querying/hugr-ipc",children:"Learn more about Arrow IPC \u2192"})," | ",(0,R.jsx)(r.A,{to:"/docs/querying/python-client",children:"Learn more about Python client \u2192"})," | ",(0,R.jsx)(r.A,{to:"/docs/querying/jq-endpoint",children:"Learn more about JQ transformations \u2192"})]})]})}],fs=({item:e,index:s,isOpen:a,onToggle:i})=>(0,R.jsxs)("div",{className:os,children:[(0,R.jsxs)("button",{className:`${ds} ${a?hs:""}`,onClick:i,"aria-expanded":a,children:[(0,R.jsxs)("span",{className:us,children:[s+1,"."]}),(0,R.jsx)("span",{className:ms,children:e.question}),(0,R.jsx)("span",{className:xs,children:a?"\u2212":"+"})]}),(0,R.jsx)("div",{className:`${gs} ${a?hs:""}`,children:(0,R.jsx)("div",{className:ps,children:e.answer})})]});function bs(){const[e,s]=(0,i.useState)(new Set);return(0,R.jsx)("section",{className:ts,children:(0,R.jsxs)("div",{className:"container",children:[(0,R.jsxs)(l.A,{as:"h2",className:cs,children:["Frequently Asked ",(0,R.jsx)("span",{className:"highlighted",children:"Questions"})]}),(0,R.jsx)("div",{className:ls,children:js.map((a,i)=>(0,R.jsx)(fs,{item:a,index:i,isOpen:e.has(i),onToggle:()=>(e=>{s(s=>{const a=new Set(s);return a.has(e)?a.delete(e):a.add(e),a})})(i)},i))})]})})}function vs(){const[e,s]=(0,i.useState)(!1),[a,t]=(0,i.useState)(!1);return(0,i.useEffect)(()=>{const e=()=>{s(window.scrollY>80)};return window.addEventListener("scroll",e,{passive:!0}
1),e(),()=>window.removeEventListener("scroll",e)},[]),(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)("nav",{className:(0,n.A)(o,e&&x),children:(0,R.jsxs)("div",{className:d,children:[(0,R.jsx)("button",{className:j,onClick:()=>t(!a),"aria-label":"Toggle navigation",children:(0,R.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[(0,R.jsx)("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),(0,R.jsx)("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),(0,R.jsx)("line",{x1:"3",y1:"18",x2:"21",y2:"18"})]})}),(0,R.jsxs)("div",{className:h,children:[(0,R.jsx)(r.A,{to:"/",className:m,children:(0,R.jsx)("img",{src:"/img/logo-circle.svg",alt:"Hugr Lab"})}),(0,R.jsx)(r.A,{to:"/docs/overview/",className:g,children:"Docs"}),(0,R.jsx)(r.A,{to:"/docs/join-us/",className:g,children:"Join us"})]}),(0,R.jsx)(r.A,{to:"/",className:f,children:(0,R.jsx)("img",{src:"/img/logo-circle.svg",alt:"Hugr Lab"})}),(0,R.jsx)("div",{className:u,children:(0,R.jsxs)(r.A,{to:"https://github.com/hugr-lab/hugr",className:(0,n.A)(g,p),children:["GitHub",(0,R.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{marginLeft:"0.3rem"},children:[(0,R.jsx)("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),(0,R.jsx)("polyline",{points:"15 3 21 3 21 9"}),(0,R.jsx)("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})]})})]})}),a&&(0,R.jsx)("div",{className:v,onClick:()=>t(!1)}),(0,R.jsxs)("div",{className:(0,n.A)(b,a&&N),children:[(0,R.jsxs)("div",{className:y,children:[(0,R.jsx)(r.A,{to:"/",className:m,children:(0,R.jsx)("img",{src:"/img/logo-circle.svg",alt:"Hugr Lab"})}),(0,R.jsx)("button",{className:_,onClick:()=>t(!1),"aria-label":"Close navigation",children:(0,R.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[(0,R.jsx)("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),(0,R.jsx)("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),(0,R.jsxs)("div",{className:w,children:[(0,R.jsx)(r.A,{to:"/docs/overview/",className:L,onClick:()=>t(!1),children:"Docs"}),(0,R.jsx)(r.A,{to:"/docs/join-us/",className:L,onClick:()=>t(!1),children:"Join Us"}),(0,R.jsx)(r.A,{to:"https://github.com/hugr-lab/hugr",className:L,onClick:()=>t(!1),children:"GitHub"})]})]})]})}function Ns(){const{siteConfig:e}=(0,t.A)(),[s,a]=(0,i.useState)(!1),c=(0,i.useRef)(null);return(0,i.useEffect)(()=>{const e=window.matchMedia("(min-width: 997px)");a(e.matches);const s=e=>a(e.matches);return e.addEventListener("change",s),()=>e.removeEventListener("change",s)},[]),(0,i.useEffect)(()=>{s&&c.current&&c.current.play().catch(()=>{})},[s]),(0,R.jsxs)("header",{className:(0,n.A)("hero",k),children:[s&&(0,R.jsx)("video",{ref:c,className:S,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,poster:"/img/hero_mobile_smooth.png",children:(0,R.jsx)("source",{src:"/video/heroloop_shifted_up.mp4",type:"video/mp4"})}),(0,R.jsxs)("div",{className:"container",children:[(0,R.jsxs)(l.A,{as:"h1",className:"hero__title",children:[(0,R.jsx)("span",{className:A,children:e.title}),(0,R.jsx)("span",{className:D,children:"Unified API for All Your Data"})]}),(0,R.jsx)("p",{className:"hero__subtitle",children:"One GraphQL layer for all your data."}),(0,R.jsx)("p",{className:"hero__description",children:e.tagline}),(0,R.jsx)("div",{className:C,children:(0,R.jsx)(r.A,{className:"button button--primary button--lg",to:"/docs/get-started",children:"Get Started"})})]})]})}function ys(){const{siteConfig:e}=(0,t.A)();return(0,R.jsxs)(c.A,{wrapperClassName:"homepage",title:`${e.title}`,description:"hugr - Open Source Data Mesh platform and high-performance GraphQL backend for distributed data sources",children:[(0,R.jsx)(vs,{}),(0,R.jsx)(Ns,{}),(0,R.jsxs)("main",{className:P,children:[(0,R.jsx)(ne,{}),(0,R.jsx)(W,{}),(0,R.jsx)(Qe,{}),(0,R.jsx)("section",{className:q,children:(0,R.jsxs)("div",{className:"container",children:[(0,R.jsx)("h2",{className:(0,n.A)("text--center highlighted",I),children:"Use Cases"}),(0,R.jsx)(U,{title:"1. Data Access Backend for Applications",description:"hugr acts as a universal GraphQL layer over data sources:",childrenLeft:!0,bullets:["Rapid API deployment over existing databases and files","Centralized schema and access control","Unified interfaces for apps and BI tools","Minimal manual integration","Ideal for data-first applications"],children:(0,R.jsx)("img",{src:"/img/use-cases/data-backend.svg",alt:"Data Access Backend for Applications"})}),(0,R.jsx)(U,{title:"2. Building Data Mesh Platforms",description:"hugr is perfect for Data Mesh architecture:",childrenLeft:!0,bullets:["Modular schema definitions","Federated access through a single API","Decentralized data ownership","Domain-specific modeling and scaling","Easy onboarding of teams and data sources"],children:(0,R.jsx)("img",{src:"/img/use-cases/data-mesh-schema.svg",alt:"Data Mesh Platform Architecture"})}),(0,R.jsx)(U,{title:"3. Analytics, DataOps and MLOps Integration",description:"hugr enables:",childrenLeft:!0,bullets:["Support for OLAP and spatial analytics","Export to Arrow IPC and Python (pandas/GeoDataFrame)","Server-side jq transformations","Caching and scalability for heavy w
1orkloads","Integration of ETL/ELT and ML pipeline results"],children:(0,R.jsx)("img",{src:"/img/use-cases/data-ops-integration.svg",alt:"Analytics and MLOps Integration"})}),(0,R.jsx)(U,{title:"4. Vibe/Agentic Analytics",description:"hugr MCP powers Vibe's analytics platform by:",childrenLeft:!0,bullets:["Modular schema design for diverse data sources","Summarize data objects and their fields, relationships, functions, modules and data sources descriptions using LLMs to better understand business context","Lazy Hugr schema introspection tools to automatically generate GraphQL queries based on user requests","Allow models to build complex queries over multiple data sources and performs chain of queries to fetch and aggregate data as needed","Allow models to build JQ transformations to process and filter data server-side before returning results to users"],children:(0,R.jsx)("img",{src:"/img/use-cases/vibe.svg",alt:"Vibe analytics"})})]})}),(0,R.jsx)(rs,{}),(0,R.jsx)(bs,{}),(0,R.jsx)(me,{})]})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.