Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
e4cb400
fix(web): add getSafeNextPath helper for auth redirects
richiemcilroy Jun 15, 2026
d32dd89
fix(web): validate next redirect in login flow
richiemcilroy Jun 15, 2026
11ad719
fix(web): validate next redirect in signup form
richiemcilroy Jun 15, 2026
3838769
fix(web): validate next redirect in verify-otp flow
richiemcilroy Jun 15, 2026
471bce8
feat(web-domain): add FREE_PLAN_MAX_RECORDING_SECONDS constant
richiemcilroy Jun 15, 2026
e93c7cc
fix(web): skip duplicate video processing when upload already complete
richiemcilroy Jun 15, 2026
3109a9e
feat(web): enforce free plan duration limit on multipart complete
richiemcilroy Jun 15, 2026
cdd5d9c
chore(db): add auth_api_keys user_id created_at index
richiemcilroy Jun 15, 2026
3e0ddcd
feat(env): add CAP_CHROME_EXTENSION_ID env var
richiemcilroy Jun 15, 2026
29fd92a
feat(web-domain): add Extension HTTP API contract
richiemcilroy Jun 15, 2026
38107a0
feat(web-backend): add Extension auth and recording handlers
richiemcilroy Jun 15, 2026
a0157b3
fix(web-backend): map StorageError to internal server error
richiemcilroy Jun 15, 2026
fb03676
feat(web): wire Extension API and enable DELETE CORS
richiemcilroy Jun 15, 2026
a2ebedb
feat(recorder-core): add package scaffold
richiemcilroy Jun 15, 2026
8d12772
feat(recorder-core): add recorder types and constants
richiemcilroy Jun 15, 2026
9d86f59
feat(recorder-core): add local recording backup utilities
richiemcilroy Jun 15, 2026
1ce203f
feat(recorder-core): add recording spool fallback helper
richiemcilroy Jun 15, 2026
cb207a5
feat(recorder-core): add recording spool with idle recovery guard
richiemcilroy Jun 15, 2026
7d97df4
feat(recorder-core): harden instant mp4 uploader retries
richiemcilroy Jun 15, 2026
3041d7f
feat(recorder-core): add recorder utilities
richiemcilroy Jun 15, 2026
607bc32
feat(recorder-core): export recorder-core public API
richiemcilroy Jun 15, 2026
64ff1ee
chore: wire recorder-core into workspace config
richiemcilroy Jun 15, 2026
05e6143
refactor(web): remove local recorder modules moved to recorder-core
richiemcilroy Jun 15, 2026
d0d3578
refactor(web): re-export recorder constants from recorder-core
richiemcilroy Jun 15, 2026
70133d5
refactor(web): import recorder-core types in dashboard upload UI
richiemcilroy Jun 15, 2026
4ccd2a7
feat(web): add recording spool heartbeat during live recordings
richiemcilroy Jun 15, 2026
c2eba58
fix(web): skip live spools in recovered recording cache sweep
richiemcilroy Jun 15, 2026
5cb764a
feat(chrome-extension): add extension package scaffold
richiemcilroy Jun 15, 2026
345e46e
feat(chrome-extension): add shared messaging and storage layer
richiemcilroy Jun 15, 2026
b936fd9
feat(chrome-extension): add background service worker
richiemcilroy Jun 15, 2026
1025fad
feat(chrome-extension): add offscreen document recorder
richiemcilroy Jun 15, 2026
08177f8
feat(chrome-extension): add content scripts and recording overlay
richiemcilroy Jun 15, 2026
d4e2586
feat(chrome-extension): add popup UI and recording controls
richiemcilroy Jun 15, 2026
0018386
feat(chrome-extension): add auxiliary pages and store assets
richiemcilroy Jun 15, 2026
ecc8305
test(chrome-extension): add e2e recording and overlay tests
richiemcilroy Jun 15, 2026
33a8135
chore: add chrome-extension dev scripts and lockfile
richiemcilroy Jun 15, 2026
c3a0655
refactor(chrome-extension): extract shared media device helpers
richiemcilroy Jun 17, 2026
ddfe003
feat(chrome-extension): add offscreen media device enumeration types
richiemcilroy Jun 17, 2026
b14d561
feat(chrome-extension): enumerate devices in offscreen recorder
richiemcilroy Jun 17, 2026
9c309b9
refactor(chrome-extension): use shared device helpers in permission flow
richiemcilroy Jun 17, 2026
479ba5f
refactor(chrome-extension): use shared device helpers in camera preview
richiemcilroy Jun 17, 2026
30ef5be
fix(chrome-extension): close recorder UI when action icon toggled open
richiemcilroy Jun 17, 2026
6611f2c
feat(chrome-extension): cache and serve media devices via offscreen d…
richiemcilroy Jun 17, 2026
8a64415
feat(chrome-extension): resolve device lists via service worker in re…
richiemcilroy Jun 17, 2026
107ea79
feat(chrome-extension): add dashboard button component
richiemcilroy Jun 17, 2026
564be3d
feat(chrome-extension): add dashboard shortcut and widen recorder panel
richiemcilroy Jun 17, 2026
6784443
feat(chrome-extension): add dashboard link and SVG logo to page nav
richiemcilroy Jun 17, 2026
bec90f9
feat(chrome-extension): add page drawing overlay component
richiemcilroy Jun 17, 2026
9797790
style(chrome-extension): add drawing overlay and control bar styles
richiemcilroy Jun 17, 2026
2e1a92a
feat(chrome-extension): wire drawing mode into recording bar
richiemcilroy Jun 17, 2026
141629d
chore(web): regenerate workflow manifest
richiemcilroy Jun 17, 2026
efb2dff
feat(recorder-core): add describeRecordingCodecs utility
richiemcilroy Jun 17, 2026
1ed73d3
feat(chrome-extension): add countdown and mic warning settings
richiemcilroy Jun 17, 2026
affce29
feat(chrome-extension): recognize countdown and confirm overlay messages
richiemcilroy Jun 17, 2026
a671bcf
refactor(chrome-extension): extract startup message replay module
richiemcilroy Jun 17, 2026
ed32b3f
feat(chrome-extension): add pre-roll countdown overlay component
richiemcilroy Jun 17, 2026
42e6b68
feat(chrome-extension): add microphone confirm overlay component
richiemcilroy Jun 17, 2026
39899b1
style(chrome-extension): add countdown and confirm overlay styles
richiemcilroy Jun 17, 2026
a778ae3
feat(chrome-extension): wire countdown and confirm overlays into page…
richiemcilroy Jun 17, 2026
f320b2a
feat(chrome-extension): gate recording start on microphone warning
richiemcilroy Jun 17, 2026
378c8e3
feat(chrome-extension): relay pre-roll countdown to recorded tab
richiemcilroy Jun 17, 2026
5b2421b
fix(chrome-extension): retry display media capture with relaxed const…
richiemcilroy Jun 17, 2026
0addfcc
feat(chrome-extension): use negotiated codecs for upload metadata
richiemcilroy Jun 17, 2026
e4ff1a2
feat(chrome-extension): probe microphone signal in offscreen document
richiemcilroy Jun 17, 2026
515378c
feat(chrome-extension): run pre-roll countdown before recording starts
richiemcilroy Jun 17, 2026
876c32b
feat(chrome-extension): apply negotiated codecs when creating recording
richiemcilroy Jun 17, 2026
f6abcc1
feat(chrome-extension): invoke countdown and allow cancel during pre-…
richiemcilroy Jun 17, 2026
7079afe
feat(chrome-extension): add countdown and mic warning options controls
richiemcilroy Jun 17, 2026
85fad68
feat(chrome-extension): add device select overlay for popup pickers
richiemcilroy Jun 17, 2026
d7e8591
style(chrome-extension): add device picker sheet slide animation
richiemcilroy Jun 17, 2026
7699ce8
refactor(chrome-extension): replace camera dropdown with device selec…
richiemcilroy Jun 17, 2026
7c2f345
refactor(chrome-extension): replace microphone dropdown with device s…
richiemcilroy Jun 17, 2026
34461ca
feat(chrome-extension): treat mic warning dismissal as silent cancell…
richiemcilroy Jun 17, 2026
09ee2ee
fixes
richiemcilroy Jun 17, 2026
062acdf
comments
richiemcilroy Jun 17, 2026
b2d48c6
greptile
richiemcilroy Jun 17, 2026
2b726ad
fix
richiemcilroy Jun 17, 2026
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
2 changes: 2 additions & 0 deletions apps/chrome-extension/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test-results/
playwright-report/
145 changes: 145 additions & 0 deletions apps/chrome-extension/STORE_LISTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# Chrome Web Store Listing

