Skip to content
This repository was archived by the owner on Oct 24, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,11 @@ Developer & Agent Interfaces:
pageSeparator: llmsPageSeparator,
// Strip heading anchor links from llms-full.txt and llms-small.txt
// (see src/utils/heading-anchor.ts).
customSelectors: { all: [HEADING_ANCHOR_LINK_SELECTOR] },
customSelectors: {
all: [HEADING_ANCHOR_LINK_SELECTOR],
// Video links are no use in the minified bundle.
small: ['.demo-video'],
},
// `exclude` only affects `llms-small.txt`, and `demote` lines
// unlisted pages up for `stripUnlistedFromLlmsFull`.
exclude: [...unlistedPages],
Expand Down
4 changes: 4 additions & 0 deletions public/_headers
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,7 @@
/humans.txt
Content-Type: text/plain; charset=utf-8
Access-Control-Allow-Origin: *

# Demo videos and their posters. Cached for a week, so a re-export shows up within that.
/videos/*
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Cache-Control: public, max-age=604800
5 changes: 5 additions & 0 deletions public/_routes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"version": 1,
"include": ["/*"],
"exclude": ["/videos/*"]
}
Binary file added public/videos/create-api-key.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/create-api-key.mp4
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Binary file not shown.
Binary file added public/videos/create-flutter-project.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/create-flutter-project.mp4
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Binary file not shown.
Binary file added public/videos/create-release.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/create-release.mp4
Binary file not shown.
Binary file added public/videos/delete-release.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/delete-release.mp4
Binary file not shown.
Binary file added public/videos/getting-started.jpg
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/getting-started.mp4
Binary file not shown.
Binary file added public/videos/initialize-shorebird.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/initialize-shorebird.mp4
Binary file not shown.
Binary file added public/videos/manage-org-collaborators.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/manage-org-collaborators.mp4
Binary file not shown.
Binary file added public/videos/rollback-patch.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/rollback-patch.mp4
Binary file not shown.
Binary file added public/videos/send-ota-update.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/send-ota-update.mp4
Binary file not shown.
Binary file added public/videos/staging-patch.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/staging-patch.mp4
Binary file not shown.
Binary file added public/videos/update-billing-contact.jpg
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/update-billing-contact.mp4
Binary file not shown.
Binary file added public/videos/view-releases.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/videos/view-releases.mp4
Binary file not shown.
37 changes: 0 additions & 37 deletions src/components/ArcadeEmbed.astro

This file was deleted.

74 changes: 74 additions & 0 deletions src/components/DemoVideo.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
import { existsSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { publicDir } from 'astro:config/server';
import sharp from 'sharp';

interface Props {
/** File name (without extension) of the video in `public/videos/`. */
name: string;
title: string;
}

const { name, title } = Astro.props;

// Keep `name` URL-safe so the file checked below is the one that's served.
if (!/^[a-z0-9-]+$/.test(name)) {
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
throw new Error(`DemoVideo: name "${name}" must be lowercase kebab-case`);
}

const src = `/videos/${name}.mp4`;
const poster = `/videos/${name}.jpg`;

const fileIn = (file: string) => new URL(`.${file}`, publicDir);
Comment thread
AbhishekDoshi26 marked this conversation as resolved.

// Fail the build on a missing video or poster instead of shipping a player
// that 404s.
for (const file of [src, poster]) {
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
if (!existsSync(fileIn(file))) {
throw new Error(`DemoVideo: public${file} does not exist`);
}
}

// The poster is a frame of the video, so its size reserves the right box
// before anything loads and the page doesn't jump.
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
const { width, height } = await sharp(
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
fileURLToPath(fileIn(poster)),
).metadata();
---

Comment thread
AbhishekDoshi26 marked this conversation as resolved.
<figure class="demo-video">
<video
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
controls
playsinline
preload="none"
poster={poster}
width={width}
height={height}
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
aria-label={title}
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
data-mdast="ignore"
>
<source src={src} type="video/mp4" />
</video>
<figcaption><a href={src}>Watch the video: {title}</a></figcaption>
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
Comment thread
AbhishekDoshi26 marked this conversation as resolved.
</figure>

<style>
.demo-video {
margin-inline: 0;
}

.demo-video video {
display: block;
width: 100%;
height: auto;
border-radius: 0.5rem;
border: 1px solid var(--sl-color-gray-5);
background-color: var(--sl-color-black);
}

.demo-video figcaption {
margin-top: 0.5rem;
font-size: var(--sl-text-sm);
}
</style>
7 changes: 2 additions & 5 deletions src/content/docs/account/api-keys.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ sidebar:
order: 4
---

