Skip to content

Commit f4297b6

Browse files
committed
chore: improved documentation site
1 parent 6a47188 commit f4297b6

16 files changed

Lines changed: 476 additions & 90 deletions

‎.github/workflows/docs-deploy.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ jobs:
3737

3838
- name: Check deployment configuration
3939
env:
40-
COOLIFY_DEPLOY_WEBHOOK: ${{ vars.COOLIFY_DEPLOY_WEBHOOK }}
40+
COOLIFY_DEPLOY_WEBHOOK: ${{ secrets.COOLIFY_DEPLOY_WEBHOOK }}
4141
COOLIFY_TOKEN: ${{ secrets.COOLIFY_TOKEN }}
4242
run: |
43-
: "${COOLIFY_DEPLOY_WEBHOOK:?Set the docs-production COOLIFY_DEPLOY_WEBHOOK variable}"
44-
: "${COOLIFY_TOKEN:?Set the docs-production COOLIFY_TOKEN secret}"
43+
: "${COOLIFY_DEPLOY_WEBHOOK:?Set the COOLIFY_DEPLOY_WEBHOOK Actions secret}"
44+
: "${COOLIFY_TOKEN:?Set the COOLIFY_TOKEN Actions secret}"
4545
4646
- name: Name the image
4747
id: image
@@ -105,7 +105,7 @@ jobs:
105105
106106
- name: Request Coolify deployment
107107
env:
108-
COOLIFY_DEPLOY_WEBHOOK: ${{ vars.COOLIFY_DEPLOY_WEBHOOK }}
108+
COOLIFY_DEPLOY_WEBHOOK: ${{ secrets.COOLIFY_DEPLOY_WEBHOOK }}
109109
COOLIFY_TOKEN: ${{ secrets.COOLIFY_TOKEN }}
110110
run: bash docs/scripts/deploy-coolify.sh
111111

‎docs/.nvmrc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
22
1+
26

‎docs/Dockerfile‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
# Build context is docs/, not the repository root.
2-
FROM node:22-alpine AS build
2+
FROM node:26-alpine AS build
33
WORKDIR /app
44
ENV NEXT_TELEMETRY_DISABLED=1
55
RUN npm install --global pnpm@9.8.0
66
COPY package.json pnpm-lock.yaml source.config.ts ./
7+
COPY scripts/check-node.mjs ./scripts/check-node.mjs
78
RUN pnpm install --frozen-lockfile
89
COPY . .
910
RUN pnpm check && pnpm build
1011

11-
FROM node:22-alpine AS runner
12+
FROM node:26-alpine AS runner
1213
WORKDIR /app
1314
ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 HOSTNAME=0.0.0.0 PORT=3000
1415
COPY --from=build --chown=node:node /app/.next/standalone ./

‎docs/app/global.css‎

Lines changed: 131 additions & 38 deletions
Large diffs are not rendered by default.

‎docs/app/layout.tsx‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,34 @@
11
import type { Metadata } from 'next';
2+
import localFont from 'next/font/local';
23
import { RootProvider } from 'fumadocs-ui/provider/next';
34
import './global.css';
45

6+
// Match Spatialnode's Inter UI and Crimson Pro display typography, served locally.
7+
const inter = localFont({
8+
src: '../assets/fonts/inter-latin.woff2',
9+
variable: '--font-inter',
10+
weight: '100 900',
11+
display: 'swap',
12+
});
13+
const crimson = localFont({
14+
src: '../assets/fonts/crimson-pro-latin.woff2',
15+
variable: '--font-crimson-pro',
16+
weight: '200 900',
17+
display: 'swap',
18+
});
19+
520
export const metadata: Metadata = {
621
metadataBase: new URL('https://spatialnode.com'),
722
title: { default: 'SuperSTAC — Many catalogs. One search.', template: '%s | SuperSTAC' },
8-
description: 'Search across STAC catalogs through one interface, with Python, Rust, or the command line. A Spatialnode open-source project.',
23+
description: 'Search across STAC catalogs through one interface, with Python, Rust, or the command line.',
924
icons: { icon: '/superstac/favicon.svg' },
1025
};
1126

