diff --git a/assets/landing/cookbook-recipes-dark.png b/assets/landing/cookbook-recipes-dark.png new file mode 100644 index 0000000..2c9040d Binary files /dev/null and b/assets/landing/cookbook-recipes-dark.png differ diff --git a/assets/landing/cookbook-recipes-light.png b/assets/landing/cookbook-recipes-light.png new file mode 100644 index 0000000..a59b647 Binary files /dev/null and b/assets/landing/cookbook-recipes-light.png differ diff --git a/datasets/ingest.mdx b/datasets/ingest.mdx index 0e6ff2f..6ae7f29 100644 --- a/datasets/ingest.mdx +++ b/datasets/ingest.mdx @@ -228,7 +228,7 @@ Protobuf is Google's language-neutral, platform-neutral, extensible mechanism fo More details on protobuf can be found in the [protobuf section](/sdks/go/protobuf). -In the example below, `v1.Modis` type has been generated using [tilebox-generate](https://github.com/tilebox/tilebox-generate) as described in the [protobuf section](/sdks/go/protobuf). +In the example below, the `v1.Modis` type has been generated with `tilebox dataset generate`, as described in the [protobuf section](/sdks/go/protobuf). ```go Go datapoints := []*v1.Modis{ diff --git a/index.mdx b/index.mdx index cb595b2..3e0c6f7 100644 --- a/index.mdx +++ b/index.mdx @@ -81,90 +81,120 @@ export const HomeSearch = () => {
- - ```text Agent - > User - Onboard yourself to Tilebox: https://docs.tilebox.com/onboard-your-agent - - Then use Tilebox to find which data center sites changed most from space. - - Build a reproducible workflow that: - - starting from a user-provided CSV of known data centers - - finds cloud-free Sentinel-2 imagery over a target lat/lon in a time window - - reads the relevant band products, crops scenes to a 3km area around the target - - computes the cloud fraction for the cropped area, filter out scenes > 1% - - compares before/after by scoring visible change based on suitable metrics - - then create a datacenter site ranking based on score - - Use the provided Tilebox skills to research datasets, storage access and outline the - workflow, then implement it. Deploy and run on our GCP cluster, in case of failures - inspect runner logs and iterate on the workflow. - ``` + + +
+
+ +
+
You
+
+

+ Build a reproducible Tilebox workflow that starts with a user-provided CSV of known data centers and then: +

+
    +
  • Finds cloud-free Sentinel-2 imagery over a target lat/lon in a time window
  • +
  • Reads the relevant band products and crops scenes to a 3km area around the target
  • +
  • Computes the cloud fraction for the cropped area and filters out scenes > 1%
  • +
  • Compares before/after by scoring visible change based on suitable metrics
  • +
  • Creates a datacenter site ranking based on score
  • +
+

+ Use the provided Tilebox skills to research datasets, access storage, outline the workflow, and then implement it. Deploy and run on our GCP cluster, in case of failures inspect runner logs and iterate on the workflow. +