import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

API keys let you authenticate with Shorebird from CI systems and other automated
environments. You can create, view, and revoke API keys from the
Expand All @@ -19,10 +19,7 @@ allows.

## Creating an API key

<ArcadeEmbed
src="https://demo.arcade.software/TQUMnX2QwuCRzEV1e8kN?embed&embed_mobile=tab&embed_desktop=inline&show_copy_link=true"
title="Create Shorebird API Key"
/>
<DemoVideo name="create-api-key" title="Create a Shorebird API key" />

1. Open **Account → API Keys** in the console.
2. Click **Create API Key**.
Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/account/billing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar:
---

import { Image } from 'astro:assets';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';
import viewBillingPortal from '~/assets/view_billing_portal.png';
import accountMonthlySpendingLimit from '~/assets/account_monthly_spending_limit.png';
import setSpendingLimitDialog from '~/assets/set_spending_limit_dialog.png';
Expand All @@ -32,10 +32,7 @@ same, but you can change them to be different.
If you'd like invoices sent to a different email address than the one you use to
log in, you can change this in Stripe:

<ArcadeEmbed
src="https://app.arcade.software/share/7dMbiP2AbiyF2HzWgjd2"
title="Edit Billing Email"
/>
<DemoVideo name="update-billing-contact" title="Edit the billing email" />

1. Navigate to your "Account" panel within Shorebird.
2. Click on the drop-down menu on the right side.
Expand Down
8 changes: 4 additions & 4 deletions src/content/docs/account/orgs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar:
---

import { Image } from 'astro:assets';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';
import addMemberToOrg from '~/assets/add_member_to_org.png';
import completedAddMemberToOrg from '~/assets/completed_add_member_to_org.png';
import transferAppToDifferentOrg from '~/assets/transfer_app_to_different_org.png';
Expand Down Expand Up @@ -83,9 +83,9 @@ You can also transfer an app from the command line with

### Add a member

<ArcadeEmbed
src="https://app.arcade.software/share/Cl6LTDv4A3TKhJJOdJse"
title="Adding Members to the Organization"
<DemoVideo
name="manage-org-collaborators"
title="Add members to an organization"
/>

To add one or more members to your organization, visit the organization's
Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/code-push/ci/_authentication.mdx
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

