Current state: 9/10 - Best-in-class developer tool. GET support for actions, /key endpoint, diff-on-action, iframe visibility, simplified API.
Goal: 10/10 - The standard way AI agents interact with browsers.
Beyond: 11/10 - Agent-as-a-Service for browsers. Zero-config AI automation.
Current Focus: Phase 5 - CI Integration POC
docs/CI-INTEGRATION.md)Recent Progress (v0.1.9):
/click, /type, /key - simpler curl commands/key endpoint for keyboard shortcuts with realistic event lifecyclediff: true option - see what changed after actions/form endpoint - extract all form values as JSONframeSrc even for cross-origin/status includes windows - fewer round tripsThe product is better than people can tell. Fix that first.
Problem: README buries the lede. Users donβt immediately understand the value.
Solution:
bunx haltija + one script tagProblem: Docs scattered across CLAUDE.md, /docs, /api, embedded markdown, README.
Solution:
Problem: Users donβt know whatβs possible.
Solution:
Problem: /api endpoint is a wall of text.
Solution:
Make it impossible for an individual developer to use anything else.
Problem: Bun-only limits adoption. Many teams arenβt on Bun yet.
Status: Server uses Bun.serve() - Node.js would require abstracting HTTP layer. Low priority since:
bunx haltijaSolution (if needed):
npx haltija as alternative install pathProblem: Bookmarklet requires manual click per page. CSP blocks injection on some sites.
Solution:
Problem: Some failures are still cryptic.
Solution:
Problem: Raw HTTP calls are tedious.
Solution:
import { Haltija } from 'haltija'
const h = new Haltija('http://localhost:4000')
await h.click('#submit')
const tree = await h.tree({ depth: 2 })
Problem: Copy/pasting prompts is low friction, but zero friction is better.
Status: Recording infrastructure exists (/recording/start, /recording/stop, /recording/generate). Generates test JSON from user actions.
Remaining:
Low priority: CLI test runner (bunx haltija run test.json) - works via API already, CLI feels like regression to Playwright model
Key differentiator: We connect to a live browser youβre already using - no cold start, existing auth/cookies/state preserved. Test the actual thing youβre looking at, not a sterile simulation. Need isolation? Open a new tab - instant fresh context without browser spinup.
Problem: βClick with Diffβ produces powerful data, but itβs just JSON.
Solution:
Problem: Sharing automation recipes is ad-hoc.
Solution:
haltija-skill-stripe-checkout, haltija-skill-gmail-cleanupBuild scripts work for all platforms. v0.1.9 includes:
Problem: Users donβt know they can build locally.
Solution:
npm run build:mac/win/linux in apps/desktopProblem: Windows build untested.
Status: Build scripts work, produces installer + portable exe. Needs real Windows testing.
Solution:
Problem: Building locally requires dev environment.
Solution:
Problem: Cloud deployment requires manual setup.
Solution:
docker run -p 4000:4000 haltija/haltija
Whatβs needed for production deployment at scale.
Approach: Dogfood in real CI environment first. The items below are hypotheses - actual friction points will emerge from integration with real workflows (CI systems, Copilot, PR processes). Build whatβs actually needed, not whatβs imagined.
Problem: No auth on REST API. Anyone on localhost can control the browser.
Solution:
Problem: No record of what commands were executed.
Solution:
Problem: Runaway agent could spam commands.
Solution:
Problem: One browser per server instance.
Solution:
Problem: Managers donβt trust AI. They need to see the work.
Solution:
Problem: Security teams hate βMagic Appsβ that strip CSP.
Solution:
Problem: Localhost is a ceiling for enterprise scale.
Solution:
This is the 10/10 unlock.
Problem: Requires local server for every user.
Solution:
Problem: Running in CI requires manual setup.
Solution:
uses: haltija/action@v1Problem: Users still have to write test specs.
Solution:
Problem: Test results are separate from code review.
Solution:
Build the moat through adoption.
| Phase | Effort | Impact | Do When |
|---|---|---|---|
| 1. Docs & Discovery | Low | High | Now |
| 2. Developer Experience | Medium | High | Next |
| 3. Platform Expansion | Low-Medium | Medium | β Done |
| 4. Enterprise Readiness | High | Medium | Dogfood first |
| 5. Cloud & CI | High | Transformative | The 10/10 |
| 6. Ecosystem | Ongoing | Cumulative | Continuous |
| 7. Hosted Service | Medium | Business | The 11/10 |
A product is 10/10 when it becomes the obvious default choice.
Weβre at 9/10 now: Best-in-class developer tool. GET support, /key, diff-on-action, simplified API.
Phase 2 additions lock in developers:
Phase 4-5 unlocks enterprise:
Phase 5 gets us to 10/10: AI QA in CI that just works. Push code, get human-readable test results, auto-fixed tests, real bug reports.
Phase 7 gets us to 11/10: Agent-as-a-Service. One curl command = AI controlling a browser. No setup, no MCP, no local Claude. Just:
curl https://yourco.haltija.net/do -d '{"task": "fill out the signup form"}'
The architecture makes this possible: we route messages, we donβt run browsers. Near-zero marginal cost while competitors burn money on browser infrastructure.
This is what makes Haltija a business, not just a tool.
Why this is cheap to run:
Cost projection: | Users | Concurrent Sessions | Monthly Cost | |ββ-|βββββββ|βββββ| | 1,000 | ~200 | ~$5 | | 10,000 | ~2,000 | ~$20 | | 100,000 | ~20,000 | ~$50 |
Thatβs 95%+ margins on the relay itself.
Firebase stack (known quantity):
Relay service (Fly.io):
haltija.dev - marketing site, docs
app.haltija.dev - dashboard (Firebase Hosting)
api.haltija.dev - shared API (free tier, auth via token)
*.haltija.net - customer-specific endpoints
acme.haltija.net - Acme Corp's dedicated relay
initech.haltija.net - Initech's dedicated relay
Benefits of customer subdomains:
Stripe integration:
Proposed tiers: | Tier | Price | Limits | |ββ|ββ-|βββ| | Free | $0 | 1K commands/mo, 10 test runs | | Pro | $29/mo | 50K commands/mo, 500 test runs | | Team | $99/mo | 500K commands/mo, unlimited tests | | Enterprise | Custom | Unlimited, SLA, dedicated subdomain |
Instrument Haltija to learn what works:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Telemetry Events β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Usage: command_invoked, test_run_started, test_passed β
β Utility: command_success_rate, avg_response_time β
β Usability: command_retry_count, error_frequency, feedback β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Per-command tracking:
Let agents report friction directly:
POST /feedback
{
"type": "friction" | "suggestion" | "error",
"context": "tried to click dropdown but it was inside shadow DOM",
"command": "/click",
"severity": "medium"
}
Dashboard aggregates:
The killer feature - zero config agents:
Current setup requires:
Magic token flow:
curl https://yourco.haltija.net/do \
-H "Authorization: Bearer xxx" \
-d '{"task": "click the login button"}'
Architecture:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β haltija.net (hosted) β
β βββββββββββ βββββββββββ βββββββββββ β
β β Auth βββββΆβ Agent βββββΆβ Relay βββββββββββββββββββΌβββΆ Browser
β β + Keys β β (Claude)β β β β (your machine)
β βββββββββββ βββββββββββ βββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β²
β
curl/REST (your CI, scripts, whatever)
What this enables:
Pricing options:
HTTPS is non-negotiable for the hosted service:
fetch() from any page without CSP blockingwss://)Magic bookmarklet flow:
wss://api.haltija.dev/ws?token=xxxUse case: βClick this bookmarklet and I can see your browserβ for remote debugging/support.
What users see:
Why this works:
Revenue projection (conservative):
The real insight: A week to build the core product. Another week or two for hosted service MVP. Competitors maintain Kubernetes clusters of browsers.
Things weβre explicitly not building:
How we know weβve hit 10/10:
How we know weβve hit 11/10:
/do endpoint without ever installing anything locally