Everything below is ready to paste into the Chrome Web Store Developer Dashboard. Keep claims in sync with the extension version being submitted.

## Store Fields

Name: Cap - Screen Recorder & Screen Capture

Short name: Cap

Summary (132 char max, mirrors manifest description): Free, open source screen recorder. Capture your screen, tab, camera & mic in Chrome and share a video link the moment you stop.

Category: Productivity → Communication

Language: English

Website: https://cap.so

Support: https://cap.so/docs

Privacy policy: https://cap.so/privacy

## Detailed Description (paste as plain text)

Cap is the open source screen recorder for Chrome. Record your screen, a window, the current browser tab, or camera-only video. Your recording uploads while you record, so a shareable link is ready the moment you stop. No exports, no waiting, no switching tools.

WHY PEOPLE SWITCH TO CAP

Cap is a Loom alternative built on a simple idea: your recordings belong to you. Cap is fully open source, lets you connect your own storage, and gives you a fast, lightweight recorder that stays out of your way.

• Truly open source: inspect every line of code, contribute, or self-host the entire stack.
• Own your recordings: use Cap Cloud or connect your own S3 bucket. No vendor lock-in, ever.
• Instant share links: video uploads as you record, so the link is live the second you stop.
• Cap AI: auto-generated titles, summaries, clickable chapters, and searchable transcripts for every recording.
• Built for teams: comments, reactions, viewer analytics, password-protected shares, custom domains, and team workspaces.
• Switching from Loom? Import your existing Loom videos directly into Cap with the built-in importer.

