diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..86d55a5
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,33 @@
+name: Deploy landing page
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'site/**'
+ - '.github/workflows/pages.yml'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: true
+
+jobs:
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/configure-pages@v5
+ - uses: actions/upload-pages-artifact@v3
+ with:
+ path: site
+ - id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index 90a0c45..44491a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ node_modules/
dist/
out/
release/
+build/playwright-browsers/
coverage/
playwright-report/
test-results/
diff --git a/README.md b/README.md
index 3d0ea76..f7be151 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,12 @@ Users can add or replace their own OpenAI API key from Settings. App-managed key
The initial release is macOS-first and is being built for OpenAI Build Week. The hackathon demo proves one complete browser regression loop deeply. It does not claim broad, deterministic automation across every desktop application.
+## Download
+
+Download the Apple Silicon beta from the [TaskTape Replay site](https://codeswithroh.github.io/tasktape/) or from [GitHub Releases](https://github.com/codeswithroh/tasktape/releases/latest). The DMG contains TaskTape's tested browser runtime, so Google Chrome is not required.
+
+The beta is not signed or notarized yet. After copying TaskTape to Applications, macOS may require you to control-click the app, choose Open, and confirm once. A signed release requires an Apple Developer ID certificate and notarization credentials.
+
The reliable local-file capability learns extension groups and child-folder destinations from the demonstration, then organizes top-level files inside one approved folder. The user does not configure separate video or image fields. Tasks that need an application or website use OpenAI computer use through a native macOS input adapter. Model safety checks stop the run for review, and the agent is bounded to 25 turns. Scheduled runs require TaskTape to be open and the Mac to be awake. Background launch, history search, rollback, and safety-check resumption are not yet implemented.
## Product loop
@@ -50,12 +56,13 @@ Ask the connected agent to reproduce a bug on a local development URL and turn i
- [Architecture](docs/architecture.md)
- [Agent-operated replay milestone](docs/agent-mcp-milestone.md)
- [Voice and scheduling research](docs/voice-and-scheduling-research.md)
+- [Market validation](docs/market-validation.md)
- [Milestone roadmap](docs/roadmap.md)
- [Verification log](docs/verification.md)
## Development
-Prerequisites: Node.js 22+, pnpm 11.7.0, Xcode Command Line Tools, Google Chrome, and macOS for desktop capture, browser instrumentation, and computer-control verification.
+Prerequisites: Node.js 22+, pnpm 11.7.0, Xcode Command Line Tools, and macOS for desktop capture and computer-control verification. The packaging command downloads the pinned Playwright Chromium runtime into the release bundle.
```bash
cd /Users/rohitpurkait/Documents/codex_build_week
diff --git a/build/icon.icns b/build/icon.icns
new file mode 100644
index 0000000..30541b0
Binary files /dev/null and b/build/icon.icns differ
diff --git a/build/icon.png b/build/icon.png
new file mode 100644
index 0000000..a86d703
Binary files /dev/null and b/build/icon.png differ
diff --git a/build/icon.svg b/build/icon.svg
new file mode 100644
index 0000000..d4d7027
--- /dev/null
+++ b/build/icon.svg
@@ -0,0 +1,7 @@
+
diff --git a/docs/architecture.md b/docs/architecture.md
index 853eb30..c7194f9 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -27,7 +27,7 @@ The Electron main process starts an MCP Streamable HTTP server on `127.0.0.1:197
The MCP server and desktop renderer share the same browser evidence manager, workflow persistence, execution boundary, and run history. The renderer never hosts the server and receives only a narrow status object through preload IPC. Claude Code and Codex connection commands are shown in Settings, following Palmier's pattern of keeping setup beside the canonical local application state.
-The first MCP capability intentionally targets local web applications. `start_bug_session` accepts only loopback HTTP or HTTPS URLs, launches a temporary headed Chrome context, starts Playwright tracing, and allows one active session. Accessible role, label, text, or CSS selectors drive bounded click, fill, select, key, and wait operations. Password fields are refused.
+The first MCP capability intentionally targets local web applications. `start_bug_session` accepts only loopback HTTP or HTTPS URLs, launches a temporary headed Chromium context, starts Playwright tracing, and allows one active session. Release builds include the pinned Playwright browser runtime, while development can also use an explicitly configured or installed Chrome. Accessible role, label, text, or CSS selectors drive bounded click, fill, select, key, and wait operations. Password fields are refused.
Every operation stores an ordered action plus a screenshot. The session also records console messages, page errors, failed requests, HTTP error responses, initial and final screenshots, and a Playwright trace containing DOM snapshots and action timing. Finishing compiles the recorded actions into a review-required computer workflow and closes the temporary browser. Running or scheduling remains a separate explicit action.
diff --git a/docs/market-validation.md b/docs/market-validation.md
new file mode 100644
index 0000000..04eab4d
--- /dev/null
+++ b/docs/market-validation.md
@@ -0,0 +1,58 @@
+# Market validation
+
+Reviewed on July 19, 2026.
+
+## Decision
+
+TaskTape is worth releasing as a focused beta, not as a general browser agent or another screen recorder.
+
+The product promise is:
+
+> TaskTape lets a coding agent reproduce a local browser bug, prove the fix, and leave behind a reusable regression check.
+
+This is a conditional go. The next product gate is repeated use by real AI-heavy development teams, not download count.
+
+## Evidence that the problem is real
+
+- In the [2025 Stack Overflow Developer Survey](https://survey.stackoverflow.co/2025/ai), 66% of respondents cited AI solutions that are almost right as a frustration and 45% cited time spent debugging AI-generated code. More developers distrusted AI accuracy than trusted it.
+- [Jam](https://jam.dev/) reports 200,000 users. Its product and customer stories consistently center on the cost of incomplete bug reports that omit reproduction steps, console errors, and network failures. These figures and stories are vendor-reported.
+- [Momentic](https://momentic.ai/blog/series-a) raised a $15 million Series A after a $3.7 million seed round. It reports more than two billion customer testing steps since 2024 and customers including Notion, Quora, Webflow, and Xero. These figures are also vendor-reported.
+
+The demand is clear: AI accelerates code changes, while teams still need trustworthy, reviewable evidence that behavior works.
+
+## Competitive reality
+
+| Product | Strong at | Gap TaskTape can explore |
+| -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
+| [Jam](https://jam.dev/docs/creating-a-jam) | Human bug capture, video, actions, console, network, and issue-tracker handoff | A coding agent actively reproducing the issue and preserving that investigation as a local reusable check |
+| [Playwright MCP](https://playwright.dev/) | Free browser control for agents, accessibility snapshots, screenshots, tracing, console, and network evidence | A reviewed check lifecycle, expected-outcome editing, replay history, and a proof-of-fix artifact |
+| [Momentic](https://momentic.ai/blog/series-a) | Managed natural-language testing, adaptive replay, CI, visual checks, and run management | A small local reproduction workbench that starts inside an existing Claude or Codex debugging session |
+| [Sentry Replay](https://docs.sentry.io/product/explore/session-replay/) | Passive production replay connected to real errors and telemetry | Active reproduction and creation of a future check without requiring production instrumentation |
+| [Browserbase and Stagehand](https://www.browserbase.com/blog/stagehand-v3) | Cloud browser infrastructure, agent control, observability, and scale | A local desktop review and evidence workflow for one developer or a small team |
+
+## What is not differentiated
+
+Browser control, MCP, screenshots, console logs, network logs, and Playwright traces are established capabilities. TaskTape should use those primitives and never present them alone as the invention.
+
+A generic claim that Claude can control a browser and record what happened would duplicate Playwright MCP. A human-first screen recorder with developer logs would duplicate Jam. A broad AI testing platform would compete directly with Momentic before TaskTape has earned that scope.
+
+## Current wedge
+
+TaskTape joins steps that are still fragmented in the lightweight local workflow:
+
+1. Claude Code or Codex receives a bug report.
+2. The agent reproduces it in a visible, bounded local browser.
+3. TaskTape stores actions, screenshots, the DOM view, console events, failed requests, and a trace.
+4. The developer reviews the expected result and replay instructions.
+5. TaskTape creates a reusable check and records later pass or fail evidence.
+
+The desktop application is the review, persistence, and evidence layer around Playwright. It is not a replacement browser engine.
+
+## Risks and next validation gate
+
+- Playwright MCP can already produce most raw evidence, and strong agents can write tests from it.
+- Jam now moves rich bug context into coding workflows.
+- Momentic already sells an advanced managed testing lifecycle.
+- A local macOS-only beta limits reach and has trust friction until it is signed and notarized.
+
+The release should be tested with ten teams that use coding agents on active web products. Continue investing if at least three teams create and rerun checks weekly without prompting. Stop or reposition if most testers prefer raw Playwright MCP or never rerun the saved evidence.
diff --git a/docs/roadmap.md b/docs/roadmap.md
index e5f14e3..79f6337 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -164,7 +164,7 @@ Verified result:
Current boundary:
-- Agent capture supports local browser applications, one active session, and an installed Chrome runtime. General desktop instrumentation, remote staging URLs, CI workers, and direct GitHub issue ingestion remain post-hackathon work.
+- Agent capture supports local browser applications and one active session. Release builds include their browser runtime. General desktop instrumentation, remote staging URLs, CI workers, and direct GitHub issue ingestion remain post-hackathon work.
## Milestone 5: Product polish and submission - July 19-20
diff --git a/docs/verification.md b/docs/verification.md
index d518218..0363d00 100644
--- a/docs/verification.md
+++ b/docs/verification.md
@@ -34,8 +34,12 @@ This file records what has actually been tested. Passing claims must include the
## Latest automated run
-On 2026-07-18, `pnpm test` passed 61 tests across 15 files and `pnpm test:e2e` passed all 10 Electron journeys in 25.3 seconds. Formatting, lint, both TypeScript projects, and the production build also passed. The earlier paid gates remain valid: `pnpm test:live:computer` passed the paired broken and fixed OpenAI-driven desktop replay, and the live evaluator reliability gate passed all 10 evaluations. No additional paid model calls were used for the MCP milestone.
+On 2026-07-19, `pnpm check` passed formatting, lint, both TypeScript projects, 62 tests across 15 files, and the production build. `pnpm test:e2e` then passed all 10 Electron journeys in 29.6 seconds. The earlier paid gates remain valid: `pnpm test:live:computer` passed the paired broken and fixed OpenAI-driven desktop replay, and the live evaluator reliability gate passed all 10 evaluations. No additional paid model calls were used for the public-release milestone.
The first nine-journey Electron run on July 18 had one intermittent timeout while a synthetic MediaRecorder transitioned to the intent screen. That journey then passed twice consecutively in isolation, followed by a clean full run of all nine journeys in 20.9 seconds. No evaluator, execution, or persistence assertion failed during the timeout.
-The arm64 production app, DMG, and ZIP built successfully with `pnpm package:mac`. A packaged-app MCP check launched the binary from `app.asar`, connected over an ephemeral loopback port, discovered all 12 tools, captured and finished the broken browser fixture, and found the saved check. The DMG and ZIP are each 128 MB. Google Chrome is a runtime prerequisite and is not bundled. The app is not code-signed because no Developer ID identity is installed on this Mac, and a product icon has not yet replaced Electron's default icon. macOS therefore requires permissions to be granted separately to the packaged bundle.
+The 0.2.0 arm64 production app, DMG, and ZIP built successfully with `pnpm package:mac`. The release includes Playwright Chromium 1228 and the TaskTape product icon. `codesign --verify --deep --strict` passed after the packaging hook sealed the full app with an ad-hoc signature, and `hdiutil verify` reported a valid disk image checksum. A fresh-user-data MCP journey launched TaskTape directly from the read-only mounted DMG, connected over an ephemeral loopback port, reproduced the browser regression through the bundled runtime, wrote the trace and final screenshot, created the check, and ran it successfully. The 286 MB stable DMG has SHA-256 `a63e6d0791a7fc97d93be02ec8e52fbb6bcf276f5ef8324d799550e4fbaf4c89`.
+
+The static landing page was served locally and exercised in Chromium at 1440 by 900 and 390 by 844. Both viewports loaded the real product images, had no horizontal overflow or console errors, exposed consistent stable DMG links, and copied both MCP commands with visible feedback. Full-page captures were visually inspected. Public URL and release download verification remain pending until the branch is merged and GitHub Pages deploys.
+
+No Apple Developer ID identity is installed on the build Mac, so 0.2.0 is not Apple-signed or notarized. The ad-hoc signature provides bundle integrity but does not satisfy Gatekeeper distribution trust; users may need to approve the beta once through macOS. This is the only known release-credential blocker.
diff --git a/eslint.config.js b/eslint.config.js
index 4794561..4bdd401 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -6,7 +6,16 @@ import globals from 'globals'
import tseslint from 'typescript-eslint'
export default tseslint.config(
- { ignores: ['out', 'release', 'coverage', 'playwright-report', 'test-results'] },
+ {
+ ignores: [
+ 'out',
+ 'release',
+ 'build/playwright-browsers',
+ 'coverage',
+ 'playwright-report',
+ 'test-results'
+ ]
+ },
eslint.configs.recommended,
...tseslint.configs.recommended,
{
@@ -18,5 +27,9 @@ export default tseslint.config(
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }]
}
},
+ {
+ files: ['site/**/*.js'],
+ languageOptions: { globals: globals.browser }
+ },
prettier
)
diff --git a/package.json b/package.json
index 0e074eb..ee84e55 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "tasktape",
- "version": "0.1.0",
+ "version": "0.2.0",
"description": "Turn a narrated bug recording into a living regression check.",
"type": "module",
"main": "./out/main/index.js",
@@ -21,11 +21,13 @@
"test:watch": "vitest",
"test:e2e": "pnpm build && playwright test",
"check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build",
- "package:mac": "pnpm build && electron-builder --mac"
+ "browser:install": "PLAYWRIGHT_BROWSERS_PATH=build/playwright-browsers playwright install --no-shell chromium",
+ "package:mac": "pnpm browser:install && pnpm build && electron-builder --mac"
},
"build": {
"appId": "com.tasktape.desktop",
"productName": "TaskTape",
+ "afterPack": "scripts/after-pack.mjs",
"directories": {
"output": "release"
},
@@ -33,8 +35,18 @@
"out/**/*",
"package.json"
],
+ "extraResources": [
+ {
+ "from": "build/playwright-browsers",
+ "to": "playwright-browsers",
+ "filter": [
+ "**/*"
+ ]
+ }
+ ],
"mac": {
"category": "public.app-category.productivity",
+ "icon": "build/icon.icns",
"extendInfo": {
"NSMicrophoneUsageDescription": "TaskTape uses the microphone only when you record a voice note describing a workflow."
},
diff --git a/scripts/after-pack.mjs b/scripts/after-pack.mjs
new file mode 100644
index 0000000..e630b21
--- /dev/null
+++ b/scripts/after-pack.mjs
@@ -0,0 +1,11 @@
+import { execFileSync } from 'node:child_process'
+import { join } from 'node:path'
+
+export default function afterPack(context) {
+ if (context.electronPlatformName !== 'darwin') return
+
+ const appPath = join(context.appOutDir, `${context.packager.appInfo.productFilename}.app`)
+ execFileSync('codesign', ['--force', '--deep', '--sign', '-', appPath], {
+ stdio: 'inherit'
+ })
+}
diff --git a/site/.nojekyll b/site/.nojekyll
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/site/.nojekyll
@@ -0,0 +1 @@
+
diff --git a/site/assets/tasktape-regression-found.png b/site/assets/tasktape-regression-found.png
new file mode 100644
index 0000000..a5e066b
Binary files /dev/null and b/site/assets/tasktape-regression-found.png differ
diff --git a/site/assets/tasktape-replay-check.png b/site/assets/tasktape-replay-check.png
new file mode 100644
index 0000000..3c056e7
Binary files /dev/null and b/site/assets/tasktape-replay-check.png differ
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..fa43c9a
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,271 @@
+
+
+
+ Give Claude Code or Codex a visible browser it can control through MCP. TaskTape
+ preserves the evidence and turns the session into a check your team can replay.
+
Apple Silicon beta. Local-only sessions. No account required.
+
+
+
+
+
+
TaskTape Replay
+
+
+
+ Agent created A reproducible check, ready for review
+ Runs on your Mac
+
+
+
+
+
+
One session preserves
+
+
Actions
+
Screenshots
+
Console
+
Network
+
Playwright trace
+
+
+
+
+
+
From report to regression check
+
Your agent does the reproduction. You approve the truth.
+
+ TaskTape gives coding agents the browser tools they need while keeping the expected
+ result under human control.
+
+
+
+
+ 01
+
Connect
+
Add TaskTape as a local MCP server in Claude Code or Codex.
+
+
+ 02
+
Reproduce
+
Your agent opens the local app and follows the bug from start to failure.
+
+
+ 03
+
Review
+
Confirm what should happen before saving the regression check.
+
+
+ 04
+
Replay
+
Run the same check after a change and inspect pass or fail evidence.
+
+
+
+
+
+
+
Proof you can inspect
+
A failed check shows where reality diverged.
+
+ Each replay keeps the expected result beside the observed browser state. Open the
+ activity log for actions, screenshots, console output, requests, and the full trace.
+
+
+
✓ Evidence stays on your machine
+
✓ Expected outcomes require review
+
✓ Every replay keeps a run record
+
+
+
+
+
+
Regression evidence
+
+
+
+
+
+
+
+
Two-command setup
+
Connect the agent you already use.
+
Open TaskTape, then add its local MCP endpoint to your coding agent.