Skip to content
CAI
Software that uses CAICheck a score

feder-cr/AIHawk

49.6

Weak · 18 September 2026

6.5k

lines of production code

Python

with JavaScript

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is an MCP server bundle that exposes a stealth Firefox browser instance for automated web navigation and data extraction. It provides a web-based interface for managing browser sessions and interacting with the agent, while enforcing strict validation and content quality through dedicated CI scripts. The repository has been stripped of its previous job application processing and resume generation capabilities, focusing solely on browser automation and documentation.

How it got here

2024 — MCP server migration

5 changes.

The project was restructured from a standalone application into an MCP server bundle, removing all legacy job application processing, LLM integration, and resume generation modules. This shift involved deleting core source code and utilities while modernizing the build configuration to support the new Model Context Protocol architecture.

2026 — AIHawk package restructuring and UI overhaul

10 changes.

The AIHawk library was reorganized into a structured Python package with a unified CLI and a redesigned, modular web interface featuring a dark theme. This period also introduced a new MCP server exposing a stealth Firefox browser, comprehensive test coverage for stability, and automated CI scripts for content and bundle validation.

Features

MCP server exposes a single stealth Firefox browser with persistent identity and improved navigation feedback

The \src/aihawk/mcp\ package introduces a new MCP server that exposes a stealth Firefox browser (via \invisible\_playwright\) over the Model Context Protocol. The server is designed around a single active browser instance per process (identified as \main\ or \support\), removing previous multi-tab and multi-session enumeration capabilities to simplify the interface and ensure identity consistency. Key behavioral changes include: \browser\_navigate\ now reports the actual HTTP status and final URL (handling redirects correctly) instead of a generic success message; browser identity (seed and proxy exit) is persisted in a profile directory to maintain consistent fingerprints across sessions; and the server provides explicit error messages when a browser is not open or has crashed, directing the user to call \browser\_open\. The implementation includes HTML cleaning (\clean.py\) that preserves all interactive elements for agent interaction, and a session store (\store.py\) that persists browser configuration (but not live state) to disk.

src/aihawk/mcp · high confidence

New AIHawk worked examples for data extraction and audited web research

The articles section now includes two complete, reproducible worked examples for AIHawk users. The first demonstrates extracting a 32-book category to CSV, intentionally preserving a common agent error (truncated titles) to illustrate how to verify and correct data. The second provides an audited web research example where an agent's price-counting claims are verified against a deterministic script, offering a pattern for validating agent outputs. Both examples include full prompts, step-by-step run transcripts, and browser screenshots.

articles · high confidence

Removals

Removal of job application processing and LLM integration modules

The \src\ package has been stripped of its core application logic, including the \Job\ and \JobApplicationProfile\ data models, the \ApplicationSaver\ for persisting applications, and the \llm\_manager\ which handled interactions with OpenAI, Anthropic, and other AI providers. Additionally, the \logging\ infrastructure and \resume\ schema definitions have been deleted, effectively removing the repository's ability to process job applications or generate content via AI.

src · high confidence

Removal of the resume and cover letter generation library

The \src/libs/resume\_and\_cover\_builder\ module has been completely removed from the codebase. This deletion eliminates the functionality for generating resumes and cover letters using LLMs (such as GPT-4o-mini), including the associated prompt templates, style definitions, and the facade interface that previously handled user style selection and PDF output.

_src/libs/resume\_and\_cover\builder · high confidence

Removal of utility modules and constants

The \src/utils\ package has been removed, deleting \\_\init\\_.py\, \browser\_utils.py\, \chrome\_utils.py\, and \constants.py\. This eliminates browser automation helpers (such as slow scrolling and Chrome initialization) and the centralized string constants previously used for resume sections, LLM metadata, and configuration keys. As noted in the commit history, this change aligns with the repository's shift to a documentation-only scope.

src/utils · high confidence

Architecture

AIHawk is now an MCP server bundle