WHAT YOU CAN RECORD

• Current browser tab: perfect for web app demos and bug reports.
• Full screen or a single window.
• Camera-only video for quick personal updates.
• Microphone audio, system audio (where Chrome supports it), and a webcam overlay for walkthroughs.

MADE FOR EVERYDAY VIDEO

Screen recording for async standups, code reviews, bug reports, product demos, customer support, onboarding, tutorials, design feedback, and sales outreach. Record once, share a link, and skip the meeting.

HOW IT WORKS

1. Click the Cap icon and pick tab, screen, window, or camera.
2. Choose your microphone and camera, then hit record.
3. Stop recording. Your video is already uploaded to your Cap workspace and the share link is ready.

CAP EVERYWHERE

The extension is part of the Cap platform: native desktop apps for macOS and Windows, a web recorder, and a shared library at cap.so. Recordings stay connected to your Cap account wherever you capture them.

Cap is free to get started. Upgrade to Cap Pro for unlimited recording length, Cap AI, custom domains, custom S3 storage, and team features.

Open source on GitHub: https://github.com/CapSoftware/Cap

## SEO Positioning

Primary keywords (use naturally in the description, never stuffed):

- screen recorder / screen recorder for Chrome
- screen capture / screen recording
- record browser tab
- screen recorder with camera and microphone
- webcam recorder
- video messaging / async video
- Loom alternative (used exactly once in the detailed description; never in the name, summary, or screenshot text)

