From 1d6f5e6048b04151a5aaa8ed7aa69e51947f5e49 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:48:46 +0200 Subject: [PATCH 1/9] Update workflows --- .github/workflows/build.yaml | 33 +++++++++++++++++- .github/workflows/publish.yaml | 61 +++++++++++++++++++++++++++++++--- .github/workflows/test.yaml | 25 +++++++++++++- 3 files changed, 112 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 43bad50..b190d05 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,7 @@ permissions: contents: write jobs: - build: + build-python: runs-on: ubuntu-latest steps: @@ -46,3 +46,34 @@ jobs: working-directory: ./python run: | uv run convert_jsondoc --help + + build-typescript: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install dependencies + working-directory: ./typescript + run: npm ci + + - name: Generate types + working-directory: ./typescript + run: npm run generate-types + + - name: Build + working-directory: ./typescript + run: npm run build + + - name: Run tests + working-directory: ./typescript + run: npm test + + - name: Check linting + working-directory: ./typescript + run: npm run lint:check diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 529fb91..15ca357 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -6,18 +6,20 @@ # separate terms of service, privacy policy, and support # documentation. -name: Upload Python Package +name: Publish Packages on: push: tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10, v0.1.0.dev1 + - 'python-v*' # Python releases: python-v1.0.0, python-v1.0.1, etc. + - 'typescript-v*' # TypeScript releases: typescript-v1.0.0, typescript-v1.0.1, etc. permissions: contents: read jobs: - deploy: + publish-python: + if: startsWith(github.ref, 'refs/tags/python-v') runs-on: ubuntu-latest steps: @@ -41,8 +43,8 @@ jobs: - name: Extract version from tag and update pyproject.toml working-directory: ./python run: | - # Get the version from the tag (remove 'v' prefix) - TAG_VERSION=${GITHUB_REF#refs/tags/v} + # Get the version from the tag (remove 'python-v' prefix) + TAG_VERSION=${GITHUB_REF#refs/tags/python-v} echo "Tag version: $TAG_VERSION" # Update pyproject.toml with the version from the tag @@ -70,3 +72,52 @@ jobs: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} verbose: true + + publish-typescript: + if: startsWith(github.ref, 'refs/tags/typescript-v') + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + working-directory: ./typescript + run: npm ci + + - name: Extract version from tag and update package.json + working-directory: ./typescript + run: | + # Get the version from the tag (remove 'typescript-v' prefix) + TAG_VERSION=${GITHUB_REF#refs/tags/typescript-v} + echo "Tag version: $TAG_VERSION" + + # Update package.json with the version from the tag + npm version $TAG_VERSION --no-git-tag-version + echo "Version updated in package.json to: $TAG_VERSION" + + # Verify the change + cat package.json | grep '"version"' + + - name: Generate types and build package + working-directory: ./typescript + run: | + npm run generate-types + npm run build + + - name: Run tests + working-directory: ./typescript + run: npm test + + - name: Publish package to NPM + working-directory: ./typescript + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b001273..3be3026 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -9,7 +9,7 @@ on: - main jobs: - test: + test-python: name: python runs-on: ubuntu-latest @@ -34,4 +34,27 @@ jobs: run: | PYTHONPATH=.. uv run pytest + test-typescript: + name: typescript + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install dependencies + working-directory: ./typescript + run: npm ci + + - name: Generate types + working-directory: ./typescript + run: npm run generate-types + + - name: Run tests + working-directory: ./typescript + run: npm test From 6abab8128a8d58e018bd61cc939c99631f301781 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:52:52 +0200 Subject: [PATCH 2/9] Test prettier commit hook --- typescript/.husky/pre-commit | 4 + typescript/asdf.json | 4542 ++++++++++++++++++++++++++++++++++ typescript/package-lock.json | 932 ++++++- typescript/package.json | 15 +- typescript/test-format.ts | 4 + 5 files changed, 5400 insertions(+), 97 deletions(-) create mode 100755 typescript/.husky/pre-commit create mode 100644 typescript/asdf.json create mode 100644 typescript/test-format.ts diff --git a/typescript/.husky/pre-commit b/typescript/.husky/pre-commit new file mode 100755 index 0000000..2ce7d70 --- /dev/null +++ b/typescript/.husky/pre-commit @@ -0,0 +1,4 @@ +#\!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +cd typescript && npx lint-staged diff --git a/typescript/asdf.json b/typescript/asdf.json new file mode 100644 index 0000000..74445df --- /dev/null +++ b/typescript/asdf.json @@ -0,0 +1,4542 @@ +{ + "object": "page", + "id": "pg_01jvvs4gt9e62r57ysws5c91hv", + "created_time": "2025-05-22T10:37:59.870297Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "properties": { + "title": { + "type": "title", + "title": [ + { + "type": "text", + "text": { + "content": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." + }, + "annotations": {}, + "plain_text": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." + } + ] + } + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gtafcya6wkx23jqcyfb", + "type": "image", + "created_time": "2025-05-22T10:37:59.871637Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_0gpjmc7e5a9k0ahmy3cqtnkd5n" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/0/Picture/0 description: The image shows the logo for Ultihash. The logo consists of a teal circle with a white symbol inside, followed by the word \"ULTIHASH\" in white." + }, + "annotations": {}, + "plain_text": "Image /page/0/Picture/0 description: The image shows the logo for Ultihash. The logo consists of a teal circle with a white symbol inside, followed by the word \"ULTIHASH\" in white." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtcf4nsxbtv48rtwk27", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.871795Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Tom L\u00fcdersdorf, Founder/CEO" + }, + "annotations": {}, + "plain_text": "Tom L\u00fcdersdorf, Founder/CEO" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtdep5vjx4cb9vfkd95", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.871830Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Strictly private and confidential" + }, + "annotations": {}, + "plain_text": "Strictly private and confidential" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtefz5ve0pvxnzarce3", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.871864Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "The Future of Al Infrastructure is Hybrid" + }, + "annotations": {}, + "plain_text": "The Future of Al Infrastructure is Hybrid" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtfekw9cknxw1peywe7", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.871898Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." + }, + "annotations": {}, + "plain_text": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtgez6r45aq5m7n8x2v", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.871944Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "\u00ae GenAl pushes enterprises to scale fast, but data is trapped across incompatible systems \u00ae EU enterprises are diversifying away from US hyperscalers, creating fragmented hybrid infrastructure Al workloads are inherently fragmented: inference here, training there, documents elsewhere" + }, + "annotations": {}, + "plain_text": "\u00ae GenAl pushes enterprises to scale fast, but data is trapped across incompatible systems \u00ae EU enterprises are diversifying away from US hyperscalers, creating fragmented hybrid infrastructure Al workloads are inherently fragmented: inference here, training there, documents elsewhere" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtheb9tykbwwj7edxky", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.871974Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "We believe storage must evolve now." + }, + "annotations": {}, + "plain_text": "We believe storage must evolve now." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtjf5dawkbxx4vvy7yv", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.872005Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "From siloed data to EVERYWHERE available" + }, + "annotations": {}, + "plain_text": "From siloed data to EVERYWHERE available" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtkfnjs2er1k6s6p1er", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.872035Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "From vendor lock-in to infrastructure agnostic" + }, + "annotations": {}, + "plain_text": "From vendor lock-in to infrastructure agnostic" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtmfjjsdms3d5ezs6km", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.872063Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 1 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "From capacity-centric to access-centric" + }, + "annotations": {}, + "plain_text": "From capacity-centric to access-centric" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtpeav8kdtqhw3207z8", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.873486Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 2 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "ULTIHASH TODAY" + }, + "annotations": {}, + "plain_text": "ULTIHASH TODAY" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtqfw885c2vkfydxsm7", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.873546Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 2 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "COMING NEXT" + }, + "annotations": {}, + "plain_text": "COMING NEXT" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtre6ss46dgbawzzs6w", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.873584Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 2 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "A unified object storage layer for hybrid Al infrastructure" + }, + "annotations": {}, + "plain_text": "A unified object storage layer for hybrid Al infrastructure" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtsf1es6nd5bfty1sfj", + "type": "image", + "created_time": "2025-05-22T10:37:59.873627Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 2 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_4rfpkpcs7891tv0m76a7g3vs3m" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/1/Figure/3 description: The image shows a diagram of the Ultihash Ocean Tier architecture. It is divided into three tiers: Tier 1 Cloud Hyperscaler, GPU Cloud, and Tier 2 Cloud e.g. EU provider. Tier 1 includes Google Cloud, AWS, and Azure. The GPU Cloud includes Lambda, Nebius, Salad, and RunPod. Tier 2 includes OVHcloud, Hetzner, and GCore. The diagram also shows the Ultihash Ocean Tier, which includes 10 TiB Freemium, Ultihash self-hosted, and Ultihash serverless. The diagram also lists the benefits of the Ultihash Ocean Tier, which include zero-effort data access across clouds, no manual migration, smart orchestration of data placement, 10x lower latency, and 50% lower egress fees. The diagram also mentions primary storage for AI data, Kubernetes-native object storage, high throughput read performance, lossless deduplication cuts TCO by up to 60%, and S3-compatible, deployable on-prem or cloud." + }, + "annotations": {}, + "plain_text": "Image /page/1/Figure/3 description: The image shows a diagram of the Ultihash Ocean Tier architecture. It is divided into three tiers: Tier 1 Cloud Hyperscaler, GPU Cloud, and Tier 2 Cloud e.g. EU provider. Tier 1 includes Google Cloud, AWS, and Azure. The GPU Cloud includes Lambda, Nebius, Salad, and RunPod. Tier 2 includes OVHcloud, Hetzner, and GCore. The diagram also shows the Ultihash Ocean Tier, which includes 10 TiB Freemium, Ultihash self-hosted, and Ultihash serverless. The diagram also lists the benefits of the Ultihash Ocean Tier, which include zero-effort data access across clouds, no manual migration, smart orchestration of data placement, 10x lower latency, and 50% lower egress fees. The diagram also mentions primary storage for AI data, Kubernetes-native object storage, high throughput read performance, lossless deduplication cuts TCO by up to 60%, and S3-compatible, deployable on-prem or cloud." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtwf9g8vs9gxhxnab85", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.874474Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Companies with hybrid infrastructure manually migrate data between clouds for Al workloads" + }, + "annotations": {}, + "plain_text": "Companies with hybrid infrastructure manually migrate data between clouds for Al workloads" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtxfyya6yhvre9g5343", + "type": "image", + "created_time": "2025-05-22T10:37:59.874515Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_0knygkydq489hbnwtmqhp6m2z9" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/2/Figure/3 description: The image shows a typical hybrid Enterprise infrastructure. At the top, there are three boxes labeled \"BI tools e.g. Databricks\", \"GenAl app\", and \"Microsoft SharePoint\". Each of these boxes has a dashed arrow pointing down to a box labeled \"Storage AWS Cloud\", \"Storage Google Cloud\", and \"Storage Azure Cloud\", respectively. Below these storage boxes, there is a dashed box labeled \"Custom ETL & data orchestration\". Below this box, there is a box labeled \"on-prem legacy infrastructure\" and a box with a wavy line at the top and the text \"Data Lake (Swamp)\" inside. Below these boxes, there are three boxes labeled \"Sales / CRM Data Warehouse\", \"Manufacturing Data Warehouse\", and \"Finance Data Manager\". There is also a box labeled \"SEPARATE DATA STORES\"." + }, + "annotations": {}, + "plain_text": "Image /page/2/Figure/3 description: The image shows a typical hybrid Enterprise infrastructure. At the top, there are three boxes labeled \"BI tools e.g. Databricks\", \"GenAl app\", and \"Microsoft SharePoint\". Each of these boxes has a dashed arrow pointing down to a box labeled \"Storage AWS Cloud\", \"Storage Google Cloud\", and \"Storage Azure Cloud\", respectively. Below these storage boxes, there is a dashed box labeled \"Custom ETL & data orchestration\". Below this box, there is a box labeled \"on-prem legacy infrastructure\" and a box with a wavy line at the top and the text \"Data Lake (Swamp)\" inside. Below these boxes, there are three boxes labeled \"Sales / CRM Data Warehouse\", \"Manufacturing Data Warehouse\", and \"Finance Data Manager\". There is also a box labeled \"SEPARATE DATA STORES\"." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gtzf5csgd52r5fjsbkq", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.874712Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "The customer pain:" + }, + "annotations": {}, + "plain_text": "The customer pain:" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv3ejzt8asa4neywvw2", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.874868Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gv0f4mr5yt5aj8eg50e", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.874776Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Redundant copies = inflated storage cost" + }, + "annotations": {}, + "plain_text": "Redundant copies = inflated storage cost" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv1eshb4v9pzd4ae5s3", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.874812Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Human-in-the-loop = slow, error-prone data pipelines" + }, + "annotations": {}, + "plain_text": "Human-in-the-loop = slow, error-prone data pipelines" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv2f1crx9mchjrektwf", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.874841Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Multiple data versions = consistency chaos" + }, + "annotations": {}, + "plain_text": "Multiple data versions = consistency chaos" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gv4etm94vbdry7n8j18", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.874909Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Our wedge:" + }, + "annotations": {}, + "plain_text": "Our wedge:" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv8f48av46ncdy9a110", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.875056Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gv5fn89x271ectr8rgw", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.874962Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Automatically makes data available across clouds" + }, + "annotations": {}, + "plain_text": "Automatically makes data available across clouds" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv6ft39rgr5zvyax13y", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.875001Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "No manual migration, no permanent duplication \u2192 all data under single user namespace" + }, + "annotations": {}, + "plain_text": "No manual migration, no permanent duplication \u2192 all data under single user namespace" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gv7erkrr6fsjds2eh6t", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.875030Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Reduces cost, accelerates Al teams" + }, + "annotations": {}, + "plain_text": "Reduces cost, accelerates Al teams" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gv9e8vsynkxz3ch41mm", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.875094Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 3 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "No one else - not AWS, not MinlO or Vast is solving this elegantly." + }, + "annotations": {}, + "plain_text": "No one else - not AWS, not MinlO or Vast is solving this elegantly." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvbfsvsqmejt7dxsack", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.876368Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "A ULTIHASH" + }, + "annotations": {}, + "plain_text": "A ULTIHASH" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvcfx6b3pdq5vpqf8bv", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.876410Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Distribution Edge - Developer-Led and Partner-Powered" + }, + "annotations": {}, + "plain_text": "Distribution Edge - Developer-Led and Partner-Powered" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvdf2m9q7jspdymb47s", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876447Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Self-Serve Developer Onboarding" + }, + "annotations": {}, + "plain_text": "Self-Serve Developer Onboarding" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvee9zv35v2zrw8ecbx", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876481Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "- Al/ML engineers & devs at startups and R&D teams" + }, + "annotations": {}, + "plain_text": "- Al/ML engineers & devs at startups and R&D teams" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvfe96sbzq3c1rsr85a", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876514Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "\u2013 Small infra teams in mid-sized orgs (Germany/EU)" + }, + "annotations": {}, + "plain_text": "\u2013 Small infra teams in mid-sized orgs (Germany/EU)" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvgec7v5bvb1dnn5yfk", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876546Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "\u2014 Head of Al Platform / Head of Infra / Storage Architects" + }, + "annotations": {}, + "plain_text": "\u2014 Head of Al Platform / Head of Infra / Storage Architects" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvhf72bs58q5cmjg4kd", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876579Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Outbound Enterprise Sales" + }, + "annotations": {}, + "plain_text": "Outbound Enterprise Sales" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvjec8rvwkm014ngks3", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876608Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Value of Product Offering" + }, + "annotations": {}, + "plain_text": "Value of Product Offering" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvkfmqaze3mnkxn9sck", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876637Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Strategic" + }, + "annotations": {}, + "plain_text": "Strategic" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvme7cbpaffheq4zqkh", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876667Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Partners" + }, + "annotations": {}, + "plain_text": "Partners" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvnf4catmf8nwc9nhbe", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876698Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "ICP" + }, + "annotations": {}, + "plain_text": "ICP" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvtedh9ahga56f9sf91", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876892Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gvqfvran4ck1c6azvy3", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.876796Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "10 TiB Freemium - 10 TB freemium dev license UltiHash self-hosted - Instant Kubernetes-native setup - No commitment, fast evaluation \u2192 UltiHash self-hosted version " + }, + "annotations": {}, + "plain_text": "10 TiB Freemium - 10 TB freemium dev license UltiHash self-hosted - Instant Kubernetes-native setup - No commitment, fast evaluation \u2192 UltiHash self-hosted version " + } + ] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gvpesfry83cdaxgwj1m", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.876763Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "UltiHash serverless OCEAN TIER (hybrid)" + }, + "annotations": {}, + "plain_text": "UltiHash serverless OCEAN TIER (hybrid)" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gvrfj1v01xp9qrd6b86", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.876832Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Dedicated support, onboarding & SLAs" + }, + "annotations": {}, + "plain_text": "Dedicated support, onboarding & SLAs" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvsfg0bdzsdqt6d6sdk", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.876864Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Large-scale deployments with performance & cost savings \u2192 UltiHash serverless or self-hosted + Ocean Tier" + }, + "annotations": {}, + "plain_text": "Large-scale deployments with performance & cost savings \u2192 UltiHash serverless or self-hosted + Ocean Tier" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gvvf16tssd5dk8czgqk", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876928Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "- Large orgs with >100 TB and hybrid infrastructure" + }, + "annotations": {}, + "plain_text": "- Large orgs with >100 TB and hybrid infrastructure" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvwen9876g7tvh88gtq", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876956Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvxfz6bg91c8dd37v5w", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.876982Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Software integrations that devs already use:" + }, + "annotations": {}, + "plain_text": "Software integrations that devs already use:" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw0eks9asefcme7gjfg", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.877081Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gvyfvr9bffj93r9731h", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.877025Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "\u2192 SuperAnnotate, Zilliz, Encord, Icechunk..." + }, + "annotations": {}, + "plain_text": "\u2192 SuperAnnotate, Zilliz, Encord, Icechunk..." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gvzeert96yk2cavzc5r", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.877055Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "> Accelerate validation and data pipeline integration" + }, + "annotations": {}, + "plain_text": "> Accelerate validation and data pipeline integration" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gw1fmrrhfraexg6ba9g", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.877115Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "System integrators help navigate enterprise complexity: \u2192 Devoteam, Connection, Combitech..." + }, + "annotations": {}, + "plain_text": "System integrators help navigate enterprise complexity: \u2192 Devoteam, Connection, Combitech..." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw2fhm8m9z37f9hd3gc", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.877145Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Hardware & Cloud infra providers:" + }, + "annotations": {}, + "plain_text": "Hardware & Cloud infra providers:" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw3egprz5fqzcswz0d1", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.877176Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 4 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "> Cisco, RNT Rausch, AWS, Google Cloud, HiveNet, Salad, vshosting, RoyalHosting ..." + }, + "annotations": {}, + "plain_text": "> Cisco, RNT Rausch, AWS, Google Cloud, HiveNet, Salad, vshosting, RoyalHosting ..." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw5fa3s27x44nxt6908", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.879263Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "A ULTIHASH" + }, + "annotations": {}, + "plain_text": "A ULTIHASH" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw6fk39rvww7j0zhspb", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.879329Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Competitive Landscape - Why UltiHash Wins" + }, + "annotations": {}, + "plain_text": "Competitive Landscape - Why UltiHash Wins" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwcf7mtjnw78dmqbnjt", + "type": "table", + "created_time": "2025-05-22T10:37:59.880560Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table": { + "has_column_header": true, + "has_row_header": false + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gw7edaav1pgjxpy6pzg", + "type": "table_row", + "created_time": "2025-05-22T10:37:59.879512Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table_row": { + "cells": [ + [ + { + "type": "text", + "text": { + "content": "Category" + }, + "annotations": {}, + "plain_text": "Category" + } + ], + [ + { + "type": "text", + "text": { + "content": "Players" + }, + "annotations": {}, + "plain_text": "Players" + } + ], + [ + { + "type": "text", + "text": { + "content": "Strengths" + }, + "annotations": {}, + "plain_text": "Strengths" + } + ], + [ + { + "type": "text", + "text": { + "content": "Weaknesses" + }, + "annotations": {}, + "plain_text": "Weaknesses" + } + ], + [ + { + "type": "text", + "text": { + "content": "Why ULTIHASH Wins" + }, + "annotations": {}, + "plain_text": "Why ULTIHASH Wins" + } + ] + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw8fk8r05hekaz1v007", + "type": "table_row", + "created_time": "2025-05-22T10:37:59.879717Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table_row": { + "cells": [ + [ + { + "type": "text", + "text": { + "content": "Hyperscalers" + }, + "annotations": {}, + "plain_text": "Hyperscalers" + } + ], + [ + { + "type": "text", + "text": { + "content": "AWS S3, Azure Blob, GCP Storage" + }, + "annotations": {}, + "plain_text": "AWS S3, Azure Blob, GCP Storage" + }, + { + "type": "text", + "text": { + "content": "AWS S3, Azure Blob, GCP Storage" + }, + "annotations": {}, + "plain_text": "AWS S3, Azure Blob, GCP Storage" + } + ], + [ + { + "type": "text", + "text": { + "content": "Ubiquitous + deeply integrated" + }, + "annotations": {}, + "plain_text": "Ubiquitous + deeply integrated" + }, + { + "type": "text", + "text": { + "content": "Ubiquitous + deeply integrated" + }, + "annotations": {}, + "plain_text": "Ubiquitous + deeply integrated" + } + ], + [ + { + "type": "text", + "text": { + "content": "Vendor lock-in + poor hybrid support" + }, + "annotations": {}, + "plain_text": "Vendor lock-in + poor hybrid support" + }, + { + "type": "text", + "text": { + "content": "Vendor lock-in + poor hybrid support" + }, + "annotations": {}, + "plain_text": "Vendor lock-in + poor hybrid support" + } + ], + [ + { + "type": "text", + "text": { + "content": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" + }, + "annotations": {}, + "plain_text": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" + }, + { + "type": "text", + "text": { + "content": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" + }, + "annotations": {}, + "plain_text": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" + } + ] + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gw9e8paby8qaebk7z7h", + "type": "table_row", + "created_time": "2025-05-22T10:37:59.879918Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table_row": { + "cells": [ + [ + { + "type": "text", + "text": { + "content": "Local/Managed S3 Storage Providers" + }, + "annotations": {}, + "plain_text": "Local/Managed S3 Storage Providers" + }, + { + "type": "text", + "text": { + "content": "Local/Managed S3 Storage Providers" + }, + "annotations": {}, + "plain_text": "Local/Managed S3 Storage Providers" + } + ], + [ + { + "type": "text", + "text": { + "content": "Hetzner, Backblaze, Wasabi, Tigris" + }, + "annotations": {}, + "plain_text": "Hetzner, Backblaze, Wasabi, Tigris" + }, + { + "type": "text", + "text": { + "content": "Hetzner, Backblaze, Wasabi, Tigris" + }, + "annotations": {}, + "plain_text": "Hetzner, Backblaze, Wasabi, Tigris" + } + ], + [ + { + "type": "text", + "text": { + "content": "Cheap + S3-compatible" + }, + "annotations": {}, + "plain_text": "Cheap + S3-compatible" + }, + { + "type": "text", + "text": { + "content": "Cheap + S3-compatible" + }, + "annotations": {}, + "plain_text": "Cheap + S3-compatible" + } + ], + [ + { + "type": "text", + "text": { + "content": "Weak ecosystem + not AI-performant" + }, + "annotations": {}, + "plain_text": "Weak ecosystem + not AI-performant" + }, + { + "type": "text", + "text": { + "content": "Weak ecosystem + not AI-performant" + }, + "annotations": {}, + "plain_text": "Weak ecosystem + not AI-performant" + } + ], + [ + { + "type": "text", + "text": { + "content": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" + }, + "annotations": {}, + "plain_text": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" + }, + { + "type": "text", + "text": { + "content": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" + }, + "annotations": {}, + "plain_text": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" + } + ] + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwaemqv1manrqk4hrbs", + "type": "table_row", + "created_time": "2025-05-22T10:37:59.880214Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table_row": { + "cells": [ + [ + { + "type": "text", + "text": { + "content": "Self-hosted storage for Al" + }, + "annotations": {}, + "plain_text": "Self-hosted storage for Al" + }, + { + "type": "text", + "text": { + "content": "Self-hosted storage for Al" + }, + "annotations": {}, + "plain_text": "Self-hosted storage for Al" + } + ], + [ + { + "type": "text", + "text": { + "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + }, + "annotations": {}, + "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + }, + { + "type": "text", + "text": { + "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + }, + "annotations": {}, + "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + }, + { + "type": "text", + "text": { + "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + }, + "annotations": {}, + "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" + } + ], + [ + { + "type": "text", + "text": { + "content": "Infra control + compliance-ready" + }, + "annotations": {}, + "plain_text": "Infra control + compliance-ready" + }, + { + "type": "text", + "text": { + "content": "Infra control + compliance-ready" + }, + "annotations": {}, + "plain_text": "Infra control + compliance-ready" + } + ], + [ + { + "type": "text", + "text": { + "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + }, + "annotations": {}, + "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + }, + { + "type": "text", + "text": { + "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + }, + "annotations": {}, + "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + }, + { + "type": "text", + "text": { + "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + }, + "annotations": {}, + "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" + } + ], + [ + { + "type": "text", + "text": { + "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + }, + "annotations": {}, + "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + }, + { + "type": "text", + "text": { + "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + }, + "annotations": {}, + "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + }, + { + "type": "text", + "text": { + "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + }, + "annotations": {}, + "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" + } + ] + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwbfhsaw72bpxb481ss", + "type": "table_row", + "created_time": "2025-05-22T10:37:59.880461Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "table_row": { + "cells": [ + [ + { + "type": "text", + "text": { + "content": "HPC storage platforms" + }, + "annotations": {}, + "plain_text": "HPC storage platforms" + }, + { + "type": "text", + "text": { + "content": "HPC storage platforms" + }, + "annotations": {}, + "plain_text": "HPC storage platforms" + } + ], + [ + { + "type": "text", + "text": { + "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + "annotations": {}, + "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + { + "type": "text", + "text": { + "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + "annotations": {}, + "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + { + "type": "text", + "text": { + "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + "annotations": {}, + "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + { + "type": "text", + "text": { + "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + }, + "annotations": {}, + "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" + } + ], + [ + { + "type": "text", + "text": { + "content": "Ultra-performant + AI/HPC focused" + }, + "annotations": {}, + "plain_text": "Ultra-performant + AI/HPC focused" + }, + { + "type": "text", + "text": { + "content": "Ultra-performant + AI/HPC focused" + }, + "annotations": {}, + "plain_text": "Ultra-performant + AI/HPC focused" + } + ], + [ + { + "type": "text", + "text": { + "content": "Expensive + closed + vendor lock-in" + }, + "annotations": {}, + "plain_text": "Expensive + closed + vendor lock-in" + }, + { + "type": "text", + "text": { + "content": "Expensive + closed + vendor lock-in" + }, + "annotations": {}, + "plain_text": "Expensive + closed + vendor lock-in" + } + ], + [ + { + "type": "text", + "text": { + "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + }, + "annotations": {}, + "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + }, + { + "type": "text", + "text": { + "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + }, + "annotations": {}, + "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + }, + { + "type": "text", + "text": { + "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + }, + "annotations": {}, + "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" + } + ] + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gwde0wbb3z1caevzjfc", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.880622Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 5 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "ULTIHASH = hybrid Al-scale performance - without the HPC complexity or lock-in" + }, + "annotations": {}, + "plain_text": "ULTIHASH = hybrid Al-scale performance - without the HPC complexity or lock-in" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwff1ybkcwsyj1yb9dp", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.883150Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "-Freemium users" + }, + "annotations": {}, + "plain_text": "-Freemium users" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwgewytm4kmt19e7p1b", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.883202Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "A ULTIHASH" + }, + "annotations": {}, + "plain_text": "A ULTIHASH" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwher8tqraw636b33dq", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.883236Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Traction and GTM proof points" + }, + "annotations": {}, + "plain_text": "Traction and GTM proof points" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwjednv0hm0wdq5dvzq", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.883270Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Partner Validation from Market Leaders" + }, + "annotations": {}, + "plain_text": "Partner Validation from Market Leaders" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwqesc8sw3hh3fxhxmp", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.883452Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gwketba3mnatst53g6t", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883322Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Cisco DACH Al team working with us to serve mid-sized enterprise demand" + }, + "annotations": {}, + "plain_text": "Cisco DACH Al team working with us to serve mid-sized enterprise demand" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwmfz9sym412k7xcjhq", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883354Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "DevoTeam, Connection and 9 more system integrators prepare to introduce UltiHash to customer base" + }, + "annotations": {}, + "plain_text": "DevoTeam, Connection and 9 more system integrators prepare to introduce UltiHash to customer base" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwne4tb8gfkdhsngdwf", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883395Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Co-selling with infrastructure providers: AWS Marketplace, RNT Rausch, RoyalHosting, HiveNet, Salad GPU Cloud, VShosting ..." + }, + "annotations": {}, + "plain_text": "Co-selling with infrastructure providers: AWS Marketplace, RNT Rausch, RoyalHosting, HiveNet, Salad GPU Cloud, VShosting ..." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwpey88n626xbga3sj2", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883425Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Software partnerships for referrals with Superannotate, Encord, Earthmover" + }, + "annotations": {}, + "plain_text": "Software partnerships for referrals with Superannotate, Encord, Earthmover" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gwrewh8mjyhes3g599h", + "type": "image", + "created_time": "2025-05-22T10:37:59.883493Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_25n4gx1ytb98x85svvyk4m530f" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/5/Figure/8 description: The image is a line graph with the x-axis representing dates and the y-axis representing values from 0 to 70. The x-axis is labeled with dates: Jan 1, Jan 15, Feb 1, Feb 15, Mar 1, Mar 15, Apr 1, Apr 15, May 1, and Today. The y-axis is labeled with values from 0 to 70, increasing by 10. A green line starts at approximately 15 on Jan 1 and gradually increases over time. It reaches approximately 20 by Feb 1, 30 by Mar 1, 35 by Apr 1, 50 by May 1, and approximately 63 by Today. The background of the graph is black, and the grid lines are white." + }, + "annotations": {}, + "plain_text": "Image /page/5/Figure/8 description: The image is a line graph with the x-axis representing dates and the y-axis representing values from 0 to 70. The x-axis is labeled with dates: Jan 1, Jan 15, Feb 1, Feb 15, Mar 1, Mar 15, Apr 1, Apr 15, May 1, and Today. The y-axis is labeled with values from 0 to 70, increasing by 10. A green line starts at approximately 15 on Jan 1 and gradually increases over time. It reaches approximately 20 by Feb 1, 30 by Mar 1, 35 by Apr 1, 50 by May 1, and approximately 63 by Today. The background of the graph is black, and the grid lines are white." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwtfhrsnpyv5vbp85qr", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.883865Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Enterprise Testing" + }, + "annotations": {}, + "plain_text": "Enterprise Testing" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwxefmtteeysj8fr80j", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.883968Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gwverk99n1egd5t172j", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883910Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Bosch engaged in ongoing PiB-scale validation" + }, + "annotations": {}, + "plain_text": "Bosch engaged in ongoing PiB-scale validation" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gwwee1tpyx6gtfyg8s2", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.883941Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Commercial focus shifting to mid-sized companies with faster sales cycles" + }, + "annotations": {}, + "plain_text": "Commercial focus shifting to mid-sized companies with faster sales cycles" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gwye3m8gfca93paanj2", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.884001Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Freemium Growth" + }, + "annotations": {}, + "plain_text": "Freemium Growth" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx2e39brgqynfxs1kd5", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.884131Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gwzfdqre8d2r1n22pfd", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.884046Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "60+ developer signups (up from 15 in January)" + }, + "annotations": {}, + "plain_text": "60+ developer signups (up from 15 in January)" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx0ev9vm2mdxcr7a31t", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.884075Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Consistently increasing weekly growth through Q1" + }, + "annotations": {}, + "plain_text": "Consistently increasing weekly growth through Q1" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx1f4psqpabhbc4yz7g", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.884103Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 6 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Teams exploring use cases for GenAl workloads e.g. chatbots, RAG, Al agents" + }, + "annotations": {}, + "plain_text": "Teams exploring use cases for GenAl workloads e.g. chatbots, RAG, Al agents" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gx4e1r8r23bsnyzs34q", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.885079Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 7 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "A ULTIHASH" + }, + "annotations": {}, + "plain_text": "A ULTIHASH" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx5fx4rfmadwf98gt29", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.885121Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 7 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Key Risks - and How We're Tackling Them" + }, + "annotations": {}, + "plain_text": "Key Risks - and How We're Tackling Them" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx6f2zr3b8j0j9e42p9", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.885264Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 7 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Market/GTM Risk Revenue Risk Growth depends on scalable, repeatable sales and partner motion. Get to $500k-1M ARR requires strong traction in sticky infra market - Focused on mid-size EU enterprises with short sales cycles - We designed a low-friction developer path (10 TiB freemium, full self-service experience) - - Land & Expand model supported by developer-first adoption - Already building repeatable patterns with partners - Clear pricing and use-case alignment across product offering - Hiring GTM roles (Sales, DevAdvocate, partner enablement) Ocean Tier Risk Team Risk Our Wedge relies on delivering Ocean Tier as hybrid Al orchestration layer Show ability to scale a top-tier team and increase bus factor \u2013 EU-backed product funding + engineering roadmap in place - Team of 7 covering DevEx, infra, C++ backend, UX, GTM - Validated demand through deep discovery with multiple - Proven velocity and hiring discipline prospects + 1 buyer interested in Ocean Tier post-PoC + - Founder-led sales until now -> future GTM hires prepared startegic partner exploring bundled delivery post-funding - Builds on existing UltiHash architecture - not a new system" + }, + "annotations": {}, + "plain_text": "Market/GTM Risk Revenue Risk Growth depends on scalable, repeatable sales and partner motion. Get to $500k-1M ARR requires strong traction in sticky infra market - Focused on mid-size EU enterprises with short sales cycles - We designed a low-friction developer path (10 TiB freemium, full self-service experience) - - Land & Expand model supported by developer-first adoption - Already building repeatable patterns with partners - Clear pricing and use-case alignment across product offering - Hiring GTM roles (Sales, DevAdvocate, partner enablement) Ocean Tier Risk Team Risk Our Wedge relies on delivering Ocean Tier as hybrid Al orchestration layer Show ability to scale a top-tier team and increase bus factor \u2013 EU-backed product funding + engineering roadmap in place - Team of 7 covering DevEx, infra, C++ backend, UX, GTM - Validated demand through deep discovery with multiple - Proven velocity and hiring discipline prospects + 1 buyer interested in Ocean Tier post-PoC + - Founder-led sales until now -> future GTM hires prepared startegic partner exploring bundled delivery post-funding - Builds on existing UltiHash architecture - not a new system" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx8fecv2td04aj2xgfh", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.886223Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "What This Round Unlocks" + }, + "annotations": {}, + "plain_text": "What This Round Unlocks" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gx9etv9fgmq557p139p", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.886259Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "ARR & Commercial Traction" + }, + "annotations": {}, + "plain_text": "ARR & Commercial Traction" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxafyzssa1mgr02p448", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886296Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Target: $500k-1M ARR, 3x YoY growth" + }, + "annotations": {}, + "plain_text": "Target: $500k-1M ARR, 3x YoY growth" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxeedmta81458jratbw", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886425Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gxbf81rswtmhyszyb1h", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886342Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Convert 10-20 enterprise customers" + }, + "annotations": {}, + "plain_text": "Convert 10-20 enterprise customers" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxcfncranbn1x1bwce0", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886371Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Focus: mid-size EU companies (short cycles + high urgency)" + }, + "annotations": {}, + "plain_text": "Focus: mid-size EU companies (short cycles + high urgency)" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxdez1rq18zs9p7r6nr", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886399Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Refine pricing, ACV, and land & expand motion" + }, + "annotations": {}, + "plain_text": "Refine pricing, ACV, and land & expand motion" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gxfeq08za05ye11cvdm", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.886462Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Ocean Tier - Product Differentiation" + }, + "annotations": {}, + "plain_text": "Ocean Tier - Product Differentiation" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxgfzkt85hyvsz06ms1", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886493Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Target: PMF in a $80b+ TAM" + }, + "annotations": {}, + "plain_text": "Target: PMF in a $80b+ TAM" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxmfyttt7g341m72hsj", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886617Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gxhfkgsandm3cfj3ddn", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886538Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Launch Ocean Tier based on PoC customers" + }, + "annotations": {}, + "plain_text": "Launch Ocean Tier based on PoC customers" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxje6gbtjn62ptys36t", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886566Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Bundled integrations with GPU cloud & Tier 2 cloud partner -" + }, + "annotations": {}, + "plain_text": "Bundled integrations with GPU cloud & Tier 2 cloud partner -" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxkf2d928tjwpfka1ea", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886592Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Validate hybrid orchestration as UltiHash's long-term wedge" + }, + "annotations": {}, + "plain_text": "Validate hybrid orchestration as UltiHash's long-term wedge" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gxne8a8zcy521xyywxq", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886652Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Team" + }, + "annotations": {}, + "plain_text": "Team" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxpewb8vzw9m0gj93zx", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886681Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Target: Attract & retain top-tier talent" + }, + "annotations": {}, + "plain_text": "Target: Attract & retain top-tier talent" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxtewkt6pbvhjs4ttdk", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886806Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gxqe7qs874mryvcfptf", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886724Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Hire 1-2 GTM leaders (sales, partner, DevAdvocacy)" + }, + "annotations": {}, + "plain_text": "Hire 1-2 GTM leaders (sales, partner, DevAdvocacy)" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxrfc1bmybt146gebza", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886751Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Continue attracting elite engineering talent" + }, + "annotations": {}, + "plain_text": "Continue attracting elite engineering talent" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxsfrh83gx3086vjt94", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886780Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Build repeatable sales & partnership execution playbook" + }, + "annotations": {}, + "plain_text": "Build repeatable sales & partnership execution playbook" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gxver8vhs4xrf2yxkk7", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.886839Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Sales Efficiency" + }, + "annotations": {}, + "plain_text": "Sales Efficiency" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxwfrxvfrh7gevad7kx", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886869Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Target: <12mo CAC payback, >120% NDR" + }, + "annotations": {}, + "plain_text": "Target: <12mo CAC payback, >120% NDR" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy0e9qb6qe841ram2nk", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.886993Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gxxfd5tgf9tx2ca36e0", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886910Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Leverage serverless to enable scalable usage-based revenue" + }, + "annotations": {}, + "plain_text": "Leverage serverless to enable scalable usage-based revenue" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxyfnya473a1eg0r9dx", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886937Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Deploy land & expand motion in mid-market enterprises" + }, + "annotations": {}, + "plain_text": "Deploy land & expand motion in mid-market enterprises" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gxzfsjvgk66ag8ntkrr", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.886967Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Operationalize repeatable sales through partners" + }, + "annotations": {}, + "plain_text": "Operationalize repeatable sales through partners" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gy1ewpvgkd1gah6hna9", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.887025Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Moat & Strategic Positioning" + }, + "annotations": {}, + "plain_text": "Moat & Strategic Positioning" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy2e1dvjckdyv08v37y", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.887056Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Target: Conviction in long-term defensibility" + }, + "annotations": {}, + "plain_text": "Target: Conviction in long-term defensibility" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy6fhnt5529my6ea8sx", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.887221Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gy3ekfa91awd72zyytx", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.887100Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "| Hybrid + Al is structurally underserved intersection" + }, + "annotations": {}, + "plain_text": "| Hybrid + Al is structurally underserved intersection" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy4fh3v5664fp5z0gqj", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.887131Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Establish Ocean Tier as core differentiator to others" + }, + "annotations": {}, + "plain_text": "Establish Ocean Tier as core differentiator to others" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy5ecz9jbphwkhxh4v8", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.887159Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Leverage strategic partnerships with infra + Al stack players" + }, + "annotations": {}, + "plain_text": "Leverage strategic partnerships with infra + Al stack players" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gy7ey6tg7rj1mdwf4xy", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.887258Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 8 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "This round makes us Series A ready - commercial traction + team scale + strategic wedge validation." + }, + "annotations": {}, + "plain_text": "This round makes us Series A ready - commercial traction + team scale + strategic wedge validation." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gy9en8avwwxyh56gx5w", + "type": "image", + "created_time": "2025-05-22T10:37:59.889351Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_29f5w2gh2x9cea23sp1f1gp8fq" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/8/Picture/1 description: The image shows the logo for Ultihash. The logo consists of a mint green circle with a black symbol inside, followed by the word \"ULTIHASH\" in white." + }, + "annotations": {}, + "plain_text": "Image /page/8/Picture/1 description: The image shows the logo for Ultihash. The logo consists of a mint green circle with a black symbol inside, followed by the word \"ULTIHASH\" in white." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gybfb9s5esjgceqh0kn", + "type": "heading_1", + "created_time": "2025-05-22T10:37:59.889466Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "heading_1": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "This is the team that can pull it off" + }, + "annotations": {}, + "plain_text": "This is the team that can pull it off" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gycfhrsw3xp7yswegc6", + "type": "image", + "created_time": "2025-05-22T10:37:59.889496Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_6jmrkaa8pp82prgm75qb1fyzen" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/8/Picture/3 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a gray sweater. To the right of the man is a white lambda symbol on a black background." + }, + "annotations": {}, + "plain_text": "Image /page/8/Picture/3 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a gray sweater. To the right of the man is a white lambda symbol on a black background." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyefdar69hh7zmpss13", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.889588Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Founder, CEO" + }, + "annotations": {}, + "plain_text": "Founder, CEO" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyfef1sreg968t17pjb", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.889619Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Tom L\u00fcdersdorf" + }, + "annotations": {}, + "plain_text": "Tom L\u00fcdersdorf" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gykeq3s6dbmnca40af1", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.889746Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gygfxvth98sk04k5k6h", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.889664Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Deep product focus and customer obsession" + }, + "annotations": {}, + "plain_text": "Deep product focus and customer obsession" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyhfsq9p2fsss4wb4xc", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.889692Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Visionary behind Ocean Tier" + }, + "annotations": {}, + "plain_text": "Visionary behind Ocean Tier" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyjejj9pjsb43x1pm4a", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.889720Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Founder-led sales to date, now building GTM team" + }, + "annotations": {}, + "plain_text": "Founder-led sales to date, now building GTM team" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gymfkp9jm9a9j69shdc", + "type": "image", + "created_time": "2025-05-22T10:37:59.889781Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_25jk0s2mqn9pvbzny575dwptch" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/8/Picture/9 description: The image shows a man with a beard and a green sweater. He is smiling and looking at the camera. To the right of the man is a white lambda symbol on a black background." + }, + "annotations": {}, + "plain_text": "Image /page/8/Picture/9 description: The image shows a man with a beard and a green sweater. He is smiling and looking at the camera. To the right of the man is a white lambda symbol on a black background." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gypfskseaf148c9vpdm", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890085Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Founding Engineer, Tech Lead Stefan Jank" + }, + "annotations": {}, + "plain_text": "Founding Engineer, Tech Lead Stefan Jank" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gysegp8k8pfm9m4abhx", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890220Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gyqf3vs05cp58fts8cd", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890128Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Low-level, modern C++ expert + Database internals" + }, + "annotations": {}, + "plain_text": "Low-level, modern C++ expert + Database internals" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyre3w8yemynj8mvxq9", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890157Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Lead for DevEx" + }, + "annotations": {}, + "plain_text": "Lead for DevEx" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gytedfv7ntv1r90fvrd", + "type": "image", + "created_time": "2025-05-22T10:37:59.890254Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_1vgakb68038t7s8pt3b4zacz34" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/8/Picture/13 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a black hoodie. To the right of the man is a white lambda symbol on a black background." + }, + "annotations": {}, + "plain_text": "Image /page/8/Picture/13 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a black hoodie. To the right of the man is a white lambda symbol on a black background." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gywffsvw5gfkckz22ts", + "type": "heading_3", + "created_time": "2025-05-22T10:37:59.890349Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "heading_3": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Founding Engineer" + }, + "annotations": {}, + "plain_text": "Founding Engineer" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyxf5j9br884fpcd6bc", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890379Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Dr. Max Plauth" + }, + "annotations": {}, + "plain_text": "Dr. Max Plauth" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz0fydskkce00rh8rn5", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890471Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gyyfhybk8ts3zxdg7hc", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890418Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Expert in energy-efficient computing" + }, + "annotations": {}, + "plain_text": "Expert in energy-efficient computing" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gyze1xaz7mgxgd4cwwc", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890446Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Backend development in modern C++" + }, + "annotations": {}, + "plain_text": "Backend development in modern C++" + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gz1fp5rvy8ez984gw7b", + "type": "image", + "created_time": "2025-05-22T10:37:59.890500Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "image": { + "type": "external", + "external": { + "url": "textcortex://images/img_5xmkjvbr229kaa4qqcz7nvghhy" + }, + "caption": [ + { + "type": "text", + "text": { + "content": "Image /page/8/Figure/18 description: The image shows four people in a row. Each person is separated by a white symbol that looks like an upside-down V with a line over it. The first person is an Asian man with short black hair and glasses. He is wearing a tan sweater and smiling. The second person is a man with brown hair and a blue and green plaid shirt. He is smiling slightly. The third person is a woman with long blonde hair and glasses. She is wearing a black shirt and smiling. The fourth person is a man with a beard and glasses. He is wearing a black turtleneck sweater and smiling." + }, + "annotations": {}, + "plain_text": "Image /page/8/Figure/18 description: The image shows four people in a row. Each person is separated by a white symbol that looks like an upside-down V with a line over it. The first person is an Asian man with short black hair and glasses. He is wearing a tan sweater and smiling. The second person is a man with brown hair and a blue and green plaid shirt. He is smiling slightly. The third person is a woman with long blonde hair and glasses. She is wearing a black shirt and smiling. The fourth person is a man with a beard and glasses. He is wearing a black turtleneck sweater and smiling." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz3eqf8mwa7vmhpg505", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890618Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "7 people covering backend, storage internals, UX, DevOps, C++20/24, design, developer experience, sales ..." + }, + "annotations": {}, + "plain_text": "7 people covering backend, storage internals, UX, DevOps, C++20/24, design, developer experience, sales ..." + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz4ej9sc0b535x34dks", + "type": "heading_2", + "created_time": "2025-05-22T10:37:59.890646Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "heading_2": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Selected achievement's:" + }, + "annotations": {}, + "plain_text": "Selected achievement's:" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gzae1asrhdcqcxxpt5d", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890832Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": true, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [] + }, + "children": [ + { + "object": "block", + "id": "bk_01jvvs4gz5fcq8zbnb63fy6b1v", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890692Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Production-grade Kubernetes-native object storage with S3 API" + }, + "annotations": {}, + "plain_text": "Production-grade Kubernetes-native object storage with S3 API" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz6f7hvcf6d5v9zrx97", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890720Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "\u2013" + }, + "annotations": {}, + "plain_text": "\u2013" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz7fx49hd41syvykxrk", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890749Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Self-service developer experience with AWS Marketplace integration" + }, + "annotations": {}, + "plain_text": "Self-service developer experience with AWS Marketplace integration" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz8ekqv9426pa79sm18", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890776Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "SoC2 compliance, daily product benchmarking + CI/CD pipeline" + }, + "annotations": {}, + "plain_text": "SoC2 compliance, daily product benchmarking + CI/CD pipeline" + } + ] + } + }, + { + "object": "block", + "id": "bk_01jvvs4gz9f0ktzpwca6z1g9zh", + "type": "bulleted_list_item", + "created_time": "2025-05-22T10:37:59.890806Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "bulleted_list_item": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "Product validation with Startups + Enterprises like Bosch, Ericsson..." + }, + "annotations": {}, + "plain_text": "Product validation with Startups + Enterprises like Bosch, Ericsson..." + } + ] + } + } + ] + }, + { + "object": "block", + "id": "bk_01jvvs4gzbfq2tmy51bx7j63dj", + "type": "paragraph", + "created_time": "2025-05-22T10:37:59.890869Z", + "created_by": { + "object": "user", + "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" + }, + "has_children": false, + "metadata": { + "origin": { + "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", + "page_num": 9 + } + }, + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "No team turnover since product launch." + }, + "annotations": {}, + "plain_text": "No team turnover since product launch." + } + ] + } + } + ] +} diff --git a/typescript/package-lock.json b/typescript/package-lock.json index 8a58177..6db7689 100644 --- a/typescript/package-lock.json +++ b/typescript/package-lock.json @@ -34,9 +34,11 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "husky": "^9.1.7", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "json-schema-to-typescript": "^15.0.4", + "lint-staged": "^15.5.2", "prettier": "3.5.3", "ts-jest": "^29.3.4", "ts-node": "^10.9.2", @@ -3797,6 +3799,93 @@ "dev": true, "license": "MIT" }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3847,6 +3936,13 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -4310,6 +4406,19 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5089,6 +5198,13 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5498,6 +5614,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -5825,6 +5954,22 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", @@ -7378,143 +7523,595 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "node_modules/lint-staged": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/lint-staged/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, @@ -7551,6 +8148,19 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8091,6 +8701,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -8603,6 +9226,52 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -8613,6 +9282,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "4.41.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", @@ -8932,6 +9608,49 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -9052,6 +9771,16 @@ "bare-events": "^2.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10342,6 +11071,19 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/typescript/package.json b/typescript/package.json index 3c86d83..7a5b32c 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -20,7 +20,8 @@ "check": "tsc --noEmit", "lint": "eslint src --ext .ts,.tsx", "lint:fix": "eslint src --ext .ts,.tsx --fix", - "lint:check": "eslint src --ext .ts,.tsx --max-warnings 0" + "lint:check": "eslint src --ext .ts,.tsx --max-warnings 0", + "prepare": "husky" }, "keywords": [ "json", @@ -48,9 +49,11 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "husky": "^9.1.7", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "json-schema-to-typescript": "^15.0.4", + "lint-staged": "^15.5.2", "prettier": "3.5.3", "ts-jest": "^29.3.4", "ts-node": "^10.9.2", @@ -83,5 +86,13 @@ "bugs": { "url": "https://github.com/textcortex/JSON-DOC/issues" }, - "homepage": "https://github.com/textcortex/JSON-DOC#readme" + "homepage": "https://github.com/textcortex/JSON-DOC#readme", + "lint-staged": { + "*.{ts,tsx,js,jsx,json,css,md}": [ + "prettier --write" + ], + "*.{ts,tsx}": [ + "eslint --fix" + ] + } } diff --git a/typescript/test-format.ts b/typescript/test-format.ts new file mode 100644 index 0000000..ef18a3f --- /dev/null +++ b/typescript/test-format.ts @@ -0,0 +1,4 @@ +// Test file for prettier formatting +const test={a:1,b:2,c:3}; +function badFormat(x:number,y:string){return x+y;} +export default test; \ No newline at end of file From 8cca6f2f6e302f09a9044ebddbde95c9528803fb Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:56:35 +0200 Subject: [PATCH 3/9] Test prettier commit hook formatting --- typescript/test-format.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/typescript/test-format.ts b/typescript/test-format.ts index ef18a3f..cf977dc 100644 --- a/typescript/test-format.ts +++ b/typescript/test-format.ts @@ -1,4 +1,7 @@ // Test file for prettier formatting -const test={a:1,b:2,c:3}; -function badFormat(x:number,y:string){return x+y;} -export default test; \ No newline at end of file +const test = { a: 1, b: 2, c: 3, d: 4 }; +function badFormat(x: number, y: string) { + return x + y; +} +const another = { badly: "formatted" }; +export default test; From b8389c3564bc616227fc23517bd029dc9778f20e Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:03:48 +0200 Subject: [PATCH 4/9] Checkpoint --- .husky/_/husky.sh | 25 + .husky/pre-commit | 4 + typescript/.husky/pre-commit | 4 - typescript/asdf.json | 4542 ---------------------------------- typescript/test-format.ts | 7 - 5 files changed, 29 insertions(+), 4553 deletions(-) create mode 100755 .husky/_/husky.sh create mode 100755 .husky/pre-commit delete mode 100755 typescript/.husky/pre-commit delete mode 100644 typescript/asdf.json delete mode 100644 typescript/test-format.ts diff --git a/.husky/_/husky.sh b/.husky/_/husky.sh new file mode 100755 index 0000000..003b966 --- /dev/null +++ b/.husky/_/husky.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env sh +if [ -z "$husky_skip_init" ]; then + debug () { + if [ "$HUSKY_DEBUG" = "1" ]; then + echo "husky (debug) - $1" + fi + } + + readonly hook_name="$(basename -- "$0")" + debug "starting $hook_name..." + + if [ "$HUSKY" = "0" ]; then + debug "HUSKY env variable is set to 0, skipping hook" + exit 0 + fi + + if [ -f ~/.huskyrc ]; then + debug "sourcing ~/.huskyrc" + . ~/.huskyrc + fi + + readonly husky_skip_init=1 + export husky_skip_init + sh -e "$0" "$@" +fi \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..c42a737 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +cd typescript && npx lint-staged \ No newline at end of file diff --git a/typescript/.husky/pre-commit b/typescript/.husky/pre-commit deleted file mode 100755 index 2ce7d70..0000000 --- a/typescript/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#\!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -cd typescript && npx lint-staged diff --git a/typescript/asdf.json b/typescript/asdf.json deleted file mode 100644 index 74445df..0000000 --- a/typescript/asdf.json +++ /dev/null @@ -1,4542 +0,0 @@ -{ - "object": "page", - "id": "pg_01jvvs4gt9e62r57ysws5c91hv", - "created_time": "2025-05-22T10:37:59.870297Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "properties": { - "title": { - "type": "title", - "title": [ - { - "type": "text", - "text": { - "content": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." - }, - "annotations": {}, - "plain_text": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." - } - ] - } - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gtafcya6wkx23jqcyfb", - "type": "image", - "created_time": "2025-05-22T10:37:59.871637Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_0gpjmc7e5a9k0ahmy3cqtnkd5n" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/0/Picture/0 description: The image shows the logo for Ultihash. The logo consists of a teal circle with a white symbol inside, followed by the word \"ULTIHASH\" in white." - }, - "annotations": {}, - "plain_text": "Image /page/0/Picture/0 description: The image shows the logo for Ultihash. The logo consists of a teal circle with a white symbol inside, followed by the word \"ULTIHASH\" in white." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtcf4nsxbtv48rtwk27", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.871795Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Tom L\u00fcdersdorf, Founder/CEO" - }, - "annotations": {}, - "plain_text": "Tom L\u00fcdersdorf, Founder/CEO" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtdep5vjx4cb9vfkd95", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.871830Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Strictly private and confidential" - }, - "annotations": {}, - "plain_text": "Strictly private and confidential" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtefz5ve0pvxnzarce3", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.871864Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "The Future of Al Infrastructure is Hybrid" - }, - "annotations": {}, - "plain_text": "The Future of Al Infrastructure is Hybrid" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtfekw9cknxw1peywe7", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.871898Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." - }, - "annotations": {}, - "plain_text": "By 2028, Al data workloads will be hybrid by default - spanning on-prem, edge and multiple clouds." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtgez6r45aq5m7n8x2v", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.871944Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "\u00ae GenAl pushes enterprises to scale fast, but data is trapped across incompatible systems \u00ae EU enterprises are diversifying away from US hyperscalers, creating fragmented hybrid infrastructure Al workloads are inherently fragmented: inference here, training there, documents elsewhere" - }, - "annotations": {}, - "plain_text": "\u00ae GenAl pushes enterprises to scale fast, but data is trapped across incompatible systems \u00ae EU enterprises are diversifying away from US hyperscalers, creating fragmented hybrid infrastructure Al workloads are inherently fragmented: inference here, training there, documents elsewhere" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtheb9tykbwwj7edxky", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.871974Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "We believe storage must evolve now." - }, - "annotations": {}, - "plain_text": "We believe storage must evolve now." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtjf5dawkbxx4vvy7yv", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.872005Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "From siloed data to EVERYWHERE available" - }, - "annotations": {}, - "plain_text": "From siloed data to EVERYWHERE available" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtkfnjs2er1k6s6p1er", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.872035Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "From vendor lock-in to infrastructure agnostic" - }, - "annotations": {}, - "plain_text": "From vendor lock-in to infrastructure agnostic" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtmfjjsdms3d5ezs6km", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.872063Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 1 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "From capacity-centric to access-centric" - }, - "annotations": {}, - "plain_text": "From capacity-centric to access-centric" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtpeav8kdtqhw3207z8", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.873486Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 2 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "ULTIHASH TODAY" - }, - "annotations": {}, - "plain_text": "ULTIHASH TODAY" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtqfw885c2vkfydxsm7", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.873546Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 2 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "COMING NEXT" - }, - "annotations": {}, - "plain_text": "COMING NEXT" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtre6ss46dgbawzzs6w", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.873584Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 2 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A unified object storage layer for hybrid Al infrastructure" - }, - "annotations": {}, - "plain_text": "A unified object storage layer for hybrid Al infrastructure" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtsf1es6nd5bfty1sfj", - "type": "image", - "created_time": "2025-05-22T10:37:59.873627Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 2 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_4rfpkpcs7891tv0m76a7g3vs3m" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/1/Figure/3 description: The image shows a diagram of the Ultihash Ocean Tier architecture. It is divided into three tiers: Tier 1 Cloud Hyperscaler, GPU Cloud, and Tier 2 Cloud e.g. EU provider. Tier 1 includes Google Cloud, AWS, and Azure. The GPU Cloud includes Lambda, Nebius, Salad, and RunPod. Tier 2 includes OVHcloud, Hetzner, and GCore. The diagram also shows the Ultihash Ocean Tier, which includes 10 TiB Freemium, Ultihash self-hosted, and Ultihash serverless. The diagram also lists the benefits of the Ultihash Ocean Tier, which include zero-effort data access across clouds, no manual migration, smart orchestration of data placement, 10x lower latency, and 50% lower egress fees. The diagram also mentions primary storage for AI data, Kubernetes-native object storage, high throughput read performance, lossless deduplication cuts TCO by up to 60%, and S3-compatible, deployable on-prem or cloud." - }, - "annotations": {}, - "plain_text": "Image /page/1/Figure/3 description: The image shows a diagram of the Ultihash Ocean Tier architecture. It is divided into three tiers: Tier 1 Cloud Hyperscaler, GPU Cloud, and Tier 2 Cloud e.g. EU provider. Tier 1 includes Google Cloud, AWS, and Azure. The GPU Cloud includes Lambda, Nebius, Salad, and RunPod. Tier 2 includes OVHcloud, Hetzner, and GCore. The diagram also shows the Ultihash Ocean Tier, which includes 10 TiB Freemium, Ultihash self-hosted, and Ultihash serverless. The diagram also lists the benefits of the Ultihash Ocean Tier, which include zero-effort data access across clouds, no manual migration, smart orchestration of data placement, 10x lower latency, and 50% lower egress fees. The diagram also mentions primary storage for AI data, Kubernetes-native object storage, high throughput read performance, lossless deduplication cuts TCO by up to 60%, and S3-compatible, deployable on-prem or cloud." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtwf9g8vs9gxhxnab85", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.874474Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Companies with hybrid infrastructure manually migrate data between clouds for Al workloads" - }, - "annotations": {}, - "plain_text": "Companies with hybrid infrastructure manually migrate data between clouds for Al workloads" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtxfyya6yhvre9g5343", - "type": "image", - "created_time": "2025-05-22T10:37:59.874515Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_0knygkydq489hbnwtmqhp6m2z9" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/2/Figure/3 description: The image shows a typical hybrid Enterprise infrastructure. At the top, there are three boxes labeled \"BI tools e.g. Databricks\", \"GenAl app\", and \"Microsoft SharePoint\". Each of these boxes has a dashed arrow pointing down to a box labeled \"Storage AWS Cloud\", \"Storage Google Cloud\", and \"Storage Azure Cloud\", respectively. Below these storage boxes, there is a dashed box labeled \"Custom ETL & data orchestration\". Below this box, there is a box labeled \"on-prem legacy infrastructure\" and a box with a wavy line at the top and the text \"Data Lake (Swamp)\" inside. Below these boxes, there are three boxes labeled \"Sales / CRM Data Warehouse\", \"Manufacturing Data Warehouse\", and \"Finance Data Manager\". There is also a box labeled \"SEPARATE DATA STORES\"." - }, - "annotations": {}, - "plain_text": "Image /page/2/Figure/3 description: The image shows a typical hybrid Enterprise infrastructure. At the top, there are three boxes labeled \"BI tools e.g. Databricks\", \"GenAl app\", and \"Microsoft SharePoint\". Each of these boxes has a dashed arrow pointing down to a box labeled \"Storage AWS Cloud\", \"Storage Google Cloud\", and \"Storage Azure Cloud\", respectively. Below these storage boxes, there is a dashed box labeled \"Custom ETL & data orchestration\". Below this box, there is a box labeled \"on-prem legacy infrastructure\" and a box with a wavy line at the top and the text \"Data Lake (Swamp)\" inside. Below these boxes, there are three boxes labeled \"Sales / CRM Data Warehouse\", \"Manufacturing Data Warehouse\", and \"Finance Data Manager\". There is also a box labeled \"SEPARATE DATA STORES\"." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gtzf5csgd52r5fjsbkq", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.874712Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "The customer pain:" - }, - "annotations": {}, - "plain_text": "The customer pain:" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv3ejzt8asa4neywvw2", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.874868Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gv0f4mr5yt5aj8eg50e", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.874776Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Redundant copies = inflated storage cost" - }, - "annotations": {}, - "plain_text": "Redundant copies = inflated storage cost" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv1eshb4v9pzd4ae5s3", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.874812Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Human-in-the-loop = slow, error-prone data pipelines" - }, - "annotations": {}, - "plain_text": "Human-in-the-loop = slow, error-prone data pipelines" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv2f1crx9mchjrektwf", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.874841Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Multiple data versions = consistency chaos" - }, - "annotations": {}, - "plain_text": "Multiple data versions = consistency chaos" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gv4etm94vbdry7n8j18", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.874909Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Our wedge:" - }, - "annotations": {}, - "plain_text": "Our wedge:" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv8f48av46ncdy9a110", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.875056Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gv5fn89x271ectr8rgw", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.874962Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Automatically makes data available across clouds" - }, - "annotations": {}, - "plain_text": "Automatically makes data available across clouds" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv6ft39rgr5zvyax13y", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.875001Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "No manual migration, no permanent duplication \u2192 all data under single user namespace" - }, - "annotations": {}, - "plain_text": "No manual migration, no permanent duplication \u2192 all data under single user namespace" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gv7erkrr6fsjds2eh6t", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.875030Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Reduces cost, accelerates Al teams" - }, - "annotations": {}, - "plain_text": "Reduces cost, accelerates Al teams" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gv9e8vsynkxz3ch41mm", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.875094Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 3 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "No one else - not AWS, not MinlO or Vast is solving this elegantly." - }, - "annotations": {}, - "plain_text": "No one else - not AWS, not MinlO or Vast is solving this elegantly." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvbfsvsqmejt7dxsack", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.876368Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A ULTIHASH" - }, - "annotations": {}, - "plain_text": "A ULTIHASH" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvcfx6b3pdq5vpqf8bv", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.876410Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Distribution Edge - Developer-Led and Partner-Powered" - }, - "annotations": {}, - "plain_text": "Distribution Edge - Developer-Led and Partner-Powered" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvdf2m9q7jspdymb47s", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876447Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Self-Serve Developer Onboarding" - }, - "annotations": {}, - "plain_text": "Self-Serve Developer Onboarding" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvee9zv35v2zrw8ecbx", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876481Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "- Al/ML engineers & devs at startups and R&D teams" - }, - "annotations": {}, - "plain_text": "- Al/ML engineers & devs at startups and R&D teams" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvfe96sbzq3c1rsr85a", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876514Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "\u2013 Small infra teams in mid-sized orgs (Germany/EU)" - }, - "annotations": {}, - "plain_text": "\u2013 Small infra teams in mid-sized orgs (Germany/EU)" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvgec7v5bvb1dnn5yfk", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876546Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "\u2014 Head of Al Platform / Head of Infra / Storage Architects" - }, - "annotations": {}, - "plain_text": "\u2014 Head of Al Platform / Head of Infra / Storage Architects" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvhf72bs58q5cmjg4kd", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876579Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Outbound Enterprise Sales" - }, - "annotations": {}, - "plain_text": "Outbound Enterprise Sales" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvjec8rvwkm014ngks3", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876608Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Value of Product Offering" - }, - "annotations": {}, - "plain_text": "Value of Product Offering" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvkfmqaze3mnkxn9sck", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876637Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Strategic" - }, - "annotations": {}, - "plain_text": "Strategic" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvme7cbpaffheq4zqkh", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876667Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Partners" - }, - "annotations": {}, - "plain_text": "Partners" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvnf4catmf8nwc9nhbe", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876698Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "ICP" - }, - "annotations": {}, - "plain_text": "ICP" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvtedh9ahga56f9sf91", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876892Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gvqfvran4ck1c6azvy3", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.876796Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "10 TiB Freemium - 10 TB freemium dev license UltiHash self-hosted - Instant Kubernetes-native setup - No commitment, fast evaluation \u2192 UltiHash self-hosted version " - }, - "annotations": {}, - "plain_text": "10 TiB Freemium - 10 TB freemium dev license UltiHash self-hosted - Instant Kubernetes-native setup - No commitment, fast evaluation \u2192 UltiHash self-hosted version " - } - ] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gvpesfry83cdaxgwj1m", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.876763Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "UltiHash serverless OCEAN TIER (hybrid)" - }, - "annotations": {}, - "plain_text": "UltiHash serverless OCEAN TIER (hybrid)" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gvrfj1v01xp9qrd6b86", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.876832Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Dedicated support, onboarding & SLAs" - }, - "annotations": {}, - "plain_text": "Dedicated support, onboarding & SLAs" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvsfg0bdzsdqt6d6sdk", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.876864Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Large-scale deployments with performance & cost savings \u2192 UltiHash serverless or self-hosted + Ocean Tier" - }, - "annotations": {}, - "plain_text": "Large-scale deployments with performance & cost savings \u2192 UltiHash serverless or self-hosted + Ocean Tier" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gvvf16tssd5dk8czgqk", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876928Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "- Large orgs with >100 TB and hybrid infrastructure" - }, - "annotations": {}, - "plain_text": "- Large orgs with >100 TB and hybrid infrastructure" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvwen9876g7tvh88gtq", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876956Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvxfz6bg91c8dd37v5w", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.876982Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Software integrations that devs already use:" - }, - "annotations": {}, - "plain_text": "Software integrations that devs already use:" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw0eks9asefcme7gjfg", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.877081Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gvyfvr9bffj93r9731h", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.877025Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "\u2192 SuperAnnotate, Zilliz, Encord, Icechunk..." - }, - "annotations": {}, - "plain_text": "\u2192 SuperAnnotate, Zilliz, Encord, Icechunk..." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gvzeert96yk2cavzc5r", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.877055Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "> Accelerate validation and data pipeline integration" - }, - "annotations": {}, - "plain_text": "> Accelerate validation and data pipeline integration" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gw1fmrrhfraexg6ba9g", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.877115Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "System integrators help navigate enterprise complexity: \u2192 Devoteam, Connection, Combitech..." - }, - "annotations": {}, - "plain_text": "System integrators help navigate enterprise complexity: \u2192 Devoteam, Connection, Combitech..." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw2fhm8m9z37f9hd3gc", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.877145Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Hardware & Cloud infra providers:" - }, - "annotations": {}, - "plain_text": "Hardware & Cloud infra providers:" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw3egprz5fqzcswz0d1", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.877176Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 4 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "> Cisco, RNT Rausch, AWS, Google Cloud, HiveNet, Salad, vshosting, RoyalHosting ..." - }, - "annotations": {}, - "plain_text": "> Cisco, RNT Rausch, AWS, Google Cloud, HiveNet, Salad, vshosting, RoyalHosting ..." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw5fa3s27x44nxt6908", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.879263Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A ULTIHASH" - }, - "annotations": {}, - "plain_text": "A ULTIHASH" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw6fk39rvww7j0zhspb", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.879329Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Competitive Landscape - Why UltiHash Wins" - }, - "annotations": {}, - "plain_text": "Competitive Landscape - Why UltiHash Wins" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwcf7mtjnw78dmqbnjt", - "type": "table", - "created_time": "2025-05-22T10:37:59.880560Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table": { - "has_column_header": true, - "has_row_header": false - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gw7edaav1pgjxpy6pzg", - "type": "table_row", - "created_time": "2025-05-22T10:37:59.879512Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table_row": { - "cells": [ - [ - { - "type": "text", - "text": { - "content": "Category" - }, - "annotations": {}, - "plain_text": "Category" - } - ], - [ - { - "type": "text", - "text": { - "content": "Players" - }, - "annotations": {}, - "plain_text": "Players" - } - ], - [ - { - "type": "text", - "text": { - "content": "Strengths" - }, - "annotations": {}, - "plain_text": "Strengths" - } - ], - [ - { - "type": "text", - "text": { - "content": "Weaknesses" - }, - "annotations": {}, - "plain_text": "Weaknesses" - } - ], - [ - { - "type": "text", - "text": { - "content": "Why ULTIHASH Wins" - }, - "annotations": {}, - "plain_text": "Why ULTIHASH Wins" - } - ] - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw8fk8r05hekaz1v007", - "type": "table_row", - "created_time": "2025-05-22T10:37:59.879717Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table_row": { - "cells": [ - [ - { - "type": "text", - "text": { - "content": "Hyperscalers" - }, - "annotations": {}, - "plain_text": "Hyperscalers" - } - ], - [ - { - "type": "text", - "text": { - "content": "AWS S3, Azure Blob, GCP Storage" - }, - "annotations": {}, - "plain_text": "AWS S3, Azure Blob, GCP Storage" - }, - { - "type": "text", - "text": { - "content": "AWS S3, Azure Blob, GCP Storage" - }, - "annotations": {}, - "plain_text": "AWS S3, Azure Blob, GCP Storage" - } - ], - [ - { - "type": "text", - "text": { - "content": "Ubiquitous + deeply integrated" - }, - "annotations": {}, - "plain_text": "Ubiquitous + deeply integrated" - }, - { - "type": "text", - "text": { - "content": "Ubiquitous + deeply integrated" - }, - "annotations": {}, - "plain_text": "Ubiquitous + deeply integrated" - } - ], - [ - { - "type": "text", - "text": { - "content": "Vendor lock-in + poor hybrid support" - }, - "annotations": {}, - "plain_text": "Vendor lock-in + poor hybrid support" - }, - { - "type": "text", - "text": { - "content": "Vendor lock-in + poor hybrid support" - }, - "annotations": {}, - "plain_text": "Vendor lock-in + poor hybrid support" - } - ], - [ - { - "type": "text", - "text": { - "content": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" - }, - "annotations": {}, - "plain_text": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" - }, - { - "type": "text", - "text": { - "content": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" - }, - "annotations": {}, - "plain_text": "\u2714 Hybrid-first: runs on-prem, edge, cloud \u2014 not locked in" - } - ] - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gw9e8paby8qaebk7z7h", - "type": "table_row", - "created_time": "2025-05-22T10:37:59.879918Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table_row": { - "cells": [ - [ - { - "type": "text", - "text": { - "content": "Local/Managed S3 Storage Providers" - }, - "annotations": {}, - "plain_text": "Local/Managed S3 Storage Providers" - }, - { - "type": "text", - "text": { - "content": "Local/Managed S3 Storage Providers" - }, - "annotations": {}, - "plain_text": "Local/Managed S3 Storage Providers" - } - ], - [ - { - "type": "text", - "text": { - "content": "Hetzner, Backblaze, Wasabi, Tigris" - }, - "annotations": {}, - "plain_text": "Hetzner, Backblaze, Wasabi, Tigris" - }, - { - "type": "text", - "text": { - "content": "Hetzner, Backblaze, Wasabi, Tigris" - }, - "annotations": {}, - "plain_text": "Hetzner, Backblaze, Wasabi, Tigris" - } - ], - [ - { - "type": "text", - "text": { - "content": "Cheap + S3-compatible" - }, - "annotations": {}, - "plain_text": "Cheap + S3-compatible" - }, - { - "type": "text", - "text": { - "content": "Cheap + S3-compatible" - }, - "annotations": {}, - "plain_text": "Cheap + S3-compatible" - } - ], - [ - { - "type": "text", - "text": { - "content": "Weak ecosystem + not AI-performant" - }, - "annotations": {}, - "plain_text": "Weak ecosystem + not AI-performant" - }, - { - "type": "text", - "text": { - "content": "Weak ecosystem + not AI-performant" - }, - "annotations": {}, - "plain_text": "Weak ecosystem + not AI-performant" - } - ], - [ - { - "type": "text", - "text": { - "content": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" - }, - "annotations": {}, - "plain_text": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" - }, - { - "type": "text", - "text": { - "content": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" - }, - "annotations": {}, - "plain_text": "\u2714 AI-optimized: fast reads, data deduplication, built for inference/training" - } - ] - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwaemqv1manrqk4hrbs", - "type": "table_row", - "created_time": "2025-05-22T10:37:59.880214Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table_row": { - "cells": [ - [ - { - "type": "text", - "text": { - "content": "Self-hosted storage for Al" - }, - "annotations": {}, - "plain_text": "Self-hosted storage for Al" - }, - { - "type": "text", - "text": { - "content": "Self-hosted storage for Al" - }, - "annotations": {}, - "plain_text": "Self-hosted storage for Al" - } - ], - [ - { - "type": "text", - "text": { - "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - }, - "annotations": {}, - "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - }, - { - "type": "text", - "text": { - "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - }, - "annotations": {}, - "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - }, - { - "type": "text", - "text": { - "content": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - }, - "annotations": {}, - "plain_text": "MinIO, Scality, Ceph, Cloudian, VAST, Weka" - } - ], - [ - { - "type": "text", - "text": { - "content": "Infra control + compliance-ready" - }, - "annotations": {}, - "plain_text": "Infra control + compliance-ready" - }, - { - "type": "text", - "text": { - "content": "Infra control + compliance-ready" - }, - "annotations": {}, - "plain_text": "Infra control + compliance-ready" - } - ], - [ - { - "type": "text", - "text": { - "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - }, - "annotations": {}, - "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - }, - { - "type": "text", - "text": { - "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - }, - "annotations": {}, - "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - }, - { - "type": "text", - "text": { - "content": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - }, - "annotations": {}, - "plain_text": "Long sales cycles + infra-heavy adoption with minimum 1 PiB" - } - ], - [ - { - "type": "text", - "text": { - "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - }, - "annotations": {}, - "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - }, - { - "type": "text", - "text": { - "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - }, - "annotations": {}, - "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - }, - { - "type": "text", - "text": { - "content": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - }, - "annotations": {}, - "plain_text": "\u2714 Kubernetes-native with serverless connection: quick to deploy also for smaller environments + self-service purchase" - } - ] - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwbfhsaw72bpxb481ss", - "type": "table_row", - "created_time": "2025-05-22T10:37:59.880461Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "table_row": { - "cells": [ - [ - { - "type": "text", - "text": { - "content": "HPC storage platforms" - }, - "annotations": {}, - "plain_text": "HPC storage platforms" - }, - { - "type": "text", - "text": { - "content": "HPC storage platforms" - }, - "annotations": {}, - "plain_text": "HPC storage platforms" - } - ], - [ - { - "type": "text", - "text": { - "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - "annotations": {}, - "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - { - "type": "text", - "text": { - "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - "annotations": {}, - "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - { - "type": "text", - "text": { - "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - "annotations": {}, - "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - { - "type": "text", - "text": { - "content": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - }, - "annotations": {}, - "plain_text": "DDN, IBM Spectrum Scale, BeeGFS, Coreweave, Lambda" - } - ], - [ - { - "type": "text", - "text": { - "content": "Ultra-performant + AI/HPC focused" - }, - "annotations": {}, - "plain_text": "Ultra-performant + AI/HPC focused" - }, - { - "type": "text", - "text": { - "content": "Ultra-performant + AI/HPC focused" - }, - "annotations": {}, - "plain_text": "Ultra-performant + AI/HPC focused" - } - ], - [ - { - "type": "text", - "text": { - "content": "Expensive + closed + vendor lock-in" - }, - "annotations": {}, - "plain_text": "Expensive + closed + vendor lock-in" - }, - { - "type": "text", - "text": { - "content": "Expensive + closed + vendor lock-in" - }, - "annotations": {}, - "plain_text": "Expensive + closed + vendor lock-in" - } - ], - [ - { - "type": "text", - "text": { - "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - }, - "annotations": {}, - "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - }, - { - "type": "text", - "text": { - "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - }, - "annotations": {}, - "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - }, - { - "type": "text", - "text": { - "content": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - }, - "annotations": {}, - "plain_text": "\u2714 Modular pricing: usage-based also on-prem, freemium to PiB-scale, no vendor lock-in" - } - ] - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gwde0wbb3z1caevzjfc", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.880622Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 5 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "ULTIHASH = hybrid Al-scale performance - without the HPC complexity or lock-in" - }, - "annotations": {}, - "plain_text": "ULTIHASH = hybrid Al-scale performance - without the HPC complexity or lock-in" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwff1ybkcwsyj1yb9dp", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.883150Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "-Freemium users" - }, - "annotations": {}, - "plain_text": "-Freemium users" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwgewytm4kmt19e7p1b", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.883202Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A ULTIHASH" - }, - "annotations": {}, - "plain_text": "A ULTIHASH" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwher8tqraw636b33dq", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.883236Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Traction and GTM proof points" - }, - "annotations": {}, - "plain_text": "Traction and GTM proof points" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwjednv0hm0wdq5dvzq", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.883270Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Partner Validation from Market Leaders" - }, - "annotations": {}, - "plain_text": "Partner Validation from Market Leaders" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwqesc8sw3hh3fxhxmp", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.883452Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gwketba3mnatst53g6t", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883322Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Cisco DACH Al team working with us to serve mid-sized enterprise demand" - }, - "annotations": {}, - "plain_text": "Cisco DACH Al team working with us to serve mid-sized enterprise demand" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwmfz9sym412k7xcjhq", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883354Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "DevoTeam, Connection and 9 more system integrators prepare to introduce UltiHash to customer base" - }, - "annotations": {}, - "plain_text": "DevoTeam, Connection and 9 more system integrators prepare to introduce UltiHash to customer base" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwne4tb8gfkdhsngdwf", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883395Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Co-selling with infrastructure providers: AWS Marketplace, RNT Rausch, RoyalHosting, HiveNet, Salad GPU Cloud, VShosting ..." - }, - "annotations": {}, - "plain_text": "Co-selling with infrastructure providers: AWS Marketplace, RNT Rausch, RoyalHosting, HiveNet, Salad GPU Cloud, VShosting ..." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwpey88n626xbga3sj2", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883425Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Software partnerships for referrals with Superannotate, Encord, Earthmover" - }, - "annotations": {}, - "plain_text": "Software partnerships for referrals with Superannotate, Encord, Earthmover" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gwrewh8mjyhes3g599h", - "type": "image", - "created_time": "2025-05-22T10:37:59.883493Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_25n4gx1ytb98x85svvyk4m530f" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/5/Figure/8 description: The image is a line graph with the x-axis representing dates and the y-axis representing values from 0 to 70. The x-axis is labeled with dates: Jan 1, Jan 15, Feb 1, Feb 15, Mar 1, Mar 15, Apr 1, Apr 15, May 1, and Today. The y-axis is labeled with values from 0 to 70, increasing by 10. A green line starts at approximately 15 on Jan 1 and gradually increases over time. It reaches approximately 20 by Feb 1, 30 by Mar 1, 35 by Apr 1, 50 by May 1, and approximately 63 by Today. The background of the graph is black, and the grid lines are white." - }, - "annotations": {}, - "plain_text": "Image /page/5/Figure/8 description: The image is a line graph with the x-axis representing dates and the y-axis representing values from 0 to 70. The x-axis is labeled with dates: Jan 1, Jan 15, Feb 1, Feb 15, Mar 1, Mar 15, Apr 1, Apr 15, May 1, and Today. The y-axis is labeled with values from 0 to 70, increasing by 10. A green line starts at approximately 15 on Jan 1 and gradually increases over time. It reaches approximately 20 by Feb 1, 30 by Mar 1, 35 by Apr 1, 50 by May 1, and approximately 63 by Today. The background of the graph is black, and the grid lines are white." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwtfhrsnpyv5vbp85qr", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.883865Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Enterprise Testing" - }, - "annotations": {}, - "plain_text": "Enterprise Testing" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwxefmtteeysj8fr80j", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.883968Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gwverk99n1egd5t172j", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883910Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Bosch engaged in ongoing PiB-scale validation" - }, - "annotations": {}, - "plain_text": "Bosch engaged in ongoing PiB-scale validation" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gwwee1tpyx6gtfyg8s2", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.883941Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Commercial focus shifting to mid-sized companies with faster sales cycles" - }, - "annotations": {}, - "plain_text": "Commercial focus shifting to mid-sized companies with faster sales cycles" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gwye3m8gfca93paanj2", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.884001Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Freemium Growth" - }, - "annotations": {}, - "plain_text": "Freemium Growth" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx2e39brgqynfxs1kd5", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.884131Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gwzfdqre8d2r1n22pfd", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.884046Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "60+ developer signups (up from 15 in January)" - }, - "annotations": {}, - "plain_text": "60+ developer signups (up from 15 in January)" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx0ev9vm2mdxcr7a31t", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.884075Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Consistently increasing weekly growth through Q1" - }, - "annotations": {}, - "plain_text": "Consistently increasing weekly growth through Q1" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx1f4psqpabhbc4yz7g", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.884103Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 6 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Teams exploring use cases for GenAl workloads e.g. chatbots, RAG, Al agents" - }, - "annotations": {}, - "plain_text": "Teams exploring use cases for GenAl workloads e.g. chatbots, RAG, Al agents" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gx4e1r8r23bsnyzs34q", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.885079Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 7 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A ULTIHASH" - }, - "annotations": {}, - "plain_text": "A ULTIHASH" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx5fx4rfmadwf98gt29", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.885121Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 7 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Key Risks - and How We're Tackling Them" - }, - "annotations": {}, - "plain_text": "Key Risks - and How We're Tackling Them" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx6f2zr3b8j0j9e42p9", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.885264Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 7 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Market/GTM Risk Revenue Risk Growth depends on scalable, repeatable sales and partner motion. Get to $500k-1M ARR requires strong traction in sticky infra market - Focused on mid-size EU enterprises with short sales cycles - We designed a low-friction developer path (10 TiB freemium, full self-service experience) - - Land & Expand model supported by developer-first adoption - Already building repeatable patterns with partners - Clear pricing and use-case alignment across product offering - Hiring GTM roles (Sales, DevAdvocate, partner enablement) Ocean Tier Risk Team Risk Our Wedge relies on delivering Ocean Tier as hybrid Al orchestration layer Show ability to scale a top-tier team and increase bus factor \u2013 EU-backed product funding + engineering roadmap in place - Team of 7 covering DevEx, infra, C++ backend, UX, GTM - Validated demand through deep discovery with multiple - Proven velocity and hiring discipline prospects + 1 buyer interested in Ocean Tier post-PoC + - Founder-led sales until now -> future GTM hires prepared startegic partner exploring bundled delivery post-funding - Builds on existing UltiHash architecture - not a new system" - }, - "annotations": {}, - "plain_text": "Market/GTM Risk Revenue Risk Growth depends on scalable, repeatable sales and partner motion. Get to $500k-1M ARR requires strong traction in sticky infra market - Focused on mid-size EU enterprises with short sales cycles - We designed a low-friction developer path (10 TiB freemium, full self-service experience) - - Land & Expand model supported by developer-first adoption - Already building repeatable patterns with partners - Clear pricing and use-case alignment across product offering - Hiring GTM roles (Sales, DevAdvocate, partner enablement) Ocean Tier Risk Team Risk Our Wedge relies on delivering Ocean Tier as hybrid Al orchestration layer Show ability to scale a top-tier team and increase bus factor \u2013 EU-backed product funding + engineering roadmap in place - Team of 7 covering DevEx, infra, C++ backend, UX, GTM - Validated demand through deep discovery with multiple - Proven velocity and hiring discipline prospects + 1 buyer interested in Ocean Tier post-PoC + - Founder-led sales until now -> future GTM hires prepared startegic partner exploring bundled delivery post-funding - Builds on existing UltiHash architecture - not a new system" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx8fecv2td04aj2xgfh", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.886223Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "What This Round Unlocks" - }, - "annotations": {}, - "plain_text": "What This Round Unlocks" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gx9etv9fgmq557p139p", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.886259Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "ARR & Commercial Traction" - }, - "annotations": {}, - "plain_text": "ARR & Commercial Traction" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxafyzssa1mgr02p448", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886296Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Target: $500k-1M ARR, 3x YoY growth" - }, - "annotations": {}, - "plain_text": "Target: $500k-1M ARR, 3x YoY growth" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxeedmta81458jratbw", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886425Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gxbf81rswtmhyszyb1h", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886342Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Convert 10-20 enterprise customers" - }, - "annotations": {}, - "plain_text": "Convert 10-20 enterprise customers" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxcfncranbn1x1bwce0", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886371Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Focus: mid-size EU companies (short cycles + high urgency)" - }, - "annotations": {}, - "plain_text": "Focus: mid-size EU companies (short cycles + high urgency)" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxdez1rq18zs9p7r6nr", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886399Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Refine pricing, ACV, and land & expand motion" - }, - "annotations": {}, - "plain_text": "Refine pricing, ACV, and land & expand motion" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gxfeq08za05ye11cvdm", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.886462Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Ocean Tier - Product Differentiation" - }, - "annotations": {}, - "plain_text": "Ocean Tier - Product Differentiation" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxgfzkt85hyvsz06ms1", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886493Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Target: PMF in a $80b+ TAM" - }, - "annotations": {}, - "plain_text": "Target: PMF in a $80b+ TAM" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxmfyttt7g341m72hsj", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886617Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gxhfkgsandm3cfj3ddn", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886538Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Launch Ocean Tier based on PoC customers" - }, - "annotations": {}, - "plain_text": "Launch Ocean Tier based on PoC customers" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxje6gbtjn62ptys36t", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886566Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Bundled integrations with GPU cloud & Tier 2 cloud partner -" - }, - "annotations": {}, - "plain_text": "Bundled integrations with GPU cloud & Tier 2 cloud partner -" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxkf2d928tjwpfka1ea", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886592Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Validate hybrid orchestration as UltiHash's long-term wedge" - }, - "annotations": {}, - "plain_text": "Validate hybrid orchestration as UltiHash's long-term wedge" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gxne8a8zcy521xyywxq", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886652Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Team" - }, - "annotations": {}, - "plain_text": "Team" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxpewb8vzw9m0gj93zx", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886681Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Target: Attract & retain top-tier talent" - }, - "annotations": {}, - "plain_text": "Target: Attract & retain top-tier talent" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxtewkt6pbvhjs4ttdk", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886806Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gxqe7qs874mryvcfptf", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886724Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Hire 1-2 GTM leaders (sales, partner, DevAdvocacy)" - }, - "annotations": {}, - "plain_text": "Hire 1-2 GTM leaders (sales, partner, DevAdvocacy)" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxrfc1bmybt146gebza", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886751Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Continue attracting elite engineering talent" - }, - "annotations": {}, - "plain_text": "Continue attracting elite engineering talent" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxsfrh83gx3086vjt94", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886780Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Build repeatable sales & partnership execution playbook" - }, - "annotations": {}, - "plain_text": "Build repeatable sales & partnership execution playbook" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gxver8vhs4xrf2yxkk7", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.886839Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Sales Efficiency" - }, - "annotations": {}, - "plain_text": "Sales Efficiency" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxwfrxvfrh7gevad7kx", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886869Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Target: <12mo CAC payback, >120% NDR" - }, - "annotations": {}, - "plain_text": "Target: <12mo CAC payback, >120% NDR" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy0e9qb6qe841ram2nk", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.886993Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gxxfd5tgf9tx2ca36e0", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886910Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Leverage serverless to enable scalable usage-based revenue" - }, - "annotations": {}, - "plain_text": "Leverage serverless to enable scalable usage-based revenue" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxyfnya473a1eg0r9dx", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886937Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Deploy land & expand motion in mid-market enterprises" - }, - "annotations": {}, - "plain_text": "Deploy land & expand motion in mid-market enterprises" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gxzfsjvgk66ag8ntkrr", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.886967Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Operationalize repeatable sales through partners" - }, - "annotations": {}, - "plain_text": "Operationalize repeatable sales through partners" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gy1ewpvgkd1gah6hna9", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.887025Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Moat & Strategic Positioning" - }, - "annotations": {}, - "plain_text": "Moat & Strategic Positioning" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy2e1dvjckdyv08v37y", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.887056Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Target: Conviction in long-term defensibility" - }, - "annotations": {}, - "plain_text": "Target: Conviction in long-term defensibility" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy6fhnt5529my6ea8sx", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.887221Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gy3ekfa91awd72zyytx", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.887100Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "| Hybrid + Al is structurally underserved intersection" - }, - "annotations": {}, - "plain_text": "| Hybrid + Al is structurally underserved intersection" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy4fh3v5664fp5z0gqj", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.887131Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Establish Ocean Tier as core differentiator to others" - }, - "annotations": {}, - "plain_text": "Establish Ocean Tier as core differentiator to others" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy5ecz9jbphwkhxh4v8", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.887159Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Leverage strategic partnerships with infra + Al stack players" - }, - "annotations": {}, - "plain_text": "Leverage strategic partnerships with infra + Al stack players" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gy7ey6tg7rj1mdwf4xy", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.887258Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 8 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "This round makes us Series A ready - commercial traction + team scale + strategic wedge validation." - }, - "annotations": {}, - "plain_text": "This round makes us Series A ready - commercial traction + team scale + strategic wedge validation." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gy9en8avwwxyh56gx5w", - "type": "image", - "created_time": "2025-05-22T10:37:59.889351Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_29f5w2gh2x9cea23sp1f1gp8fq" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/8/Picture/1 description: The image shows the logo for Ultihash. The logo consists of a mint green circle with a black symbol inside, followed by the word \"ULTIHASH\" in white." - }, - "annotations": {}, - "plain_text": "Image /page/8/Picture/1 description: The image shows the logo for Ultihash. The logo consists of a mint green circle with a black symbol inside, followed by the word \"ULTIHASH\" in white." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gybfb9s5esjgceqh0kn", - "type": "heading_1", - "created_time": "2025-05-22T10:37:59.889466Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "This is the team that can pull it off" - }, - "annotations": {}, - "plain_text": "This is the team that can pull it off" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gycfhrsw3xp7yswegc6", - "type": "image", - "created_time": "2025-05-22T10:37:59.889496Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_6jmrkaa8pp82prgm75qb1fyzen" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/8/Picture/3 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a gray sweater. To the right of the man is a white lambda symbol on a black background." - }, - "annotations": {}, - "plain_text": "Image /page/8/Picture/3 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a gray sweater. To the right of the man is a white lambda symbol on a black background." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyefdar69hh7zmpss13", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.889588Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Founder, CEO" - }, - "annotations": {}, - "plain_text": "Founder, CEO" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyfef1sreg968t17pjb", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.889619Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Tom L\u00fcdersdorf" - }, - "annotations": {}, - "plain_text": "Tom L\u00fcdersdorf" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gykeq3s6dbmnca40af1", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.889746Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gygfxvth98sk04k5k6h", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.889664Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Deep product focus and customer obsession" - }, - "annotations": {}, - "plain_text": "Deep product focus and customer obsession" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyhfsq9p2fsss4wb4xc", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.889692Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Visionary behind Ocean Tier" - }, - "annotations": {}, - "plain_text": "Visionary behind Ocean Tier" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyjejj9pjsb43x1pm4a", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.889720Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Founder-led sales to date, now building GTM team" - }, - "annotations": {}, - "plain_text": "Founder-led sales to date, now building GTM team" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gymfkp9jm9a9j69shdc", - "type": "image", - "created_time": "2025-05-22T10:37:59.889781Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_25jk0s2mqn9pvbzny575dwptch" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/8/Picture/9 description: The image shows a man with a beard and a green sweater. He is smiling and looking at the camera. To the right of the man is a white lambda symbol on a black background." - }, - "annotations": {}, - "plain_text": "Image /page/8/Picture/9 description: The image shows a man with a beard and a green sweater. He is smiling and looking at the camera. To the right of the man is a white lambda symbol on a black background." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gypfskseaf148c9vpdm", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890085Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Founding Engineer, Tech Lead Stefan Jank" - }, - "annotations": {}, - "plain_text": "Founding Engineer, Tech Lead Stefan Jank" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gysegp8k8pfm9m4abhx", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890220Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gyqf3vs05cp58fts8cd", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890128Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Low-level, modern C++ expert + Database internals" - }, - "annotations": {}, - "plain_text": "Low-level, modern C++ expert + Database internals" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyre3w8yemynj8mvxq9", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890157Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Lead for DevEx" - }, - "annotations": {}, - "plain_text": "Lead for DevEx" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gytedfv7ntv1r90fvrd", - "type": "image", - "created_time": "2025-05-22T10:37:59.890254Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_1vgakb68038t7s8pt3b4zacz34" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/8/Picture/13 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a black hoodie. To the right of the man is a white lambda symbol on a black background." - }, - "annotations": {}, - "plain_text": "Image /page/8/Picture/13 description: A man with short brown hair and glasses is smiling at the camera. He is wearing a black hoodie. To the right of the man is a white lambda symbol on a black background." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gywffsvw5gfkckz22ts", - "type": "heading_3", - "created_time": "2025-05-22T10:37:59.890349Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Founding Engineer" - }, - "annotations": {}, - "plain_text": "Founding Engineer" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyxf5j9br884fpcd6bc", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890379Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Dr. Max Plauth" - }, - "annotations": {}, - "plain_text": "Dr. Max Plauth" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz0fydskkce00rh8rn5", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890471Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gyyfhybk8ts3zxdg7hc", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890418Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Expert in energy-efficient computing" - }, - "annotations": {}, - "plain_text": "Expert in energy-efficient computing" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gyze1xaz7mgxgd4cwwc", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890446Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Backend development in modern C++" - }, - "annotations": {}, - "plain_text": "Backend development in modern C++" - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gz1fp5rvy8ez984gw7b", - "type": "image", - "created_time": "2025-05-22T10:37:59.890500Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "image": { - "type": "external", - "external": { - "url": "textcortex://images/img_5xmkjvbr229kaa4qqcz7nvghhy" - }, - "caption": [ - { - "type": "text", - "text": { - "content": "Image /page/8/Figure/18 description: The image shows four people in a row. Each person is separated by a white symbol that looks like an upside-down V with a line over it. The first person is an Asian man with short black hair and glasses. He is wearing a tan sweater and smiling. The second person is a man with brown hair and a blue and green plaid shirt. He is smiling slightly. The third person is a woman with long blonde hair and glasses. She is wearing a black shirt and smiling. The fourth person is a man with a beard and glasses. He is wearing a black turtleneck sweater and smiling." - }, - "annotations": {}, - "plain_text": "Image /page/8/Figure/18 description: The image shows four people in a row. Each person is separated by a white symbol that looks like an upside-down V with a line over it. The first person is an Asian man with short black hair and glasses. He is wearing a tan sweater and smiling. The second person is a man with brown hair and a blue and green plaid shirt. He is smiling slightly. The third person is a woman with long blonde hair and glasses. She is wearing a black shirt and smiling. The fourth person is a man with a beard and glasses. He is wearing a black turtleneck sweater and smiling." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz3eqf8mwa7vmhpg505", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890618Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "7 people covering backend, storage internals, UX, DevOps, C++20/24, design, developer experience, sales ..." - }, - "annotations": {}, - "plain_text": "7 people covering backend, storage internals, UX, DevOps, C++20/24, design, developer experience, sales ..." - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz4ej9sc0b535x34dks", - "type": "heading_2", - "created_time": "2025-05-22T10:37:59.890646Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Selected achievement's:" - }, - "annotations": {}, - "plain_text": "Selected achievement's:" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gzae1asrhdcqcxxpt5d", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890832Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": true, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [] - }, - "children": [ - { - "object": "block", - "id": "bk_01jvvs4gz5fcq8zbnb63fy6b1v", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890692Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Production-grade Kubernetes-native object storage with S3 API" - }, - "annotations": {}, - "plain_text": "Production-grade Kubernetes-native object storage with S3 API" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz6f7hvcf6d5v9zrx97", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890720Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "\u2013" - }, - "annotations": {}, - "plain_text": "\u2013" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz7fx49hd41syvykxrk", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890749Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Self-service developer experience with AWS Marketplace integration" - }, - "annotations": {}, - "plain_text": "Self-service developer experience with AWS Marketplace integration" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz8ekqv9426pa79sm18", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890776Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "SoC2 compliance, daily product benchmarking + CI/CD pipeline" - }, - "annotations": {}, - "plain_text": "SoC2 compliance, daily product benchmarking + CI/CD pipeline" - } - ] - } - }, - { - "object": "block", - "id": "bk_01jvvs4gz9f0ktzpwca6z1g9zh", - "type": "bulleted_list_item", - "created_time": "2025-05-22T10:37:59.890806Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Product validation with Startups + Enterprises like Bosch, Ericsson..." - }, - "annotations": {}, - "plain_text": "Product validation with Startups + Enterprises like Bosch, Ericsson..." - } - ] - } - } - ] - }, - { - "object": "block", - "id": "bk_01jvvs4gzbfq2tmy51bx7j63dj", - "type": "paragraph", - "created_time": "2025-05-22T10:37:59.890869Z", - "created_by": { - "object": "user", - "id": "bcf6c03e-51a1-4f05-97d8-d616405b42a2" - }, - "has_children": false, - "metadata": { - "origin": { - "file_id": "file_01jvvrtxv4fmnsqa2x1gmgc67e", - "page_num": 9 - } - }, - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "No team turnover since product launch." - }, - "annotations": {}, - "plain_text": "No team turnover since product launch." - } - ] - } - } - ] -} diff --git a/typescript/test-format.ts b/typescript/test-format.ts deleted file mode 100644 index cf977dc..0000000 --- a/typescript/test-format.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Test file for prettier formatting -const test = { a: 1, b: 2, c: 3, d: 4 }; -function badFormat(x: number, y: string) { - return x + y; -} -const another = { badly: "formatted" }; -export default test; From d1059d890632a94e2588d24ef9517b47d1044f03 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:21:50 +0200 Subject: [PATCH 5/9] Checkpoint --- .../2025-01-05-component-override-example.md | 99 ------- ...2025-01-05-component-overrides-complete.md | 257 ------------------ typescript/src/renderer/JsonDocRenderer.tsx | 9 +- .../src/renderer/components/BlockRenderer.tsx | 63 +++-- .../components/blocks/CodeBlockRenderer.tsx | 4 +- .../blocks/ColumnListBlockRenderer.tsx | 7 +- .../blocks/DividerBlockRenderer.tsx | 7 +- .../blocks/EquationBlockRenderer.tsx | 7 +- .../blocks/HeadingBlockRenderer.tsx | 7 +- .../components/blocks/ImageBlockRenderer.tsx | 4 +- .../blocks/ListItemBlockRenderer.tsx | 7 +- .../blocks/OrderedListBlockRenderer.tsx | 14 +- .../components/blocks/QuoteBlockRenderer.tsx | 4 +- .../components/blocks/TableBlockRenderer.tsx | 4 +- .../components/blocks/ToDoBlockRenderer.tsx | 4 +- .../components/blocks/ToggleBlockRenderer.tsx | 7 +- .../blocks/UnorderedListBlockRenderer.tsx | 14 +- 17 files changed, 107 insertions(+), 411 deletions(-) delete mode 100644 typescript/docs/2025-01-05-component-override-example.md delete mode 100644 typescript/docs/2025-01-05-component-overrides-complete.md diff --git a/typescript/docs/2025-01-05-component-override-example.md b/typescript/docs/2025-01-05-component-override-example.md deleted file mode 100644 index ec744bf..0000000 --- a/typescript/docs/2025-01-05-component-override-example.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: "Component Override Example for JSON-DOC TypeScript" -author: "Abreham and Claude Code" -date: "2025-01-05" ---- - -# Component Override Example - -This demonstrates how users can now override specific block components in the JSON-DOC renderer. - -## Usage Example - -```typescript -import { - JsonDocRenderer, - ParagraphBlockRenderer, - HeadingBlockRenderer -} from 'jsondoc/renderer'; - -// Example: Override paragraph with custom className -const CustomParagraph = (props) => ( - -); - -// Example: Override heading with wrapper div and custom styling -const CustomHeading = (props) => ( -
- -
-); - -// Usage - -``` - -## What This Enables - -1. **Custom Styling**: Users can add their own CSS classes and styles -2. **Wrapper Components**: Add additional markup around blocks -3. **Custom Logic**: Add click handlers, analytics, etc. -4. **Design System Integration**: Easy integration with Tailwind, styled-components, etc. -5. **Progressive Enhancement**: Override only what you need, keep defaults for the rest - -## Example with Tailwind CSS - -```typescript -const TailwindParagraph = (props) => ( - -); - -const TailwindHeading = (props) => ( - -); -``` - -## Example with Styled Components - -```typescript -const StyledParagraph = styled(ParagraphBlockRenderer)` - font-family: 'Inter', sans-serif; - line-height: 1.6; - color: ${props => props.theme.colors.text}; -`; - -const StyledHeading = styled(HeadingBlockRenderer)` - font-family: 'Playfair Display', serif; - color: ${props => props.theme.colors.primary}; - border-bottom: 2px solid ${props => props.theme.colors.accent}; -`; -``` - -## Benefits of This Approach - -- **Verbose but Explicit**: Clear what each override does -- **Type Safe**: Full TypeScript support for component props -- **React Standard**: Follows familiar React patterns -- **Composable**: Can wrap, extend, or completely replace components -- **Flexible**: Access to all HTML attributes via props spreading \ No newline at end of file diff --git a/typescript/docs/2025-01-05-component-overrides-complete.md b/typescript/docs/2025-01-05-component-overrides-complete.md deleted file mode 100644 index 25db66e..0000000 --- a/typescript/docs/2025-01-05-component-overrides-complete.md +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: "Complete Component Override System for JSON-DOC TypeScript" -author: "Abreham and Claude Code" -date: "2025-01-05" ---- - -# Complete Component Override System - -✅ **Implementation Complete!** All block components now support the react-markdown style component override pattern. - -## 🚀 Usage Examples - -### Basic Component Overrides - -```typescript -import { - JsonDocRenderer, - ParagraphBlockRenderer, - HeadingBlockRenderer, - CodeBlockRenderer, - QuoteBlockRenderer, - type BlockComponents -} from 'jsondoc/renderer'; - -// Custom paragraph with Tailwind styling -const CustomParagraph = (props) => ( - -); - -// Custom heading with icon and custom styling -const CustomHeading = (props) => ( -
- 📝 - console.log('Heading clicked:', props.block.id)} - /> -
-); - -// Custom code block with syntax highlighting -const CustomCodeBlock = (props) => ( -
-
- 💻 Code - -
- -
-); - -// Usage with multiple overrides - ( - - ) - }} -/> -``` - -## 🎨 Design System Integration - -### Tailwind CSS -```typescript -const tailwindComponents: BlockComponents = { - paragraph: (props) => ( - - ), - heading_1: (props) => ( - - ), - code: (props) => ( - - ), - quote: (props) => ( - - ), - to_do: (props) => ( - - ) -}; -``` - -### Styled Components -```typescript -import styled from 'styled-components'; - -const StyledParagraph = styled(ParagraphBlockRenderer)` - font-family: 'Georgia', serif; - line-height: 1.8; - color: ${props => props.theme.colors.text}; - margin-bottom: 1.5rem; -`; - -const StyledHeading = styled(HeadingBlockRenderer)` - font-family: 'Playfair Display', serif; - color: ${props => props.theme.colors.primary}; - border-bottom: 2px solid ${props => props.theme.colors.accent}; - padding-bottom: 0.5rem; - margin-bottom: 1rem; -`; - -const styledComponents: BlockComponents = { - paragraph: StyledParagraph, - heading_1: StyledHeading, - heading_2: StyledHeading, - heading_3: StyledHeading, -}; -``` - -## 🔧 All Supported Block Types - -Every block type supports component overrides: - -```typescript -type BlockComponents = { - // Text blocks - paragraph?: React.ComponentType<...>; - heading_1?: React.ComponentType<...>; - heading_2?: React.ComponentType<...>; - heading_3?: React.ComponentType<...>; - - // List blocks - bulleted_list_item?: React.ComponentType<...>; - numbered_list_item?: React.ComponentType<...>; - unordered_list?: React.ComponentType<...>; - ordered_list?: React.ComponentType<...>; - - // Media blocks - code?: React.ComponentType<...>; - image?: React.ComponentType<...>; - equation?: React.ComponentType<...>; - - // Layout blocks - table?: React.ComponentType<...>; - column_list?: React.ComponentType<...>; - - // Interactive blocks - quote?: React.ComponentType<...>; - divider?: React.ComponentType<...>; - to_do?: React.ComponentType<...>; - toggle?: React.ComponentType<...>; -}; -``` - -## 🌟 Advanced Use Cases - -### Analytics Integration -```typescript -const AnalyticsWrapper = ({ children, blockType, blockId }) => { - const trackBlockView = () => { - analytics.track('block_viewed', { blockType, blockId }); - }; - - useEffect(trackBlockView, []); - - return
{children}
; -}; - -const analyticsComponents: BlockComponents = { - heading_1: (props) => ( - - - - ), - code: (props) => ( - - - - ) -}; -``` - -### Dark Mode Support -```typescript -const DarkModeComponents: BlockComponents = { - paragraph: (props) => ( - - ), - code: (props) => ( - - ), - quote: (props) => ( - - ) -}; -``` - -## ✨ Features Accomplished - -✅ **All block types support component overrides** -✅ **Full React HTML attributes support** (className, style, onClick, etc.) -✅ **TypeScript type safety** with full prop typing -✅ **Recursive component propagation** - overrides apply to nested blocks -✅ **Individual component exports** for maximum flexibility -✅ **Zero breaking changes** - existing usage continues to work -✅ **React-markdown compatibility** - familiar API patterns - -## 🎯 Migration Path - -**Existing users:** No changes needed - everything works as before - -**New users wanting customization:** -1. Import the components you want to override -2. Create wrapper components with your styling -3. Pass them via the `components` prop - -**Advanced users:** -- Mix and match individual components -- Create design system integrations -- Build interactive enhancements -- Add analytics and tracking - -The implementation provides maximum flexibility while maintaining simplicity and performance! \ No newline at end of file diff --git a/typescript/src/renderer/JsonDocRenderer.tsx b/typescript/src/renderer/JsonDocRenderer.tsx index cd41968..9193f04 100644 --- a/typescript/src/renderer/JsonDocRenderer.tsx +++ b/typescript/src/renderer/JsonDocRenderer.tsx @@ -6,7 +6,7 @@ import "./styles.css"; interface JsonDocRendererProps { page: any; className?: string; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const JsonDocRenderer = ({ @@ -35,7 +35,12 @@ export const JsonDocRenderer = ({ {page.children && page.children.length > 0 && (
{page.children.map((block: any, index: number) => ( - + ))}
)} diff --git a/typescript/src/renderer/components/BlockRenderer.tsx b/typescript/src/renderer/components/BlockRenderer.tsx index dc0f6fd..b2d0317 100644 --- a/typescript/src/renderer/components/BlockRenderer.tsx +++ b/typescript/src/renderer/components/BlockRenderer.tsx @@ -17,23 +17,47 @@ import { OrderedListBlockRenderer } from "./blocks/OrderedListBlockRenderer"; // Component override types for all block types export type BlockComponents = { - paragraph?: React.ComponentType>; - heading_1?: React.ComponentType>; - heading_2?: React.ComponentType>; - heading_3?: React.ComponentType>; - bulleted_list_item?: React.ComponentType>; - numbered_list_item?: React.ComponentType>; - unordered_list?: React.ComponentType>; - ordered_list?: React.ComponentType>; + paragraph?: React.ComponentType< + React.ComponentProps + >; + heading_1?: React.ComponentType< + React.ComponentProps + >; + heading_2?: React.ComponentType< + React.ComponentProps + >; + heading_3?: React.ComponentType< + React.ComponentProps + >; + bulleted_list_item?: React.ComponentType< + React.ComponentProps + >; + numbered_list_item?: React.ComponentType< + React.ComponentProps + >; + unordered_list?: React.ComponentType< + React.ComponentProps + >; + ordered_list?: React.ComponentType< + React.ComponentProps + >; code?: React.ComponentType>; image?: React.ComponentType>; table?: React.ComponentType>; quote?: React.ComponentType>; - divider?: React.ComponentType>; + divider?: React.ComponentType< + React.ComponentProps + >; to_do?: React.ComponentType>; - toggle?: React.ComponentType>; - column_list?: React.ComponentType>; - equation?: React.ComponentType>; + toggle?: React.ComponentType< + React.ComponentProps + >; + column_list?: React.ComponentType< + React.ComponentProps + >; + equation?: React.ComponentType< + React.ComponentProps + >; }; interface BlockRendererProps { @@ -71,21 +95,25 @@ export const BlockRenderer: React.FC = ({ // List container blocks if (block?.type === "unordered_list") { - const UnorderedListComponent = components?.unordered_list || UnorderedListBlockRenderer; + const UnorderedListComponent = + components?.unordered_list || UnorderedListBlockRenderer; return ; } if (block?.type === "ordered_list") { - const OrderedListComponent = components?.ordered_list || OrderedListBlockRenderer; + const OrderedListComponent = + components?.ordered_list || OrderedListBlockRenderer; return ; } // List item blocks if (block?.type === "bulleted_list_item") { - const BulletedListItemComponent = components?.bulleted_list_item || ListItemBlockRenderer; + const BulletedListItemComponent = + components?.bulleted_list_item || ListItemBlockRenderer; return ; } if (block?.type === "numbered_list_item") { - const NumberedListItemComponent = components?.numbered_list_item || ListItemBlockRenderer; + const NumberedListItemComponent = + components?.numbered_list_item || ListItemBlockRenderer; return ; } @@ -133,7 +161,8 @@ export const BlockRenderer: React.FC = ({ // Column list and column blocks if (block?.type === "column_list") { - const ColumnListComponent = components?.column_list || ColumnListBlockRenderer; + const ColumnListComponent = + components?.column_list || ColumnListBlockRenderer; return ; } diff --git a/typescript/src/renderer/components/blocks/CodeBlockRenderer.tsx b/typescript/src/renderer/components/blocks/CodeBlockRenderer.tsx index 31f3aba..c0e6d50 100644 --- a/typescript/src/renderer/components/blocks/CodeBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/CodeBlockRenderer.tsx @@ -6,7 +6,7 @@ import { BlockRenderer } from "../BlockRenderer"; interface CodeBlockRendererProps extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const CodeBlockRenderer: React.FC = ({ @@ -21,7 +21,7 @@ export const CodeBlockRenderer: React.FC = ({ return (
diff --git a/typescript/src/renderer/components/blocks/ColumnListBlockRenderer.tsx b/typescript/src/renderer/components/blocks/ColumnListBlockRenderer.tsx index 8f48c1a..9373d19 100644 --- a/typescript/src/renderer/components/blocks/ColumnListBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/ColumnListBlockRenderer.tsx @@ -2,10 +2,11 @@ import React from "react"; import { BlockRenderer } from "../BlockRenderer"; -interface ColumnListBlockRendererProps extends React.HTMLAttributes { +interface ColumnListBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const ColumnListBlockRenderer: React.FC< @@ -14,7 +15,7 @@ export const ColumnListBlockRenderer: React.FC< return (
{ +interface DividerBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const DividerBlockRenderer: React.FC = ({ @@ -18,7 +19,7 @@ export const DividerBlockRenderer: React.FC = ({ return (
diff --git a/typescript/src/renderer/components/blocks/EquationBlockRenderer.tsx b/typescript/src/renderer/components/blocks/EquationBlockRenderer.tsx index 6bb5e00..8ad2c0a 100644 --- a/typescript/src/renderer/components/blocks/EquationBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/EquationBlockRenderer.tsx @@ -2,10 +2,11 @@ import React from "react"; import { BlockRenderer } from "../BlockRenderer"; -interface EquationBlockRendererProps extends React.HTMLAttributes { +interface EquationBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const EquationBlockRenderer: React.FC = ({ @@ -20,7 +21,7 @@ export const EquationBlockRenderer: React.FC = ({ return (
diff --git a/typescript/src/renderer/components/blocks/HeadingBlockRenderer.tsx b/typescript/src/renderer/components/blocks/HeadingBlockRenderer.tsx index ede394f..68da465 100644 --- a/typescript/src/renderer/components/blocks/HeadingBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/HeadingBlockRenderer.tsx @@ -3,11 +3,12 @@ import React from "react"; import { RichTextRenderer } from "../RichTextRenderer"; import { BlockRenderer } from "../BlockRenderer"; -interface HeadingBlockRendererProps extends React.HTMLAttributes { +interface HeadingBlockRendererProps + extends React.HTMLAttributes { block: any; level: 1 | 2 | 3; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const HeadingBlockRenderer: React.FC = ({ @@ -54,7 +55,7 @@ export const HeadingBlockRenderer: React.FC = ({ return (
{renderHeading()}
diff --git a/typescript/src/renderer/components/blocks/ImageBlockRenderer.tsx b/typescript/src/renderer/components/blocks/ImageBlockRenderer.tsx index f8d482b..08e24e2 100644 --- a/typescript/src/renderer/components/blocks/ImageBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/ImageBlockRenderer.tsx @@ -6,7 +6,7 @@ import { BlockRenderer } from "../BlockRenderer"; interface ImageBlockRendererProps extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const ImageBlockRenderer: React.FC = ({ @@ -32,7 +32,7 @@ export const ImageBlockRenderer: React.FC = ({ return (
diff --git a/typescript/src/renderer/components/blocks/ListItemBlockRenderer.tsx b/typescript/src/renderer/components/blocks/ListItemBlockRenderer.tsx index 900d390..7d73d34 100644 --- a/typescript/src/renderer/components/blocks/ListItemBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/ListItemBlockRenderer.tsx @@ -3,11 +3,12 @@ import React from "react"; import { RichTextRenderer } from "../RichTextRenderer"; import { BlockRenderer } from "../BlockRenderer"; -interface ListItemBlockRendererProps extends React.HTMLAttributes { +interface ListItemBlockRendererProps + extends React.HTMLAttributes { block: any; type: "bulleted" | "numbered"; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const ListItemBlockRenderer: React.FC = ({ @@ -29,7 +30,7 @@ export const ListItemBlockRenderer: React.FC = ({ return (
  • diff --git a/typescript/src/renderer/components/blocks/OrderedListBlockRenderer.tsx b/typescript/src/renderer/components/blocks/OrderedListBlockRenderer.tsx index ac8c08d..16b6002 100644 --- a/typescript/src/renderer/components/blocks/OrderedListBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/OrderedListBlockRenderer.tsx @@ -2,10 +2,11 @@ import React from "react"; import { BlockRenderer } from "../BlockRenderer"; -interface OrderedListBlockRendererProps extends React.HTMLAttributes { +interface OrderedListBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const OrderedListBlockRenderer: React.FC< @@ -14,13 +15,18 @@ export const OrderedListBlockRenderer: React.FC< return (
      {block.children && block.children.length > 0 && block.children.map((child: any, index: number) => ( - + ))}
    ); diff --git a/typescript/src/renderer/components/blocks/QuoteBlockRenderer.tsx b/typescript/src/renderer/components/blocks/QuoteBlockRenderer.tsx index 048bb4d..5a8cf2e 100644 --- a/typescript/src/renderer/components/blocks/QuoteBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/QuoteBlockRenderer.tsx @@ -6,7 +6,7 @@ import { BlockRenderer } from "../BlockRenderer"; interface QuoteBlockRendererProps extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const QuoteBlockRenderer: React.FC = ({ @@ -21,7 +21,7 @@ export const QuoteBlockRenderer: React.FC = ({ return (
    diff --git a/typescript/src/renderer/components/blocks/TableBlockRenderer.tsx b/typescript/src/renderer/components/blocks/TableBlockRenderer.tsx index cb862dd..14d85fc 100644 --- a/typescript/src/renderer/components/blocks/TableBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/TableBlockRenderer.tsx @@ -6,7 +6,7 @@ import { BlockRenderer } from "../BlockRenderer"; interface TableBlockRendererProps extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const TableBlockRenderer: React.FC = ({ @@ -21,7 +21,7 @@ export const TableBlockRenderer: React.FC = ({ return (
    diff --git a/typescript/src/renderer/components/blocks/ToDoBlockRenderer.tsx b/typescript/src/renderer/components/blocks/ToDoBlockRenderer.tsx index 7aaafe5..dfcb356 100644 --- a/typescript/src/renderer/components/blocks/ToDoBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/ToDoBlockRenderer.tsx @@ -6,7 +6,7 @@ import { BlockRenderer } from "../BlockRenderer"; interface ToDoBlockRendererProps extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const ToDoBlockRenderer: React.FC = ({ @@ -22,7 +22,7 @@ export const ToDoBlockRenderer: React.FC = ({ return (
    diff --git a/typescript/src/renderer/components/blocks/ToggleBlockRenderer.tsx b/typescript/src/renderer/components/blocks/ToggleBlockRenderer.tsx index 46f415c..6721f16 100644 --- a/typescript/src/renderer/components/blocks/ToggleBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/ToggleBlockRenderer.tsx @@ -3,10 +3,11 @@ import React, { useState } from "react"; import { RichTextRenderer } from "../RichTextRenderer"; import { BlockRenderer } from "../BlockRenderer"; -interface ToggleBlockRendererProps extends React.HTMLAttributes { +interface ToggleBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const ToggleBlockRenderer: React.FC = ({ @@ -26,7 +27,7 @@ export const ToggleBlockRenderer: React.FC = ({ return (
    diff --git a/typescript/src/renderer/components/blocks/UnorderedListBlockRenderer.tsx b/typescript/src/renderer/components/blocks/UnorderedListBlockRenderer.tsx index 077fb65..1f2dd0d 100644 --- a/typescript/src/renderer/components/blocks/UnorderedListBlockRenderer.tsx +++ b/typescript/src/renderer/components/blocks/UnorderedListBlockRenderer.tsx @@ -2,10 +2,11 @@ import React from "react"; import { BlockRenderer } from "../BlockRenderer"; -interface UnorderedListBlockRendererProps extends React.HTMLAttributes { +interface UnorderedListBlockRendererProps + extends React.HTMLAttributes { block: any; depth?: number; - components?: React.ComponentProps['components']; + components?: React.ComponentProps["components"]; } export const UnorderedListBlockRenderer: React.FC< @@ -14,13 +15,18 @@ export const UnorderedListBlockRenderer: React.FC< return (
      {block.children && block.children.length > 0 && block.children.map((child: any, index: number) => ( - + ))}
    ); From eee5429be4b30b2eb6eaab68c7523bebd68f7902 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:23:10 +0200 Subject: [PATCH 6/9] Checkpoint --- docs/2025-06-05-component-override-example.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/2025-06-05-component-override-example.md diff --git a/docs/2025-06-05-component-override-example.md b/docs/2025-06-05-component-override-example.md new file mode 100644 index 0000000..4228641 --- /dev/null +++ b/docs/2025-06-05-component-override-example.md @@ -0,0 +1,99 @@ +--- +title: "Component Override Example for JSON-DOC TypeScript" +author: "Abreham and Claude Code" +date: "2025-01-05" +--- + +# Component Override Example + +This demonstrates how users can now override specific block components in the JSON-DOC renderer. + +## Usage Example + +```typescript +import { + JsonDocRenderer, + ParagraphBlockRenderer, + HeadingBlockRenderer +} from 'jsondoc/renderer'; + +// Example: Override paragraph with custom className +const CustomParagraph = (props) => ( + +); + +// Example: Override heading with wrapper div and custom styling +const CustomHeading = (props) => ( +
    + +
    +); + +// Usage + +``` + +## What This Enables + +1. **Custom Styling**: Users can add their own CSS classes and styles +2. **Wrapper Components**: Add additional markup around blocks +3. **Custom Logic**: Add click handlers, analytics, etc. +4. **Design System Integration**: Easy integration with Tailwind, styled-components, etc. +5. **Progressive Enhancement**: Override only what you need, keep defaults for the rest + +## Example with Tailwind CSS + +```typescript +const TailwindParagraph = (props) => ( + +); + +const TailwindHeading = (props) => ( + +); +``` + +## Example with Styled Components + +```typescript +const StyledParagraph = styled(ParagraphBlockRenderer)` + font-family: "Inter", sans-serif; + line-height: 1.6; + color: ${(props) => props.theme.colors.text}; +`; + +const StyledHeading = styled(HeadingBlockRenderer)` + font-family: "Playfair Display", serif; + color: ${(props) => props.theme.colors.primary}; + border-bottom: 2px solid ${(props) => props.theme.colors.accent}; +`; +``` + +## Benefits of This Approach + +- **Verbose but Explicit**: Clear what each override does +- **Type Safe**: Full TypeScript support for component props +- **React Standard**: Follows familiar React patterns +- **Composable**: Can wrap, extend, or completely replace components +- **Flexible**: Access to all HTML attributes via props spreading From 72749137f3de294e7a72257a3d9ceb9e2221d7e0 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:29:01 +0200 Subject: [PATCH 7/9] Checkpoint --- typescript/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/package.json b/typescript/package.json index 7a5b32c..5965f8c 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -1,6 +1,6 @@ { - "name": "jsondoc", - "version": "0.1.0", + "name": "@textcortex/jsondoc", + "version": "0.1.0-alpha.0", "description": "JSON-DOC TypeScript implementation", "main": "dist/index.js", "module": "dist/index.mjs", From db0458c011fc676f4743cde8177de4dbbad37360 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:30:31 +0200 Subject: [PATCH 8/9] Checkpoint --- typescript/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/package.json b/typescript/package.json index 5965f8c..239df14 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@textcortex/jsondoc", - "version": "0.1.0-alpha.0", + "version": "0.1.0", "description": "JSON-DOC TypeScript implementation", "main": "dist/index.js", "module": "dist/index.mjs", From 1c207636244fdcc15c5185b5524c7d1580d45f65 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:37:36 +0200 Subject: [PATCH 9/9] Checkpoint --- CLAUDE.md | 8 ++++---- docs/typescript-implementation.md | 2 +- typescript/.github/workflows/build.yml | 14 +++++++------- typescript/.github/workflows/publish.yml | 10 ++++++---- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 512531f..abf8371 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,7 +16,7 @@ The project consists of: - `/schema/`: JSON schemas defining the structure of JSON-DOC files - `/python/`: Python implementation -- `/ts/`: TypeScript implementation (in progress) +- `/typescript/`: TypeScript implementation - `/docs/`: Documentation - `/examples/`: Example files showing the format - `/tests/`: Tests for both implementations @@ -53,15 +53,15 @@ ruff format . ```bash # Set up development environment -cd /Users/onur/tc/JSON-DOC/ts +cd /Users/onur/tc/JSON-DOC/typescript npm install # Build TypeScript -cd /Users/onur/tc/JSON-DOC/ts +cd /Users/onur/tc/JSON-DOC/typescript npm run build # Run tests -cd /Users/onur/tc/JSON-DOC/ts +cd /Users/onur/tc/JSON-DOC/typescript npm test ``` diff --git a/docs/typescript-implementation.md b/docs/typescript-implementation.md index 2206bbd..e7bd06e 100644 --- a/docs/typescript-implementation.md +++ b/docs/typescript-implementation.md @@ -131,4 +131,4 @@ While we strive to keep the API similar between the Python and TypeScript implem ## Development -If you want to contribute to the TypeScript implementation, see the [README.md](../ts/README.md) file in the `ts` directory for development instructions. \ No newline at end of file +If you want to contribute to the TypeScript implementation, see the [README.md](../typescript/README.md) file in the `typescript` directory for development instructions. \ No newline at end of file diff --git a/typescript/.github/workflows/build.yml b/typescript/.github/workflows/build.yml index 8a3d372..19ca323 100644 --- a/typescript/.github/workflows/build.yml +++ b/typescript/.github/workflows/build.yml @@ -4,31 +4,31 @@ on: push: branches: [main] paths: - - "ts/**" + - "typescript/**" pull_request: branches: [main] paths: - - "ts/**" + - "typescript/**" jobs: build: runs-on: ubuntu-latest defaults: run: - working-directory: ./ts + working-directory: ./typescript strategy: matrix: - node-version: [16.x, 18.x, 20.x] + node-version: [18.x, 20.x, 22.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: "npm" - cache-dependency-path: ./ts/package-lock.json + cache-dependency-path: ./typescript/package-lock.json - name: Install dependencies run: npm ci diff --git a/typescript/.github/workflows/publish.yml b/typescript/.github/workflows/publish.yml index 69e4793..0cb4d24 100644 --- a/typescript/.github/workflows/publish.yml +++ b/typescript/.github/workflows/publish.yml @@ -9,14 +9,16 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./ts + working-directory: ./typescript steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: "16.x" + node-version: "20.x" registry-url: "https://registry.npmjs.org" + cache: "npm" + cache-dependency-path: ./typescript/package-lock.json - name: Install dependencies run: npm ci