1import { themes as prismThemes } from 'prism-react-renderer'
2import type { Config } from '@docusaurus/types'
3import type * as Preset from '@docusaurus/preset-classic'
4
5import type * as OpenApiPlugin from 'docusaurus-plugin-openapi-docs'
6import type { Options as BlogOptions } from '@docusaurus/plugin-content-blog'
7import type { Options as PageOptions } from '@docusaurus/plugin-content-pages'
8
9import tailwindPlugin from './plugins/tailwind-config.cjs'
10
11const config: Config = {
12 title: 'Spice.ai OSS',
13 tagline:
14 'A portable SQL query and AI compute engine, written in Rust, for data-grounded apps and agents.',
15 favicon: 'img/favicon.ico',
16
17 // Set the production url of your site here
18 url: 'https://spiceai.org',
19 // Set the /<baseUrl>/ pathname under which your site is served
20 // For GitHub pages deployment, it is often '/<projectName>/'
21 baseUrl: '/',
22
23 trailingSlash: false,
24
25 // GitHub pages deployment config.
26 // If you aren't using GitHub pages, you don't need these.
27 organizationName: 'spiceai', // Usually your GitHub org/user name.
28 projectName: 'docs', // Usually your repo name.
29
30 onBrokenAnchors: 'throw',
31 onBrokenLinks: 'throw',
32 onBrokenMarkdownLinks: 'throw',
33
34 // Even if you don't use internationalization, you can use this field to set
35 // useful metadata like html lang. For example, if your site is Chinese, you
36 // may want to replace "en" with "zh-Hans".
37 i18n: {
38 defaultLocale: 'en',
39 locales: ['en']
40 },
41
42 future: {
43 v4: {
44 removeLegacyPostBuildHeadAttribute: true // required
45 },
46 experimental_faster: true
47 },
48
49 presets: [
50 [
51 'classic',
52 {
53 docs: {
54 routeBasePath: '/docs',
55 path: 'docs',
56 sidebarPath: 'sidebars.ts',
57 docItemComponent: '@theme/ApiItem',
58 editUrl: ({ docPath }) => {
59 return `https://github.com/spiceai/docs/edit/trunk/website/docs/${docPath}`
60 }
61 },
62 blog: {
63 path: 'blog',
64 showLastUpdateAuthor: true,
65 showLastUpdateTime: true,
66 onUntruncatedBlogPosts: 'ignore',
67 editUrl: ({ locale, blogDirPath, blogPath }) => {
68 return `https://github.com/spiceai/docs/edit/trunk/website/${blogDirPath}/${blogPath}`
69 },
70 remarkPlugins: [],
71 postsPerPage: 5,
72 feedOptions: {
73 type: 'all',
74 description:
75 'Keep up to date with upcoming Spice.ai OSS releases and articles by following our feed!',
76 copyright: `Copyright © 2025 Spice AI, Inc.`,
77 xslt: true
78 },
79 blogTitle: 'Spice.ai OSS blog',
80 blogDescription: 'Read blog posts about Spice.ai OSS from the team and community',
81 blogSidebarCount: 'ALL',
82 blogSidebarTitle: 'All Posts'
83 } satisfies BlogOptions,
84 pages: {
85 remarkPlugins: [],
86 showLastUpdateAuthor: true,
87 showLastUpdateTime: true
88 } satisfies PageOptions,
89 theme: {
90 customCss: ['./src/css/custom.css', './src/css/openapi.css', './src/css/preflight.css']
91 },
92 gtag: {
93 trackingID: 'G-SST0X6NS37',
94 anonymizeIP: true
95 }
96 } satisfies Preset.Options
97 ]
98 ],
99 themes: ['docusaurus-theme-openapi-docs'],
100 themeConfig: {
101 announcementBar: {
102 content:
103 '<a href="/blog/releases/v1.9.0">Introducing the Cayenne Data Accelerator & Multi-Node Distributed Query: Spice.ai OSS v1.9.0</a> is now available! 🌶',
104 backgroundColor: 'var(--announcement-bar-bg)',
105 textColor: 'var(--announcement-bar-text)',
106 isCloseable: true
107 },
108 navbar: {
109 title: 'Spice.ai OSS',
110 logo: {
111 alt: 'Spice.ai OSS logo',
112 src: 'img/logo.svg'
113 },
114 hideOnScroll: true,
115 items: [
116 {
117 type: 'doc',
118 position: 'left',
119 docId: 'index',
120 label: 'Docs'
121 },
122 {
123 type: 'docSidebar',
124 position: 'left',
125 sidebarId: 'api',
126 label: 'API'
127 },
128 { to: 'blog', label: 'Blog', position: 'left' },
129 { to: 'cookbook', label: 'Cookbook', position: 'left' },
130 { to: 'docs/reference/sql', label: 'SQL Reference', position: 'left' },
131 {
132 label: 'Try Spice Cloud',
133 href: 'https://spice.ai/login',
134 position: 'right'
135 },
136 {
137 label: 'X',
138 href: 'https://x.com/spice_ai',
139 position: 'right'
140 },
141 {
142 label: 'Slack',
143 href: 'https://spiceai.org/slack',
144 position: 'right'
145 },
146 {
147 label: 'YouTube',
148 href: 'https://www.youtube.com/@spiceai',
149 position: 'right'
150 },
151 {
152 href: 'https://github.com/spiceai/spiceai',
153 position: 'right',
154 className: 'header-github-link',
155 'aria-label': 'GitHub repository'
156 }
157 ]
158 },
159 footer: {
160 style: 'dark',
161 links: [
162 {
163 title: 'Docs',
164 items: [
165 {
166 label: 'Getting Started',
167 to: '/docs/getting-started'
168 },
169 {
170 label: 'API',
171 to: '/docs/api'
172 },
173 {
174 label: 'CLI',
175 to: '/docs/cli'
176 },
177 {
178 label: 'SDKs',
179 to: '/docs/sdks'
180 }
181 ]
182 },
183 {
184 title: 'Community',
185 items: [
186 {
187 label: 'Reddit',
188 href: 'https://reddit.com/r/spiceai'
189 },
190 {
191 label: 'Slack',
192 href: 'https://spiceai.org/slack'
193 },
194 {
195 label: 'X',
196 href: 'https://x.com/spice_ai'
197 },
198 {
199 label: 'YouTube',
200 href: 'https://www.youtube.com/@spiceai'
201 }
202 ]
203 },
204 {
205 title: 'More',
206 items: [
207 {
208 label: 'Blog',
209 href: 'https://blog.spiceai.org'
210 },
211 {
212 label: 'GitHub',
213 href: 'https://github.com/spiceai/spiceai'
214 }
215 ]
216 }
217 ],
218 copyright: `Copyright © 2025 Spice AI, Inc.`
219 },
220 languageTabs: [
221 {
222 highlight: 'bash',
223 language: 'curl',
224 logoClass: 'curl'
225 }
226 ],
227 prism: {
228 theme: prismThemes.oneLight,
229 darkTheme: prismThemes.gruvboxMaterialDark,
230 additionalLanguages: ['bash', 'json', 'csharp']
231 },
232 algolia: {
233 appId: '0SP8I8JTL8',
234 apiKey: '72f66fe334ccd3c7db696a123d68735c',
235 indexName: 'spiceai',
236 contextualSearch: false
237 }
238 } satisfies Preset.ThemeConfig,
239
240 headTags: [
241 {
242 tagName: 'link',
243 attributes: {
244 rel: 'preconnect',
245 href: 'https://fonts.googleapis.com'
246 }
247 },
248 {
249 tagName: 'link',
250 attributes: {
251 rel: 'preconnect',
252 href: 'https://fonts.gstatic.com',
253 crossorigin: 'true'
254 }
255 },
256 {
257 tagName: 'link',
258 attributes: {
259 href: 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',
260 rel: 'stylesheet'
261 }
262 },
263 {
264 tagName: 'link',
265 attributes: {
266 rel: 'icon',
267 type: 'image/png',
268 sizes: '32x32',
269 href: '/favicon-32x32.png'
270 }
271 },
272 {
273 tagName: 'link',
274 attributes: {
275 rel: 'icon',
276 type: 'image/png',
277 sizes: '16x16',
278 href: '/favicon-16x16.png'
279 }
280 },
281 {
282 tagName: 'script',
283 attributes: {
284 type: 'text/javascript',
285 id: 'hs-script-loader',
286 async: 'true',
287 defer: 'true',
288 src: '//js.hs-scripts.com/46107967.js'
289 }
290 }
291 ],
292
293 plugins: [
294 tailwindPlugin,
295 [
296 'docusaurus-plugin-openapi-docs',
297 {
298 id: 'api',
299 docsPluginId: 'classic',
300 config: {
301 spice: {
302 proxy: 'http://localhost:8090',
303
304 specPath: 'public/openapi.json',
305 outputDir: 'docs/api/HTTP',
306 sidebarOptions: {
307 groupPathsBy: 'tag'
308 }
309 } satisfies OpenApiPlugin.Options
310 }
311 }
312 ],
313 [
314 '@docusaurus/plugin-client-redirects',
315 {
316 redirects: [
317 {
318 from: '/query-federation',
319 to: '/docs/features/query-federation'
320 },
321 {
322 from: '/blog/2025/amazon-s3-vectors-with-spice',
323 to: '/blog/amazon-s3-vectors-with-spice'
324 },
325 {
326 from: '/federated-queries',
327 to: '/docs/features/query-federation'
328 },
329 {
330 from: '/data-ingestion',
331 to: '/docs/features/data-ingestion'
332 },
333 {
334 from: '/data-acceleration',
335 to: '/docs/features/data-acceleration'
336 },
337 {
338 from: '/monitoring',
339 to: '/docs/features/observability'
340 }
341 ]
342 }
343 ]
344 ]
345}
346
347export default config
348
1import { themes as prismThemes } from 'prism-react-renderer'
2import type { Config } from '@docusaurus/types'
3import type * as Preset from '@docusaurus/preset-classic'
4
5import type * as OpenApiPlugin from 'docusaurus-plugin-openapi-docs'
6import type { Options as BlogOptions } from '@docusaurus/plugin-content-blog'
7import type { Options as PageOptions } from '@docusaurus/plugin-content-pages'
8
9import tailwindPlugin from './plugins/tailwind-config.cjs'
10
11const config: Config = {
12 title: 'Spice.ai OSS',
13 tagline:
14 'A portable SQL query and AI compute engine, written in Rust, for data-grounded apps and agents.',
15 favicon: 'img/favicon.ico',
16
17 // Set the production url of your site here
18 url: 'https://spiceai.org',
19 // Set the /<baseUrl>/ pathname under which your site is served
20 // For GitHub pages deployment, it is often '/<projectName>/'
21 baseUrl: '/',
22
23 trailingSlash: false,
24
25 // GitHub pages deployment config.
26 // If you aren't using GitHub pages, you don't need these.
27 organizationName: 'spiceai', // Usually your GitHub org/user name.
28 projectName: 'docs', // Usually your repo name.
29
30 onBrokenAnchors: 'throw',
31 onBrokenLinks: 'throw',
32 onBrokenMarkdownLinks: 'throw',
33
34 // Even if you don't use internationalization, you can use this field to set
35 // useful metadata like html lang. For example, if your site is Chinese, you
36 // may want to replace "en" with "zh-Hans".
37 i18n: {
38 defaultLocale: 'en',
39 locales: ['en']
40 },
41
42 future: {
43 v4: {
44 removeLegacyPostBuildHeadAttribute: true // required
45 },
46 experimental_faster: true
47 },
48
49 presets: [
50 [
51 'classic',
52 {
53 docs: {
54 routeBasePath: '/docs',
55 path: 'docs',
56 sidebarPath: 'sidebars.ts',
57 docItemComponent: '@theme/ApiItem',
58 editUrl: ({ docPath }) => {
59 return `https://github.com/spiceai/docs/edit/trunk/website/docs/${docPath}`
60 }
61 },
62 blog: {
63 path: 'blog',
64 showLastUpdateAuthor: true,
65 showLastUpdateTime: true,
66 onUntruncatedBlogPosts: 'ignore',
67 editUrl: ({ locale, blogDirPath, blogPath }) => {
68 return `https://github.com/spiceai/docs/edit/trunk/website/${blogDirPath}/${blogPath}`
69 },
70 remarkPlugins: [],
71 postsPerPage: 5,
72 feedOptions: {
73 type: 'all',
74 description:
75 'Keep up to date with upcoming Spice.ai OSS releases and articles by following our feed!',
76 copyright: `Copyright © 2025 Spice AI, Inc.`,
77 xslt: true
78 },
79 blogTitle: 'Spice.ai OSS blog',
80 blogDescription: 'Read blog posts about Spice.ai OSS from the team and community',
81 blogSidebarCount: 'ALL',
82 blogSidebarTitle: 'All Posts'
83 } satisfies BlogOptions,
84 pages: {
85 remarkPlugins: [],
86 showLastUpdateAuthor: true,
87 showLastUpdateTime: true
88 } satisfies PageOptions,
89 theme: {
90 customCss: ['./src/css/custom.css', './src/css/openapi.css', './src/css/preflight.css']
91 },
92 gtag: {
93 trackingID: 'G-SST0X6NS37',
94 anonymizeIP: true
95 }
96 } satisfies Preset.Options
97 ]
98 ],
99 themes: ['docusaurus-theme-openapi-docs'],
100 themeConfig: {
101 announcementBar: {
102 content:
103 '<a href="/blog/releases/v1.9.0">Introducing the Cayenne Data Accelerator & Multi-Node Distributed Query: Spice.ai OSS v1.9.0</a> is now available! 🌶',
104 backgroundColor: 'var(--announcement-bar-bg)',
105 textColor: 'var(--announcement-bar-text)',
106 isCloseable: true
107 },
108 navbar: {
109 title: 'Spice.ai OSS',
110 logo: {
111 alt: 'Spice.ai OSS logo',
112 src: 'img/logo.svg'
113 },
114 hideOnScroll: true,
115 items: [
116 {
117 type: 'doc',
118 position: 'left',
119 docId: 'index',
120 label: 'Docs'
121 },
122 {
123 type: 'docSidebar',
124 position: 'left',
125 sidebarId: 'api',
126 label: 'API'
127 },
128 { to: 'blog', label: 'Blog', position: 'left' },
129 { to: 'cookbook', label: 'Cookbook', position: 'left' },
130 { to: 'docs/reference/sql', label: 'SQL Reference', position: 'left' },
131 {
132 label: 'Try Spice Cloud',
133 href: 'https://spice.ai/login',
134 position: 'right'
135 },
136 {
137 label: 'X',
138 href: 'https://x.com/spice_ai',
139 position: 'right'
140 },
141 {
142 label: 'Slack',
143 href: 'https://spiceai.org/slack',
144 position: 'right'
145 },
146 {
147 label: 'YouTube',
148 href: 'https://www.youtube.com/@spiceai',
149 position: 'right'
150 },
151 {
152 href: 'https://github.com/spiceai/spiceai',
153 position: 'right',
154 className: 'header-github-link',
155 'aria-label': 'GitHub repository'
156 }
157 ]
158 },
159 footer: {
160 style: 'dark',
161 links: [
162 {
163 title: 'Docs',
164 items: [
165 {
166 label: 'Getting Started',
167 to: '/docs/getting-started'
168 },
169 {
170 label: 'API',
171 to: '/docs/api'
172 },
173 {
174 label: 'CLI',
175 to: '/docs/cli'
176 },
177 {
178 label: 'SDKs',
179 to: '/docs/sdks'
180 }
181 ]
182 },
183 {
184 title: 'Community',
185 items: [
186 {
187 label: 'Reddit',
188 href: 'https://reddit.com/r/spiceai'
189 },
190 {
191 label: 'Slack',
192 href: 'https://spiceai.org/slack'
193 },
194 {
195 label: 'X',
196 href: 'https://x.com/spice_ai'
197 },
198 {
199 label: 'YouTube',
200 href: 'https://www.youtube.com/@spiceai'
201 }
202 ]
203 },
204 {
205 title: 'More',
206 items: [
207 {
208 label: 'Blog',
209 href: 'https://blog.spiceai.org'
210 },
211 {
212 label: 'GitHub',
213 href: 'https://github.com/spiceai/spiceai'
214 }
215 ]
216 }
217 ],
218 copyright: `Copyright © 2025 Spice AI, Inc.`
219 },
220 languageTabs: [
221 {
222 highlight: 'bash',
223 language: 'curl',
224 logoClass: 'curl'
225 }
226 ],
227 prism: {
228 theme: prismThemes.oneLight,
229 darkTheme: prismThemes.gruvboxMaterialDark,
230 additionalLanguages: ['bash', 'json', 'csharp']
231 },
232 algolia: {
233 appId: '0SP8I8JTL8',
234 apiKey: '72f66fe334ccd3c7db696a123d68735c',
235 indexName: 'spiceai',
236 contextualSearch: false
237 }
238 } satisfies Preset.ThemeConfig,
239
240 headTags: [
241 {
242 tagName: 'link',
243 attributes: {
244 rel: 'preconnect',
245 href: 'https://fonts.googleapis.com'
246 }
247 },
248 {
249 tagName: 'link',
250 attributes: {
251 rel: 'preconnect',
252 href: 'https://fonts.gstatic.com',
253 crossorigin: 'true'
254 }
255 },
256 {
257 tagName: 'link',
258 attributes: {
259 href: 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',
260 rel: 'stylesheet'
261 }
262 },
263 {
264 tagName: 'link',
265 attributes: {
266 rel: 'icon',
267 type: 'image/png',
268 sizes: '32x32',
269 href: '/favicon-32x32.png'
270 }
271 },
272 {
273 tagName: 'link',
274 attributes: {
275 rel: 'icon',
276 type: 'image/png',
277 sizes: '16x16',
278 href: '/favicon-16x16.png'
279 }
280 },
281 {
282 tagName: 'script',
283 attributes: {
284 type: 'text/javascript',
285 id: 'hs-script-loader',
286 async: 'true',
287 defer: 'true',
288 src: '//js.hs-scripts.com/46107967.js'
289 }
290 }
291 ],
292
293 plugins: [
294 tailwindPlugin,
295 [
296 'docusaurus-plugin-openapi-docs',
297 {
298 id: 'api',
299 docsPluginId: 'classic',
300 config: {
301 spice: {
302 proxy: 'http://localhost:8090',
303
304 specPath: 'public/openapi.json',
305 outputDir: 'docs/api/HTTP',
306 sidebarOptions: {
307 groupPathsBy: 'tag'
308 }
309 } satisfies OpenApiPlugin.Options
310 }
311 }
312 ],
313 [
314 '@docusaurus/plugin-client-redirects',
315 {
316 redirects: [
317 {
318 from: '/query-federation',
319 to: '/docs/features/query-federation'
320 },
321 {
322 from: '/blog/2025/amazon-s3-vectors-with-spice',
323 to: '/blog/amazon-s3-vectors-with-spice'
324 },
325 {
326 from: '/federated-queries',
327 to: '/docs/features/query-federation'
328 },
329 {
330 from: '/data-ingestion',
331 to: '/docs/features/data-ingestion'
332 },
333 {
334 from: '/data-acceleration',
335 to: '/docs/features/data-acceleration'
336 },
337 {
338 from: '/monitoring',
339 to: '/docs/features/observability'
340 }
341 ]
342 }
343 ]
344 ]
345}
346
347export default config
348