Name strategy: "Cap - Screen Recorder & Screen Capture" leads with the brand and covers the two highest-volume queries, matching how the top competitor titles its listing without keyword spam.

Summary strategy: front-loads "free, open source screen recorder" (differentiator + keyword), lists capture surfaces, and ends on the instant-share-link benefit.

Review-safety notes:

- Keep every claim true for the submitted build (system audio is "where Chrome supports it").
- Do not mention competitor names in metadata fields other than the single description mention.
- Do not claim "unlimited free": free tier has limits; Pro removes them.

## Icons

`public/icons/` is generated from the brand mark `apps/web/public/logos/logo-solo.svg`:

- icon-16/32/48: full-bleed, used for toolbar and favicon contexts.
- icon-128: 96x96 artwork centered with 16px transparent padding, per Chrome Web Store icon guidelines (this is the store listing icon).
- icon-256: same padded treatment at 2x.

Regenerate with rsvg-convert:

```sh
cd apps/chrome-extension/public/icons
for s in 16 32 48; do rsvg-convert -w $s -h $s ../../../web/public/logos/logo-solo.svg -o icon-$s.png; done
rsvg-convert -w 96 -h 96 --page-width 128 --page-height 128 --top 16 --left 16 ../../../web/public/logos/logo-solo.svg -o icon-128.png
rsvg-convert -w 192 -h 192 --page-width 256 --page-height 256 --top 32 --left 32 ../../../web/public/logos/logo-solo.svg -o icon-256.png
```

## Promotional Images

Store sources live in `store-assets/`. PNGs are full-bleed with square corners, as the store requires.

- promo-small.png: 440x280 small promo tile (required).
- promo-marquee.png: 1400x560 marquee tile (optional, needed for feature placement).

The SVG sources use the Neue Montreal fonts bundled in `public/fonts`. Regenerate with a fontconfig file that points at that directory:

```sh
cat > /tmp/cap-fonts.conf <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/path/to/Cap/apps/chrome-extension/public/fonts</dir>
<dir>/System/Library/Fonts</dir>
<cachedir>/tmp/cap-fc-cache</cachedir>
</fontconfig>
EOF
cd apps/chrome-extension/store-assets
FONTCONFIG_FILE=/tmp/cap-fonts.conf rsvg-convert -w 440 -h 280 promo-small.svg -o promo-small.png
FONTCONFIG_FILE=/tmp/cap-fonts.conf rsvg-convert -w 1400 -h 560 promo-marquee.svg -o promo-marquee.png
```

## Screenshot Plan

Use 1280x800 PNG screenshots, full bleed, square corners, no padding. Capture against a real page, not a blank tab.

1. In-page recorder panel open with the recording mode selector (tab / screen / camera) visible.
2. Recording setup showing microphone and camera selectors plus the system audio toggle.
3. Recording in progress with the floating recording bar and webcam overlay on a real page.
4. Upload/completion state with the share-link handoff.
5. The Cap share page (player, transcript/chapters) after a recording is available.

## Review Notes: Permission Justifications

- activeTab and scripting: show the recording controls overlay on the page the user is recording.
- tabCapture: record the current browser tab when the user selects tab recording.
- offscreen: run capture, encoding, and upload outside the recorder panel so recordings survive closing it.
- storage: remember account session, selected devices, and recording preferences.
- identity: sign the user in to their Cap account.
- host permissions: inject the recording overlay and camera preview on pages the user chooses to record.

Submission checklist: icon present (128px padded), summary under 132 chars, at least one 1280x800 screenshot, small promo tile uploaded, privacy policy URL set, permission justifications filled in.
12 changes: 12 additions & 0 deletions apps/chrome-extension/camera-permission.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Camera access - Cap</title>
<script type="module" src="/src/permission/camera-permission.tsx"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
12 changes: 12 additions & 0 deletions apps/chrome-extension/camera-preview.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Cap Camera Preview</title>
<script type="module" src="/src/preview/camera-preview.tsx"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Loading
Loading