The repository has been restructured to serve as an MCP (Model Context Protocol) bundle for the AIHawk browser agent. New manifest files (manifest.json, server.json, mcp.json, plugin.json, gemini-extension.json) define the server configuration, specifying the entry point and transport. The legacy standalone application files (main.py, config.py) and the CONTRIBUTING guide have been removed, and the project license has been changed to MIT. Users now interact with AIHawk primarily through MCP clients rather than running the standalone script directly.

(repo-wide) · high confidence

Behavioural changes

Complete UI redesign with dark theme and improved accessibility

The interface has been overhauled with a new dark color palette designed for low-light usage, featuring a structured 'ladder' of surface colors and translucent edges. Typography and spacing have been standardized using CSS variables to ensure consistent scaling and respect for user font-size preferences. Accessibility improvements include higher contrast ratios for text and decorative elements, larger touch targets for controls, and a new modal sessions panel that overlays the conversation without shifting the layout. The browser pane now wraps its controls on narrow screens, and the composer input provides clearer visual feedback for focus and interaction states.

src/aihawk/ui/css · high confidence

New CI content gates and MCP bundle validation scripts

This change introduces several new Python scripts in the \scripts/\ directory to enforce content quality and validate the MCP server bundle. \check\_content.py\ implements seven automated gates that scan documentation and the README for banned topics, invisible Unicode characters, broken internal links, and consistency between taught CLI commands/tools and their actual implementation, ensuring the README remains the single source of truth for installation and usage. \build\_wiki.py\ converts the Jekyll-based \docs/\ tree into a flat GitHub wiki structure, handling front-matter stripping, link rewriting, and sidebar generation, while optionally injecting per-page view-count pixels. \sync\_article\_pixels.py\ manages these view-count pixels by uploading 1x1 transparent images to a dedicated GitHub release, providing a mechanism to track individual page popularity. Finally, \bundle\_speaks\_mcp.py\ and \pack\_bundle.py\ replace previous validation methods; the packer now strictly enforces an allowed file set and forbids sensitive paths when creating the \.mcpb\ archive, while the validator performs a real MCP handshake to ensure the bundle starts correctly, reports its version, and exposes the expected tools, rather than relying on a simple \--help\ check.

scripts · high confidence

Redesigned chat interface with improved transcript, session management, and browser pane

The chat interface has been rebuilt to improve usability and reliability. The transcript now persists queued messages across page reloads and reconnects, ensuring typed instructions are not lost. Scrolling behavior has been refined to automatically follow new content while allowing users to scroll up and return to the latest messages. Session management now supports one page per browser instance, with clearer naming and deletion controls. The browser pane displays live screenshots with improved state indicators and reduced polling overhead. Markdown rendering in answers is now safer and more robust, avoiding HTML injection risks. The composer provides clearer feedback on message queuing and sending states.

src/aihawk/ui/js · high confidence

UI codebase restructured into modular files with byte-for-byte assembly

The user interface code has been refactored from a single monolithic module into separate, ordered CSS and JavaScript files, assembled into the final HTML page at import time. This change preserves the exact character output of the previous version to ensure all existing test assertions remain valid, while improving maintainability by splitting the large stylesheet and script into logical components (tokens, sessions, shell, transcript, composer, browser, stage) and corresponding JS modules (markdown, transcript, session management, composer, browser, sessions, rail, workspace, stage, splitter).

src/aihawk/ui · high confidence

Unified session launch planning and description in MCP

The \aihawk.mcp.plan\ module consolidates session launch configuration and status reporting into a single source of truth. Previously, launch arguments and environment variables were resolved in multiple places, causing discrepancies between the actual browser state and the reported session details (e.g., profile or proxy settings). This change introduces a unified \SessionPlan\ and \describe\ function that resolve profile directories, proxy settings, and seeds exactly once, ensuring the user-facing session description accurately reflects the launched browser instance. It also enforces a three-valued logic for explicit vs. environment-provided settings and validates profile paths to prevent accidental creation of new profiles.

aihawk · high confidence

aihawk restructured as a single installable package with dedicated CLI and UI modes

The aihawk library has been reorganized from a folder-based structure into a proper Python package (src/aihawk), introducing a unified command-line interface. Users can now run \aihawk\ directly to start the MCP server for browser automation, or use \aihawk ui\ to launch the web-based interface that connects to the server. This change centralizes configuration handling via a local \.env\ file, enforces strict separation of the model API key from the browser server process for security, and consolidates conversation persistence and agent logic into dedicated modules within the package.