+
+
+
+ + Ask your agent to build with Tilebox… + + +
+
+ + +
+ +
+```bash CLI wrap +curl -fsSL https://cli.tilebox.com/install.sh | sh + +tilebox dataset query + open_data.copernicus.sentinel2_msi + --last 7d + --spatial-extent 'POLYGON((-109 41,-109 37,-102 37,-102 41,-109 41))' + --limit 10 - ```bash CLI - curl -fsSL https://cli.tilebox.com/install.sh | sh +tilebox job submit + --name "Datacenter Monitoring" + --task "ComputeVisibleChange" + --input "{\"before\": \"2024-06-01\", \"after\": \"2026-06-01\"}" + --cluster gcp-Drv6L7Li4t7Yvk +``` +
+
+
- tilebox dataset query - open_data.copernicus.sentinel2_msi - --last 7d - --spatial-extent 'POLYGON((-109.05 41,-109.05 37,-102.05 37,-102.05 41,-109.05 41))' - --limit 10 - - tilebox job submit - --name "Datacenter Monitoring" - --task "ComputeVisibleChange" - --input "{\"before\": \"2024-06-01\", \"after\": \"2026-06-01\"}" - --cluster gcp-Drv6L7Li4t7Yvk - ``` + +```python runner.py lines +from tilebox.datasets import Client +from tilebox.workflows import ExecutionContext, Runner, Task - ```python Python lines - from tilebox.datasets import Client - from tilebox.workflows import Task, ExecutionContext - - class ComputeVisibleChange(Task): - before: str - after: str +class ComputeVisibleChange(Task): + before: str + after: str - def execute(self, context: ExecutionContext): - sentinel2 = Client().dataset( - "open_data.copernicus.sentinel2_msi" - ) - scenes = sentinel2.collection("S2A_S2MSI1A").query( - temporal_extent=(before, after), - ) - context.logger.info("Found scenes", n=len(scenes.granule_name)) - context.submit_subtasks([ - ProcessScene(str(name) for name in scenes.granule_name) - ]) - ``` + def execute(self, context: ExecutionContext): + sentinel2 = Client().dataset( + "open_data.copernicus.sentinel2_msi" + ) + scenes = sentinel2.collection("S2A_S2MSI1A").query( + temporal_extent=(before, after), + ) + context.logger.info("Found scenes", n=len(scenes.granule_name)) + context.submit_subtasks([ + ProcessScene(str(name) for name in scenes.granule_name) + ]) - ```go Go lines - type ComputeVisibleChange struct { - Before time.Time - After time.Time - } +runner = Runner(tasks=[ComputeVisibleChange]) +``` + - func (t *ComputeVisibleChange) Execute(ctx context.Context) error { - client := datasets.NewClient() - dataset, _ := client.Datasets.Get(ctx, "open_data.copernicus.sentinel2_msi") - collection, _ := client.Collections.Get(ctx, dataset.ID, "S2A_S2MSI1C") + +```go main.go lines +type ComputeVisibleChange struct { + Before time.Time + After time.Time +} - var scenes []*examplesv1.Sentinel2Msi - _ = client.Datapoints.QueryInto(ctx, dataset.ID, &scenes, - datasets.WithCollections(collection), - datasets.WithTemporalExtent(query.NewTimeInterval(t.Before, t.After)), - ) +func (t *ComputeVisibleChange) Execute(ctx context.Context) error { + client := datasets.NewClient() + dataset, _ := client.Datasets.Get(ctx, "open_data.copernicus.sentinel2_msi") + collection, _ := client.Collections.Get(ctx, dataset.ID, "S2A_S2MSI1C") - slog.InfoContext(ctx, "Found scenes", slog.Int("n", len(scenes))) - for _, scene := range scenes { - _, _ = workflows.SubmitSubtask(ctx, &ProcessScene{ - Name: scene.GetGranuleName(), - }) - } - return nil - } - ``` -
+ var scenes []*examplesv1.Sentinel2Msi + _ = client.Datapoints.QueryInto(ctx, dataset.ID, &scenes, + datasets.WithCollections(collection), + datasets.WithTemporalExtent(query.NewTimeInterval(t.Before, t.After)), + ) + + slog.InfoContext(ctx, "Found scenes", slog.Int("n", len(scenes))) + for _, scene := range scenes { + _, _ = workflows.SubmitSubtask(ctx, &ProcessScene{ + Name: scene.GetGranuleName(), + }) + } + return nil +} +``` + +
@@ -178,7 +208,7 @@ export const HomeSearch = () => { Choose how you build

- Use Tilebox directly as a developer, or give an agent the same tools and documentation context so it can work with Tilebox for you. + Use Tilebox directly as a developer, or give an agent the same tools and documentation context so it can operate Tilebox for you.

@@ -256,7 +286,7 @@ export const HomeSearch = () => {

- + Tilebox dataset explorer Tilebox dataset explorer @@ -269,6 +299,10 @@ export const HomeSearch = () => { Tilebox runner architecture Tilebox runner architecture + + Recipe cards for common Tilebox guides + Recipe cards for common Tilebox guides +
@@ -291,7 +325,7 @@ export const HomeSearch = () => { Scale

- From first query to running on your infrastructure + From query to operational pipelines

Start with open data or your own catalogs, turn processing steps into tasks, and run them where your data and infrastructure already live. @@ -300,7 +334,7 @@ export const HomeSearch = () => {

- Query open datasets or your own Tilebox datasets by time, area of interest, collection, or datapoint ID. + Query open datasets or your own custom Tilebox datasets by time, area of interest, collection, or datapoint ID. Turn processing steps into workflow tasks that can submit subtasks, report progress, use caches, and emit logs and traces. @@ -309,7 +343,7 @@ export const HomeSearch = () => { Develop with local runners, iterate quickly, and prototype your geospatial workflows. - Run workflows across cloud, on-premises, sovereign, air-gapped, or edge environments while Tilebox tracks jobs and distributes work for parallel execution. + Run workflows across cloud, on premise, sovereign, air-gapped, or edge environments while Tilebox tracks jobs and distributes work for parallel execution. Query job state, logs, spans, and progress from the Console, SDKs, CLI, or agent tools. diff --git a/sdks/go/install.mdx b/sdks/go/install.mdx index 2a48fc1..8df1576 100644 --- a/sdks/go/install.mdx +++ b/sdks/go/install.mdx @@ -6,14 +6,14 @@ icon: download ## Package Overview -Tilebox offers a Go SDK for accessing Tilebox services. It additionally includes a command-line tool (tilebox-generate) that can be installed separately. +Tilebox offers a Go SDK for accessing Tilebox services. The Tilebox command-line tool includes `tilebox dataset generate`, which generates Go protobuf types for Tilebox datasets. Datasets and workflows client for Tilebox - - Command-line tool to generate Tilebox datasets types for Go + + Command-line tools to query datasets, run workflows, and generate Go dataset types @@ -25,8 +25,8 @@ Add `tilebox-go` to your project. go get github.com/tilebox/tilebox-go ``` -Install `tilebox-generate` command-line tool on your machine. +Install the Tilebox command-line tool on your machine. ```bash Shell -go install github.com/tilebox/tilebox-generate@latest +curl -fsSL https://cli.tilebox.com/install.sh | sh ``` diff --git a/sdks/go/protobuf.mdx b/sdks/go/protobuf.mdx index 443620d..ecc1a3f 100644 --- a/sdks/go/protobuf.mdx +++ b/sdks/go/protobuf.mdx @@ -9,18 +9,18 @@ Tilebox uses [Protocol Buffers](https://protobuf.dev/), with a custom generation [Protocol Buffers](https://protobuf.dev/) (often referred to as `protobuf`) is a schema definition language with an efficient binary format and native language support for lots of languages, including Go. Protocol buffers are open source since 2008 and are maintained by Google. -## tilebox-generate +## Generate Go types Protobuf schemas are typically defined in a `.proto` file, and then converted to a native Go struct using the protobuf compiler. -Tilebox datasets already define a protobuf schema as well, and automate the generation of Go structs for existing datasets through a quick `tilebox-generate` command-line tool. +Tilebox datasets already define a protobuf schema as well. Use `tilebox dataset generate` to generate Go structs for existing datasets. -See [Installation](/sdks/go/install) for more details on how to install `tilebox-generate`. +See [Installation](/sdks/go/install) for more details on how to install the Tilebox command-line tool. ```sh -tilebox-generate --dataset open_data.copernicus.sentinel1_sar +tilebox dataset generate --slug open_data.copernicus.sentinel1_sar ``` -The preceding command will generate a `./protogen/tilebox/v1/sentinel1_sar.pb.go` file. More flags can be set to change the default output folders, package name, etc. +The preceding command will generate a `./protogen/tilebox/v1/sentinel1_sar.pb.go` file. Use `--out`, `--package`, and `--name` to change the default output directory, protobuf package, or message name. This file contains everything needed to work with the [Sentinel-1 SAR](https://console.tilebox.com/datasets/explorer/e27e6a58-c149-4379-9fdf-9d43903cba74) dataset. It's recommended to check the generated files you use in your version control system. diff --git a/style.css b/style.css index 9fcfb96..d37aea4 100644 --- a/style.css +++ b/style.css @@ -21,6 +21,236 @@ width: 100%; } +.tilebox-agent-chat { + font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + padding-left: 0.25rem; + padding-top: 0.25rem; +} + +.tilebox-agent-chat-message { + align-items: flex-start; + display: flex; + gap: 0.875rem; +} + +.tilebox-agent-chat-avatar { + align-items: center; + background: rgb(244 63 94); + border-radius: 999px !important; + box-shadow: 10px 12px 18px rgb(244 63 94 / 0.18); + color: rgb(255 255 255); + display: inline-flex; + flex: 0 0 auto; + font-size: 0.78rem; + font-weight: 700; + height: 2rem; + justify-content: center; + width: 2rem; +} + +.dark .tilebox-agent-chat-avatar { + background: rgb(251 113 133); + box-shadow: 10px 12px 18px rgb(251 113 133 / 0.20); + color: rgb(255 255 255); +} + +.tilebox-agent-chat-content { + flex: 1 1 auto; + min-width: 0; +} + +.tilebox-agent-chat-meta { + color: rgb(75 85 99); + font-size: 0.78rem; + font-weight: 600; + margin-bottom: 0.45rem; +} + +.dark .tilebox-agent-chat-meta { + color: rgb(156 163 175); +} + +.tilebox-agent-chat-bubble { + background: rgb(255 255 255); + border: 1px solid rgb(229 231 235); + box-shadow: 0 12px 28px rgb(15 23 42 / 0.07); + color: rgb(17 24 39); + display: block !important; + font-size: 0.82rem; + line-height: 1.62; + margin: 0; + max-height: 440px; + overflow: auto; + overflow-wrap: normal; + padding: 1rem; + text-align: left !important; + word-break: normal; +} + +.tilebox-agent-chat-bubble p, +.tilebox-agent-chat-bubble ul, +.tilebox-agent-chat-bubble li { + margin: 0; + padding: 0; +} + +.tilebox-agent-chat-bubble ul { + list-style-position: outside; + padding-left: 1.05em; +} + +.tilebox-agent-chat-bubble li { + display: list-item; +} + +.tilebox-agent-chat-bubble li::marker { + color: rgb(17 24 39); + content: "-"; + font-size: 1.2em; +} + +.tilebox-agent-chat-bubble li::before { + content: none !important; + display: none !important; +} + +.dark .tilebox-agent-chat-bubble { + background: rgb(17 24 39); + border-color: rgb(55 65 81); + box-shadow: 0 12px 28px rgb(0 0 0 / 0.30); + color: rgb(229 231 235); +} + +.dark .tilebox-agent-chat-bubble li::marker { + color: rgb(229 231 235); +} + +.tilebox-agent-chat-composer { + align-items: center; + background: rgb(255 255 255); + border: 1px solid rgb(229 231 235); + color: rgb(107 114 128); + display: flex; + font-size: 0.88rem; + justify-content: space-between; + margin-left: 2.875rem; + margin-top: 1rem; + padding: 0.85rem 0.95rem; + text-decoration: none; +} + +.tilebox-agent-chat-composer:hover { + border-color: rgb(209 213 219); + color: rgb(31 41 55); +} + +.dark .tilebox-agent-chat-composer { + background: rgb(3 7 18); + border-color: rgb(31 41 55); + color: rgb(156 163 175); +} + +.dark .tilebox-agent-chat-composer:hover { + border-color: rgb(75 85 99); + color: rgb(229 231 235); +} + +.tilebox-agent-chat-send { + align-items: center; + background: rgb(243 244 246); + border: 1px solid rgb(229 231 235); + color: rgb(75 85 99); + display: inline-flex; + flex: 0 0 auto; + height: 1.75rem; + justify-content: center; + width: 1.75rem; +} + +.dark .tilebox-agent-chat-send { + background: rgb(17 24 39); + border-color: rgb(55 65 81); + color: rgb(209 213 219); +} + +.tilebox-cli-window { + background: rgb(244 244 245); + border: 1px solid rgb(187 187 187 / 0.5); + box-shadow: 0 24px 36px rgb(0 0 0 / 0.18); + overflow: hidden; +} + +.dark .tilebox-cli-window { + background: rgb(31 31 31); +} + +.tilebox-cli-controls { + background: rgb(244 244 245); + display: flex; + gap: 0.52rem; + margin: 0; + padding: 1rem 1.2rem 1rem; +} + +.dark .tilebox-cli-controls { + background: rgb(31 31 31); +} + +.tilebox-cli-control { + border-radius: 999px !important; + display: block; + height: 0.9rem; + width: 0.9rem; +} + +.tilebox-cli-control-red { + background: rgb(255 91 87); +} + +.tilebox-cli-control-yellow { + background: rgb(255 189 46); +} + +.tilebox-cli-control-green { + background: rgb(40 201 64); +} + +.tilebox-cli-code { + color: rgb(229 229 184); + font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.92rem; + line-height: 1.55; + margin: 0; + overflow: visible; + tab-size: 2; + white-space: pre; +} + +.tilebox-cli-code .code-block { + border: 0 !important; + box-shadow: none !important; + margin: 0 !important; + padding: 0 !important; +} + +.tilebox-cli-code [data-component-part="code-block-header"] { + display: none !important; +} + +.tilebox-cli-code .code-block-background { + margin: 0 !important; + padding: 1.35rem 1.55rem 1.65rem !important; +} + +.tilebox-cli-code pre, +.tilebox-cli-code code { + margin: 0 !important; +} + +.tilebox-cli-code code { + font: inherit; +} + @media (max-width: 1023px) { .tilebox-landing-hero { min-height: auto;