R2Shot π¬
Capture a screenshot, upload it to R2, and have a shareable link on your clipboard.
In action



Project goal
Capture visible or vertically stitched web pages, upload them to your own R2 bucket, and copy a public image link for sharing.
Tech stack
- TypeScript β Extension logic
- React β Capture and settings interface
- Tailwind CSS β Interface styles
- Vite β Extension bundling
- Chrome Manifest V3 β Browser extension APIs and background worker
- AWS SDK β S3 uploads and connection checks
- Cloudflare R2 β Screenshot storage
Brand & assets
For agents
Read the integration guide
# R2Shot β project and identity
Page: https://hexly.ai/projects/r2shot
Integrate R2Shot using the Hexly single-project identity API.
GET https://hexly.ai/api/projects/nocoo/r2shot
No authentication. Public CORS. Request exactly one GitHub owner/repository pair; include the owner in the path and preserve repository dots and hyphens. Owner and repository names are case-insensitive. Current projects belong to nocoo; never assume that owner for future integrations. No list, batch, search or query parameters. Do not fetch the full catalogue.
Example:
const response = await fetch("https://hexly.ai/api/projects/nocoo/r2shot");
if (!response.ok) throw new Error(`Hexly API HTTP ${response.status}`);
const project = await response.json();
const title = project.title;
const description = project.description.en;
const github = project.github;
const icon = project.icons.small;
Expect a single JSON object: schemaVersion (1), id (Hexly slug), owner (GitHub user or organization), repo (GitHub repository name), title, description {en, zh}, emoji, category, archived, github, website (string or null), url (Hexly detail page), icons {small, large}, logos[], and brand {manifest, iconManifest, source, originalSha256}. Use owner/repo together as the integration key. Small/large icons are 64/512px. Each logo has id, url, width, height, format, background, role, usage and theme. URLs are absolute HTTPS CDN URLs; use the returned URLs unchanged and preserve aspect ratio with object-fit: contain. Use textContent or framework text bindings for text, not innerHTML.
Logo selection:
- Prefer icons.small for a 24β32px header/sidebar and icons.large for a larger project card. Active Hexly entries use the approved textured presentation: original family foreground colors and composition over a pale texture, with continuous corners already rendered. Do not add a CSS mask, tile or shadow. The manifest is brand.iconManifest when available; it records native dimensions, resampling and original source hashes.
- When an original transparent mark is explicitly required, select role="project-identity", background="transparent", usage="navigation". Prefer a PNG matching the required resolution (16/32px favicon; roughly 2x CSS size for high-DPI UI). Do not add a background tile, mask, shadow, crop or recolor the mark.
- Opaque presentation variants are intended for README artwork and platform icon masters. The ios-app-icon variant is an opaque 1024px square; iOS applies its own mask. Use usage="apple-touch-icon" for touch bookmarks. Rounded presentation variants have transparent corners with an opaque textured interior; they are not transparent foreground marks.
- role="hexly-campaign" is separately labelled artwork for Hexly-related presentation. It does not authorize replacing the product's own Logo, favicon, colors or UI. Check brand.manifest and its license/provenance before adopting campaign materials.
- background="original" preserves the source background; transparency is not guaranteed. Some projects only have original/emoji assets. Missing variants are unavailable: do not fabricate URLs or claim transparency. Use icons.small/large as supplied when no suitable transparent identity exists.
- Keep original geometry, colors, bytes, licenses and provenance. brand.originalSha256 verifies the original logo only, not its derivatives. Do not regenerate or upload new logos for this integration.
Cache successful metadata for at most one hour. Edge responses also cache for one hour; previously cached metadata may remain visible for up to one hour after deployment. Do not cache failures as project data. A 404 means unknown repository; 400 means invalid request; 405 means unsupported method; 503 means temporarily unavailable. Handle network failures, nullable website and archived projects explicitly. An entry is not proof of service health. No polling or credentials are needed.
Verify the integrated title, en description, GitHub destination, logo aspect ratio, light/dark contrast, mobile layout and failure state. Fetch current metadata rather than copying the preview as permanent configuration.
Capture a screenshot, upload it to R2, and have a shareable link on your clipboard.
Project ID: r2shot. Catalogue state: active. This is not a product release or health assertion.
Repository: https://github.com/nocoo/r2shot
Install from Chrome Web Store: https://chromewebstore.google.com/detail/r2shot/chhcpjnlcbomogddjockcpjjpiijogha
Original project identity: https://h.no.mt/projects/r2shot/identity/v1.0.0/r2shot-17e2f07d03a8.png
Original SHA-256: 17e2f07d03a8de29731fbb9fc0e91ea3182de24a46b2b3af79a8b73e4ac94ec1
Source: https://github.com/nocoo/r2shot/blob/d69714a2332066c9c7b1792f919607a4b776eade/logo.png
Reuse the approved downloadable files. Preserve the original Logo geometry, proportions, colors and bytes. Hexly campaign styling belongs to this archive and Hexly promotional material; the product's own palette and UI remain independent.
Family artwork: https://h.no.mt/logos/family/r2shot/2026-09-07-01/01/transparent.png
Family SHA-256: 17e2f07d03a8de29731fbb9fc0e91ea3182de24a46b2b3af79a8b73e4ac94ec1
Recorded adoption state: adopted. Do not treat a review candidate as an adopted product identity.
The archived text is a presentation brief for retained/supplied artwork, not a generation prompt.
Use the current rounded presentation as delivered on Hexly pages. Original foreground geometry/colors are preserved. iOS and Apple touch files are opaque squares for platform masking. Native dimensions and resampling are recorded in the icon manifest; source-product adoption remains separate.
Brand kit: v1.0.0. Read its manifest roles and license records before choosing official identity versus Hexly campaign artwork. Verify the selected files against that manifest.
Current decorative surface: Eelgrass in the current, generated with gpt-image-2.5-flare. Reuse its approved PNG/WebP; it is separate from the original Logo. Display one complete canvas without repetition or cropping. Exact light/dark prompts and generation receipts are in the texture archive.
Texture pack v1.0.0 has its own version, independent of the identity kit and application. Existing kit textures remain historical. Keep the active pack's manifest and use its measured surface opacity 0.4 on a separate background layer; Logo and text stay fully opaque.
Project screenshot: Capture the current page and upload it to your R2 bucket.
Original: https://h.no.mt/projects/r2shot/screenshots/store-01/v1.0.0/original-af7721524488.png
Dimensions: 1280 Γ 800
Page preview: https://h.no.mt/projects/r2shot/screenshots/store-01/v1.0.0/preview-ab639ba73e6d.webp
Thumbnail: https://h.no.mt/projects/r2shot/screenshots/store-01/v1.0.0/thumbnail-939e4ccb4bab.webp
Preserve the full image and its original product colors; these are product materials, not a new Logo or a product-release assertion.
Project screenshot: Configure your storage, image quality and full-page capture limit.
Original: https://h.no.mt/projects/r2shot/screenshots/store-02/v1.0.0/original-a2690191a16b.png
Dimensions: 1280 Γ 800
Page preview: https://h.no.mt/projects/r2shot/screenshots/store-02/v1.0.0/preview-ba7d2c9c01ee.webp
Thumbnail: https://h.no.mt/projects/r2shot/screenshots/store-02/v1.0.0/thumbnail-2def4a3ffac2.webp
Preserve the full image and its original product colors; these are product materials, not a new Logo or a product-release assertion.
Project screenshot: Capture a full page and copy a link to the uploaded image.
Original: https://h.no.mt/projects/r2shot/screenshots/store-03/v1.0.0/original-964687b81e9e.png
Dimensions: 1280 Γ 800
Page preview: https://h.no.mt/projects/r2shot/screenshots/store-03/v1.0.0/preview-d4c0e6eab46a.webp
Thumbnail: https://h.no.mt/projects/r2shot/screenshots/store-03/v1.0.0/thumbnail-8df1896116d3.webp
Preserve the full image and its original product colors; these are product materials, not a new Logo or a product-release assertion.
## Sources
- [Single-project identity API](https://hexly.ai/api/projects/nocoo/r2shot)
- [Presentation brief](https://h.no.mt/logos/family/r2shot/2026-09-07-01/01/brief.txt)
- [Current textured icon manifest](https://h.no.mt/projects/r2shot/icons/v1.0.0/manifest.json)
- [Brand asset manifest](https://h.no.mt/brands/r2shot/v1.0.0/manifest.json)
- [light surface: original PNG](https://h.no.mt/projects/r2shot/textures/v1.0.0/texture-light.png)
- [Exact light surface prompt](https://h.no.mt/projects/r2shot/textures/v1.0.0/texture-light-prompt.txt)
- [dark surface: original PNG](https://h.no.mt/projects/r2shot/textures/v1.0.0/texture-dark.png)
- [Exact dark surface prompt](https://h.no.mt/projects/r2shot/textures/v1.0.0/texture-dark-prompt.txt)
- [Active texture manifest and hashes](https://h.no.mt/projects/r2shot/textures/v1.0.0/manifest.json)
- [Texture usage and license](https://h.no.mt/projects/r2shot/textures/v1.0.0/guide.md)
- [Screenshot store-01: source, license and SHA-256 receipts](https://github.com/nocoo/hexly.ai/blob/main/docs/assets/r2shot/screenshots/store-01/v1.0.0.json)
- [Screenshot store-02: source, license and SHA-256 receipts](https://github.com/nocoo/hexly.ai/blob/main/docs/assets/r2shot/screenshots/store-02/v1.0.0.json)
- [Screenshot store-03: source, license and SHA-256 receipts](https://github.com/nocoo/hexly.ai/blob/main/docs/assets/r2shot/screenshots/store-03/v1.0.0.json)
- [Project catalogue JSON](https://hexly.ai/data/projects.json)
- [Agent index](https://hexly.ai/llms.txt)
- [Published site version and revision](https://hexly.ai/api/live)