1227
export default function RootLayout({ children }: { children: React.ReactNode }) {
1328
return (
1429
<html lang="en" suppressHydrationWarning>
15-
<body>
16-
<RootProvider theme={{ storageKey: 'superstac-theme' }} search={{ options: { api: '/superstac/api/search' } }}>
30+
<body className={`${inter.variable} ${crimson.variable}`}>
31+
<RootProvider theme={{ storageKey: 'theme', defaultTheme: 'system', enableSystem: true, disableTransitionOnChange: true }} search={{ options: { api: '/superstac/api/search' } }}>
1732
{children}
1833
</RootProvider>
1934
</body>

‎docs/app/page.tsx‎

Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,78 @@ import { PoweredBySpatialnode } from '@/components/powered-by-spatialnode';
88
import type { Metadata } from 'next';
99

1010
export const metadata: Metadata = { alternates: { canonical: '/superstac' } };
11-
const paths = [
12-
{ icon: Braces, label: 'Python', title: 'From notebook to pipeline.', text: 'A familiar client, ordinary dictionaries, and sync or async search.', href: '/docs/python/overview' },
13-
{ icon: Layers, label: 'Rust', title: 'Built into your application.', text: 'Embed the engine. Keep control of configuration and lifecycle.', href: '/docs/rust/overview' },
14-
{ icon: Terminal, label: 'Command line', title: 'An answer from your terminal.', text: 'Discover collections, search an area, and inspect the results.', href: '/docs/cli/overview' },
11+
12+
const guides = [
13+
{ icon: Braces, title: 'Python', text: 'Search from scripts and notebooks with the sync or async client.', href: '/docs/python/overview' },
14+
{ icon: Layers, title: 'Rust', text: 'Add the search engine to a Rust application.', href: '/docs/rust/overview' },
15+
{ icon: Terminal, title: 'Command line', text: 'List collections, search catalogs, and export results as JSON.', href: '/docs/cli/overview' },
1516
];
17+
1618
export default function Home() {
17-
return <HomeLayout {...baseOptions()}>
18-
<div className="landing" id="main-content">
19-
<section className="landing-hero">
20-
<div className="hero-copy">
21-
<Link href="/docs/reference/status" className="release-pill"><span className="tiny-dot"/> OPEN SOURCE · V0.1 ALPHA <ArrowUpRight size={12}/></Link>
22-
<h1>Many catalogs.<br/><span>One search.</span></h1>
23-
<p className="hero-description">Search across STAC catalogs through one interface, with Python, Rust, or the command line.</p>
24-
<div className="hero-actions"><Link href="/docs/start/quickstart" className="button-primary">Start searching <ArrowRight size={16}/></Link><Link href="/docs" className="button-secondary"><BookOpen size={16}/> Explore the docs</Link></div>
25-
<div className="hero-install"><span aria-hidden="true">$</span><code>pip install superstac</code><span className="install-note">Python · Rust · CLI</span></div>
19+
return (
20+
<HomeLayout {...baseOptions()}>
21+
<div className="landing" id="main-content">
22+
<section className="landing-hero">
23+
<div className="hero-copy">
24+
<Link href="/docs/reference/status" className="release-pill">
25+
<span className="tiny-dot" /> v0.1 · Alpha <ArrowUpRight size={12} />
26+
</Link>
27+
<h1>Many catalogs.<br /><span>One search.</span></h1>
28+
<p className="hero-description">Search across STAC catalogs through one interface, with Python, Rust, or the command line.</p>
29+
<div className="hero-actions">
30+
<Link href="/docs/start/quickstart" className="button-primary">Quickstart <ArrowRight size={16} /></Link>
31+
<Link href="/docs/start/installation" className="button-secondary"><BookOpen size={16} /> Installation</Link>
32+
</div>
33+
<div className="hero-install"><span aria-hidden="true">$</span><code>pip install superstac</code></div>
34+
</div>
35+
<FederationMap />
36+
</section>
37+
38+
<section className="start-section" aria-labelledby="choose-title">
39+
<div className="section-intro"><h2 id="choose-title">Guides</h2></div>
40+
<div className="path-cards">
41+
{guides.map(({ icon: Icon, ...guide }) => (
42+
<Link className="path-card" href={guide.href} key={guide.title}>
43+
<Icon className="path-icon" size={23} />
44+
<h3>{guide.title}</h3>
45+
<p>{guide.text}</p>
46+
<span className="path-link">Read the guide <ArrowRight size={15} /></span>
47+
</Link>
48+
))}
49+
</div>
50+
</section>
51+
52+
<section className="code-section" aria-labelledby="example-title">
53+
<div className="code-section-copy">
54+
<h2 id="example-title">Search example</h2>
55+
<p>Register the catalogs you want to search, then query a collection. SuperSTAC sends the request to the relevant catalogs and combines their results.</p>
56+
<ul>
57+
<li><Scan size={18} /><span>Filter by location and date.</span></li>
58+
<li><GitMerge size={18} /><span>Normalize collection and asset names, and remove duplicate item IDs.</span></li>
59+
<li><Layers size={18} /><span>Check which catalogs responded and which failed.</span></li>
60+
</ul>
61+
<Link href="/docs/start/quickstart" className="text-link">Full example and configuration <ArrowRight size={15} /></Link>
62+
</div>
63+
<CodePreview />
64+
</section>
65+
66+
<section className="reference-banner" aria-labelledby="reference-title">
67+
<h2 id="reference-title">Reference</h2>
68+
<div>
69+
<Link href="/docs/reference/configuration">Configuration <ArrowUpRight size={16} /></Link>
70+
<Link href="/docs/python/api">Python API <ArrowUpRight size={16} /></Link>
71+
<Link href="/docs/reference/troubleshooting">Troubleshooting <ArrowUpRight size={16} /></Link>
72+
</div>
73+
</section>
74+
<div className="alpha-note">
75+
<span className="tiny-dot" />
76+
<p>SuperSTAC is in alpha. APIs and configuration may change. <Link href="/docs/reference/status">Current limitations →</Link></p>
2677
</div>
27-
<FederationMap/>
28-
</section>
29-
<div className="principles-strip"><span>A <a href="https://spatialnode.com">Spatialnode ↗</a> project</span><span>STAC native</span><span>Rust engine</span><span>MIT licensed</span></div>
30-
<section className="start-section" aria-labelledby="choose-title"><div className="section-intro"><p className="eyebrow">MEET YOUR NEXT WORKFLOW</p><h2 id="choose-title">Start where you work.</h2><p>One engine. Three ways to make it yours.</p></div><div className="path-cards">{paths.map(({icon:Icon,...path},i) => <Link className="path-card" href={path.href} key={path.label}><div className="path-card-top"><Icon size={23}/><span>0{i+1}</span></div><span className="path-label">{path.label}</span><h3>{path.title}</h3><p>{path.text}</p><span className="path-link">Read the guide <ArrowUpRight size={15}/></span></Link>)}</div></section>
31-
<section className="code-section"><div className="code-section-copy"><p className="eyebrow">LESS PLUMBING. MORE DISCOVERY.</p><h2>Different sources.<br/>A shared vocabulary.</h2><p>Register your catalogs, choose an area and a time range, and get back STAC items. SuperSTAC handles the search across sources.</p><ul><li><Scan size={18}/><span>Query the catalogs that can serve your collections.</span></li><li><GitMerge size={18}/><span>Normalize names and remove duplicate item IDs.</span></li><li><Layers size={18}/><span>Inspect failures and counts with each response.</span></li></ul><Link href="/docs/concepts/federation" className="text-link">How federation works <ArrowRight size={15}/></Link></div><CodePreview/></section>
32-
<section className="reference-banner"><div><p className="eyebrow">WHEN YOU NEED THE DETAILS</p><h2>Make the next query your own.</h2></div><div><Link href="/docs/reference/configuration">Configuration <ArrowUpRight size={16}/></Link><Link href="/docs/python/api">Python API <ArrowUpRight size={16}/></Link><Link href="/docs/reference/troubleshooting">Troubleshooting <ArrowUpRight size={16}/></Link></div></section>
33-
<div className="alpha-note"><span className="tiny-dot"/><p>Built in the open. SuperSTAC is in alpha; APIs and configuration may change. <Link href="/docs/reference/status">See current capabilities →</Link></p></div>
34-
</div>
35-
<footer className="site-footer"><PoweredBySpatialnode/><div><a href="https://github.com/spatialnode/superstac">GitHub ↗</a><a href="https://github.com/spatialnode/superstac/blob/main/LICENSE">MIT license ↗</a></div></footer>
36-
</HomeLayout>;
78+
</div>
79+
<footer className="site-footer">
80+
<PoweredBySpatialnode />
81+
<div><a href="https://github.com/spatialnode/superstac">GitHub ↗</a><a href="https://github.com/spatialnode/superstac/blob/main/LICENSE">MIT license ↗</a></div>
82+
</footer>
83+
</HomeLayout>
84+
);
3785
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
Copyright 2018 The Crimson Pro Project Authors (https://github.com/Fonthausen/CrimsonPro)
2+
3+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
4+
This license is copied below, and is also available with a FAQ at:
5+
http://scripts.sil.org/OFL
6+
7+
8+
-----------------------------------------------------------
9+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10+
-----------------------------------------------------------
11+
12+
PREAMBLE
13+
The goals of the Open Font License (OFL) are to stimulate worldwide
14+
development of collaborative font projects, to support the font creation
15+
efforts of academic and linguistic communities, and to provide a free and
16+
open framework in which fonts may be shared and improved in partnership
17+
with others.
18+
19+
The OFL allows the licensed fonts to be used, studied, modified and
20+
redistributed freely as long as they are not sold by themselves. The
21+
fonts, including any derivative works, can be bundled, embedded,
22+
redistributed and/or sold with any software provided that any reserved
23+
names are not used by derivative works. The fonts and derivatives,
24+
however, cannot be released under any other type of license. The
25+
requirement for fonts to remain under this license does not apply
26+
to any document created using the fonts or their derivatives.
27+
28+
DEFINITIONS
29+
"Font Software" refers to the set of files released by the Copyright
30+
Holder(s) under this license and clearly marked as such. This may
31+
include source files, build scripts and documentation.
32+
33+
"Reserved Font Name" refers to any names specified as such after the
34+
copyright statement(s).
35+
36+
"Original Version" refers to the collection of Font Software components as
37+
distributed by the Copyright Holder(s).
38+
39+
"Modified Version" refers to any derivative made by adding to, deleting,
40+
or substituting -- in part or in whole -- any of the components of the
41+
Original Version, by changing formats or by porting the Font Software to a
42+
new environment.
43+
44+
"Author" refers to any designer, engineer, programmer, technical
45+
writer or other person who contributed to the Font Software.
46+
47+
PERMISSION & CONDITIONS
48+
Permission is hereby granted, free of charge, to any person obtaining
49+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
50+
redistribute, and sell modified and unmodified copies of the Font
51+
Software, subject to the following conditions:
52+
53+
1) Neither the Font Software nor any of its individual components,
54+
in Original or Modified Versions, may be sold by itself.
55+
56+
2) Original or Modified Versions of the Font Software may be bundled,
57+
redistributed and/or sold with any software, provided that each copy
58+
contains the above copyright notice and this license. These can be
59+
included either as stand-alone text files, human-readable headers or
60+
in the appropriate machine-readable metadata fields within text or
61+
binary files as long as those fields can be easily viewed by the user.
62+
63+
3) No Modified Version of the Font Software may use the Reserved Font
64+
Name(s) unless explicit written permission is granted by the corresponding
65+
Copyright Holder. This restriction only applies to the primary font name as
66+
presented to the users.
67+
68+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69+
Software shall not be used to promote, endorse or advertise any
70+
Modified Version, except to acknowledge the contribution(s) of the
71+
Copyright Holder(s) and the Author(s) or with their explicit written
72+
permission.
73+
74+
5) The Font Software, modified or unmodified, in part or in whole,
75+
must be distributed entirely under this license, and must not be
76+
distributed under any other license. The requirement for fonts to
77+
remain under this license does not apply to any document created
78+
using the Font Software.
79+
80+
TERMINATION
81+
This license becomes null and void if any of the above conditions are
82+
not met.
83+
84+
DISCLAIMER
85+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93+
OTHER DEALINGS IN THE FONT SOFTWARE.

0 commit comments

Comments
 (0)