Most Shorebird functionality, like creating releases and patches, requires
authentication. To authenticate in your CI, create an API key from the
[Shorebird Console](https://console.shorebird.dev):

<ArcadeEmbed
src="https://demo.arcade.software/TQUMnX2QwuCRzEV1e8kN?embed&embed_mobile=tab&embed_desktop=inline&show_copy_link=true"
title="Create Shorebird API Key"
/>
<DemoVideo name="create-api-key" title="Create a Shorebird API key" />

1. Go to **Account → API Keys**.
2. Click **Create API Key**.
Expand Down
8 changes: 4 additions & 4 deletions src/content/docs/code-push/create.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar:
order: 2
---

import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

:::note

Expand All @@ -21,9 +21,9 @@ To create a new Flutter project with Shorebird, use `shorebird create`:
shorebird create my_app
```

<ArcadeEmbed
src="https://app.arcade.software/share/iw81avmZ8dfoqfNzQN2P"
title="Create a new flutter project with Shorebird"
<DemoVideo
name="create-flutter-project"
title="Create a Flutter project with Shorebird"
/>

This does several things:
Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/code-push/guides/staging-patches.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ import { CodeTabs, LinkCard } from 'starlight-theme-nova/components';
import { Image } from 'astro:assets';
import goLive from '~/assets/staging_patches_change_track_dropdown.png';
import switchTrack from '~/assets/staging_patches_patch_context_menu.png';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

<ArcadeEmbed
src="https://app.arcade.software/share/n22dgnzUR0qwvjNciQ2i"
title="Pushing a patch to staging track"
/>
<DemoVideo name="staging-patch" title="Push a patch to the staging track" />

This guide will walk you through how to validate a patch in Shorebird's staging
environment before promoting the patch to production.
Expand Down
8 changes: 4 additions & 4 deletions src/content/docs/code-push/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ sidebar:
order: 1
---

import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

For a quick overview, check out the demo below.

<ArcadeEmbed
src="https://demo.arcade.software/x5ifkvJ8yFZh63hYJF0g?embed&embed_mobile=tab&embed_desktop=inline&show_copy_link=true"
title="Send over the air updates to Flutter app"
<DemoVideo
name="send-ota-update"
title="Send over-the-air updates to a Flutter app"
/>

## What is Code Push?
Expand Down
8 changes: 4 additions & 4 deletions src/content/docs/code-push/initialize.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ sidebar:
---

import { LinkCard } from 'starlight-theme-nova/components';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

:::note

Expand All @@ -17,9 +17,9 @@ Shorebird.

:::

<ArcadeEmbed
src="https://app.arcade.software/share/5w5LiD8ODdaGhb6554X9"
title="Initializing Shorebird in an existing Flutter project"
<DemoVideo
name="initialize-shorebird"
title="Initialize Shorebird in an existing Flutter project"
/>

To configure an existing Flutter project to use Shorebird, use `shorebird init`
Expand Down
18 changes: 6 additions & 12 deletions src/content/docs/code-push/release.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,15 @@ sidebar:
{/* cspell:words armeabi abiFilters v7a */}

import { Tabs, TabItem } from '@astrojs/starlight/components';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';
import { LinkCard } from 'starlight-theme-nova/components';
import { Image } from 'astro:assets';
import releaseDeleteDialog from '~/assets/release_delete_dialog.png';
import listReleases from '~/assets/list_releases.png';

In order to start pushing updates, you will need to create a release.

<ArcadeEmbed
src="https://app.arcade.software/share/h8ywz1NWeFq3dC2iRQBU"
title="Create a Release"
/>
<DemoVideo name="create-release" title="Create a release" />

`shorebird release` is a drop-in replacement for `flutter build`. It builds your
app and uploads the compiled Dart artifacts to Shorebird's servers as a baseline
Expand Down Expand Up @@ -488,9 +485,9 @@ you can manage your app's releases directly from the command line using the

### List releases

<ArcadeEmbed
src="https://app.arcade.software/share/CtBj7r9AA5Xm0p0tIJYX"
title="Viewing releases from CLI and console"
<DemoVideo
name="view-releases"
title="View releases from the CLI and console"
/>

#### Via the Shorebird CLI
Expand Down Expand Up @@ -546,10 +543,7 @@ afterwards, use `--target-platform` as described in

### Delete releases

<ArcadeEmbed
src="https://app.arcade.software/share/1eUps58NpU5sFkTxljGu"
title="Delete a Release"
/>
<DemoVideo name="delete-release" title="Delete a release" />

:::caution[Deleting a release is permanent]

Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/code-push/rollback.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ sidebar:

import { LinkCard } from 'starlight-theme-nova/components';
import { Image } from 'astro:assets';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';
import rollbackButton from '~/assets/rollback_button.png';
import rollbackPatch2Active from '~/assets/rollback_patch2_active.png';
import rollbackPatch2RolledBack from '~/assets/rollback_patch2_rolled_back.png';
Expand Down Expand Up @@ -46,10 +46,7 @@ Roll back requires a minimum Flutter version of 3.27.4.

:::

<ArcadeEmbed
src="https://app.arcade.software/share/GlHfzbxcicw61ux4NCHx"
title="Roll Back a Patch"
/>
<DemoVideo name="rollback-patch" title="Roll back a patch" />

## Active and superseded patches

Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/code-push/tracks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ sidebar:
---

import { CodeTabs, LinkCard } from 'starlight-theme-nova/components';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

**Tracks** are named deployment channels that control which devices receive a
patch. Every Shorebird app has a built-in `stable` track, which is the default
Expand Down Expand Up @@ -62,10 +62,7 @@ built-in names, so those tracks can't be deleted.

## Publishing a patch to a track

<ArcadeEmbed
src="https://app.arcade.software/share/n22dgnzUR0qwvjNciQ2i"
title="Pushing a patch to staging track"
/>
<DemoVideo name="staging-patch" title="Push a patch to the staging track" />

Pass the `--track` flag to any `shorebird patch` command. If you omit the flag,
the patch is published to `stable` by default. With Shorebird 1.6.130 or newer,
Expand Down
7 changes: 2 additions & 5 deletions src/content/docs/getting-started/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@ import {
LinkCard,
} from 'starlight-theme-nova/components';
import { Steps, Tabs, TabItem } from '@astrojs/starlight/components';
import ArcadeEmbed from '~/components/ArcadeEmbed.astro';
import DemoVideo from '~/components/DemoVideo.astro';

<ArcadeEmbed
src="https://app.arcade.software/share/rwhPDRat2tGYHouo8cO6"
title="Getting Started with Shorebird"
/>
<DemoVideo name="getting-started" title="Get started with Shorebird" />

This guide walks you through installing Shorebird and integrating it into your
Flutter app.
Expand Down
Loading