src/aihawk · high confidence

Test coverage

Expanded test coverage for MCP server stability and correctness; New test infrastructure and coverage for UI, agent, and CI stability.

Dependencies

Migrate to pyproject.toml and modernize dependencies

The project has replaced the legacy requirements.txt with a pyproject.toml manifest, establishing a modern build configuration using hatchling. This change introduces several key dependency updates: the MCP SDK is now pinned to \>=1.8,\<2 to support streamable HTTP transport, and the invisible-playwright engine is upgraded to \>=0.22.1 to fix critical click-delivery issues. Additionally, the project now explicitly declares transitive dependencies like pydantic, starlette, and uvicorn to ensure stability, while removing the legacy langchain-based tooling and selenium/undetected-chromedriver dependencies in favor of the new invisible-playwright stack.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 50.

Lenses

  • Code Health 50
  • Architecture 100
  • Maturity 64
  • Readiness 38
  • Security 62
  • Accessibility 80

Changes since last survey

  • 300 commits — 295 feature/other, 5 fixes

By area

  • (root) — 145 commits
  • src/aihawk — 46 commits
  • (repo) — 24 commits
  • tests/mcp_server — 13 commits
  • .github/workflows — 9 commits
  • pkg-cli/src — 7 commits
  • articles/extracting-a-category-to-csv — 3 commits
  • docs/agent-retry-loops-rate-limits.md — 2 commits
  • docs/agentic-browser-open-source.md — 2 commits
  • docs/ai-agent-download-invoices.md — 2 commits
  • docs/ai-browser-agent-open-source.md — 2 commits
  • docs/aihawk-review.md — 2 commits
  • docs/mcp-server.md — 2 commits
  • pkg-cli/tests — 2 commits
  • scripts/check_content.py — 2 commits
  • .github/CODE_OF_CONDUCT.md — 1 commit
  • .github/CONTRIBUTING.md — 1 commit
  • .github/ISSUE_TEMPLATE — 1 commit
  • articles/README.md — 1 commit
  • articles/web-research-audited — 1 commit

Notable commits

  • fix: Fix stale invisible-playwright-mcp references left over from the aihawk merge (#1255)
  • fix: Merge pull request #1209 from feder-cr/docs/audit-fixes
  • fix: Merge pull request #1213 from feder-cr/fix/verbs-for-new-session-tools
  • fix: The floor carries the click fix, or the fix reaches nobody who already had a wheel (#1367)
  • fix: fix: prevent duplicate SSE events at connect (#1229)
  • change: 0.2.0: two ways in on the first screen, and the key really does stay out (#1187)
  • change: 0.3.0: remove the do subcommand. One way in, and it is the interface (#1203)
  • change: 0.4.0: the placeholder goes, and keyless driving is the library's job
  • change: A .env beside the command, and the floor that makes the verb table true (#1210)
  • change: A 400x400 icon, because marketplaces ask for a square and the wordmark is not one (#1306)
  • change: A checkout should gate itself, and these two never did (#1217)
  • change: A clean bill names the tree it is about (#1355)
  • change: A column of sessions, and each one drives its own browsers (0.17.0) (#1270)
  • change: A comment inside a code fence is not a heading (#1248)
  • change: A connection is closed by the task that opened it, or it takes the interface with it (#1368)
  • change: A declared browser wakes where it was, tabs and all (0.19.0) (#1272)
  • change: A dependency you import is one you declare (0.68.0) (#1353)
  • change: A failed selector says what to do next, from every tool that takes one (#1366)
  • change: A killed engine is only visible to a round trip, and its failure is not swallowed (0.53.1) (#1334)
  • change: A look no longer opens a browser, which is what the flag already claimed (0.48.0)
  • …and 280 more

Architecture

  • 0 containers · 1 bounded contexts · 0 dependency edges (baseline)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

feder-cr/AIHawk was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 18 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit f868bcd91a35317694978fd27696c71d98841233 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-5d04157a340d.