Skip to content
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
33 changes: 33 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ node_modules/
dist/
out/
release/
build/playwright-browsers/
coverage/
playwright-report/
test-results/
Expand Down
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Binary file added build/icon.icns
Binary file not shown.
Binary file added build/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions build/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
58 changes: 58 additions & 0 deletions docs/market-validation.md
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 6 additions & 2 deletions docs/verification.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
15 changes: 14 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
{
Expand All @@ -18,5 +27,9 @@ export default tseslint.config(
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }]
}
},
{
files: ['site/**/*.js'],
languageOptions: { globals: globals.browser }
},
prettier
)
16 changes: 14 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -21,20 +21,32 @@
"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"
},
"files": [
"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."
},
Expand Down
11 changes: 11 additions & 0 deletions scripts/after-pack.mjs
Original file line number Diff line number Diff line change
@@ -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'
})
}
1 change: 1 addition & 0 deletions site/.nojekyll
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Binary file added site/assets/tasktape-regression-found.png
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 site/assets/tasktape-replay-check.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading