Skip to content

Repository files navigation

What Ships

2,159 curated startup launch videos from X — every launch film, demo, and walkthrough archived with a stable URL, a poster frame, and a citation link back to the original post. New videos ship daily.

Live site Deploy Last commit License: MIT

whatships.com · Browse videos · Studios · Tools · Submit a video

Claude launch video poster
Claude
Railway Sandboxes launch video poster
Railway Sandboxes
Reception launch video poster
Reception
Framer Agent launch video poster
Framer Agent
Gemini 3.8 Live launch video poster
Gemini 3.8 Live
Pencil launch video poster
Pencil

What is What Ships?

A curated, independent archive of how products announce themselves: launch films, first-look demos, and walkthroughs posted on X. Founders, designers, and marketers use it to study launch craft after the timeline has moved on. Nothing is ranked, placement is not sold, every entry is human-reviewed — and every page cites the original X post.

Categories: AI · Developer tools · Design · Motion · Productivity · Consumer · Hardware

For agents and LLMs

Every page is machine-readable without scraping: send Accept: text/markdown to any HTML URL, or use the structured surfaces — /llms.txt, /llms-full.txt, /openapi.json, /search-index.json, /sitemap.xml.

If you find a launch worth remembering, star the repo — the catalog grows daily.


The rest of this README is contributor documentation.

Local development

pnpm install
pnpm dev

Open http://localhost:4321.

Scripts

Command Description
pnpm dev Start the Astro dev server
pnpm build Production static build
pnpm deploy Build, strip local streams, and deploy to Cloudflare Workers
pnpm preview Preview the production build
pnpm check Astro + TypeScript check
pnpm test:run Unit tests (Vitest)
pnpm posters:capture Download amplify MP4s and extract 1440w + 960w posters (streams are no longer generated)
pnpm discovery:dry-run Scan X watchlist (needs X_BEARER_TOKEN) and print candidates without filing issues
pnpm discovery:fixture Run discovery against the sample fixture (no API key)
pnpm discovery:seed-inbox Seed src/data/inbox.json from the fixture (for /admin demos)
pnpm discovery -- --publish --email Create GitHub issues, update inbox, optional Resend digest
pnpm inbox:apply Merge approved inbox drafts into videos.json

Deployment

Every push to main triggers .github/workflows/deploy.yml: build → strip dist/streamswrangler deploy to Cloudflare Workers static assets, served on whatships.com and www.whatships.com.

In-site playback goes through a self-hosted video proxy (workers/video-proxy) at proxy.whatships.com: X's CDN rejects any non-Twitter Referer, so the Worker relays the original video.twimg.com media Referer-less. Local /streams/{slug}.mp4 files are a dev-only fallback and stay out of git.

Required secrets / env:

Secret / env Where Purpose
CLOUDFLARE_API_TOKEN GitHub Actions secret wrangler deploy
PUBLIC_VIDEO_PROXY_BASE Build env Playback proxy base URL inlined into the bundle

Adding curated videos

Edit src/data/videos.json. Each published entry needs:

  • stable slug and id
  • product/company metadata
  • category from the allowed list in src/lib/catalog.ts
  • tweetUrl / tweetId for the original X post
  • videoUrl (amplify MP4) — used for poster capture and proxied playback
  • poster path under public/posters/
  • status: "published" (drafts stay offline)

After adding a videoUrl, capture the poster:

pnpm posters:capture -- --slug=your-slug --force

Detail pages play the video in-site through the proxy (click-to-play; no autoplay on load) and always link out to the original X post.

Submissions

Open /submit/ to propose a launch video, tool, studio, or designer. Choose a type, fill the matching fields, and the form opens a prefilled GitHub issue on dingyi/whatships.com for editorial review. Approved entries are merged into the matching catalog file (videos.json, tools.json, or studios.json).

Weekly discovery (admin review + email)

plv scans a curated X watchlist every week for product-launch / demo videos, then stages matches in src/data/inbox.json for review at local /admin (pnpm dev only — not deployed). Optional: GitHub Issues (label discovery) + Resend email digests. Nothing is published without you.

flowchart LR
  W[watchlist.json] --> J[GitHub Action weekly]
  J --> X[X API timelines]
  X --> F[filter: video + launch signals]
  F --> Q[inbox.json]
  F --> I[optional Issues]
  F --> E[optional email]
  Q --> A["local /admin review"]
  A --> V[videos.json via inbox:apply]
Loading

Local /admin review UI

The review queue is injected only by astro dev. Production builds do not emit /admin or the inbox client bundle.

  1. Run pnpm dev and open http://localhost:4321/admin/.
  2. Optional: set ADMIN_PASSWORD in .env to gate the local UI. With no password, dev is open-access.
  3. Edit metadata, Approve or Reject.
  4. Download inbox.json and replace src/data/inbox.json (or rely on the weekly Action commit).
  5. Run:
pnpm inbox:apply
pnpm posters:capture

Local decisions are also cached in the browser (localStorage) so you can continue mid-review.

Optional GitHub Issues

Issues with label discovery still work as a parallel queue if you use --publish without --skip-issues.

Configure secrets (GitHub Actions)

Repo → Settings → Secrets and variables → Actions:

Secret / env Required Purpose
X_BEARER_TOKEN Yes for live discovery X API v2 bearer with read access to user lookup + timelines
RESEND_API_KEY For email Resend API key
NOTIFY_EMAIL For email Your inbox (comma-separated for multiple)
DISCOVERY_FROM_EMAIL For email Verified Resend sender, e.g. plv@yourdomain.com

GITHUB_TOKEN is provided automatically (issues + committing inbox.json).

Note on X API cost: Timeline reads need a paid X API plan (free tiers generally cannot read other users’ posts). Without X_BEARER_TOKEN, the scheduled workflow fails closed rather than scraping unofficially.

Edit the watchlist

Curate accounts in src/data/watchlist.json:

{
  "handle": "cursor_ai",
  "company": "Cursor",
  "category": "developer-tools",
  "tags": ["ide", "agents"]
}

Local commands

# Offline: seed admin inbox from fixture
pnpm discovery:seed-inbox
ADMIN_PASSWORD='your-secret' pnpm dev
# open http://localhost:4321/admin/

# Live dry-run (no issues / no commit)
export X_BEARER_TOKEN=...
pnpm discovery:dry-run

# Publish: inbox + optional issues + email
export GITHUB_TOKEN=...
export GITHUB_REPOSITORY=dingyi/whatships.com
export RESEND_API_KEY=...
export NOTIFY_EMAIL=you@example.com
export DISCOVERY_FROM_EMAIL=plv@yourdomain.com
pnpm discovery -- --publish --email

# After approving in local /admin (and saving inbox.json):
pnpm inbox:apply
pnpm posters:capture

The workflow .github/workflows/weekly-discovery.yml runs Mondays 15:00 UTC, updates src/data/inbox.json, and can open Issues + email. Start it manually from the Actions tab when needed.

If you skip Resend, enable GitHub notification emails and/or review the inbox locally with pnpm dev after each run.

Stack

  • Astro (static output)
  • React 19 islands
  • Tailwind CSS 4
  • shadcn + Base UI
  • Vitest

License

MIT for original source code and documentation. Product names, trademarks, and third-party video content remain the property of their respective owners.

About

Product Launch Videos — curated product launch films from X/Twitter

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages