
Hashling Puts a Security Approval Gate Between AI Agents and a Mac
The open-source Hashling project treats local AI-agent safety as an operating-system and consent problem, requiring Touch ID before changes rather than trusting an agent’s explanation.
Hashling Puts a Security Approval Gate Between AI Agents and a Mac
The most dangerous moment in a local AI workflow may not be when the model writes bad code. It may be when a helpful command quietly changes the machine. Hashling, a new open-source Mac security agent, is built around that moment. The repository describes a tool that works with assistants such as Claude, Cursor, and Codex, watches AI agents, scams, and malware, and changes nothing without Touch ID approval. That choice makes the project interesting for a reason beyond its feature list: it treats consent as a system boundary. The model can inspect and suggest; a separate control decides whether the computer changes.
flowchart LR
A[AI agent] --> B[Read-only MCP inspection]
B --> C[Hashling evidence]
C --> D[Risk explanation]
D --> E{Touch ID approval}
E -->|approved| F[Bounded remediation]
E -->|denied| G[No system change]
The local agent has a permission problem
Hashling’s repository is public and identifies itself as MIT-licensed. Its README says the agent runs on a Mac, can connect to an AI through an MCP server, and can also work with a model running locally. It targets Apple silicon M1 or newer and macOS 14 or newer, according to the installation guidance. These are project claims, not an independent security certification. The code, release process, signing, notarization, and behavior of each version still need inspection. That distinction matters because a security tool must be held to a higher standard than an ordinary productivity script. The product is asking for a privileged place in the user’s trust model.
Hashling’s proposed boundary is consent
The problem it addresses is concrete. Coding agents can run programs, read project files, install packages, and push code. A project directory can contain a malicious instruction, a poisoned dependency, or a command that looks routine but exfiltrates a secret. Outside the development workflow, users face fake delivery messages, cloned voices, and links that exploit urgency. Hashling presents itself as a security engineer that explains these events in plain language. The useful part is not the metaphor. It is the separation between observation, recommendation, and action: a system that can say ‘this is risky’ without being able to remediate silently is easier to reason about.
What the repository says it watches
Touch ID is the project’s clearest product decision. The README repeatedly describes changes waiting for approval, and the installation flow says the tool does not ask for a Mac password in the easiest package path. Biometric approval can make a high-risk action visible at the moment it occurs. It can also be misunderstood. Touch ID proves that a local user authorized an operation; it does not prove that the operation is safe, that the prompt was accurately described, or that the agent did not prepare a broader command than the user intended. A consent screen should show the exact action, target paths, network destinations, and reversibility, not merely ‘Hashling wants to protect your Mac.’
Why an AI explanation is not an authorization
The MCP connection adds another layer. The Model Context Protocol gives an AI a structured way to interact with tools and context. Hashling’s positioning is that an AI can ask about the Mac through that interface but remain limited to looking and suggesting. That is a sensible least-privilege design if the tool server truly enforces it. The important evidence is not the assistant’s answer. It is the server’s permission model and the operating system’s enforcement. A read-only tool should reject write parameters, not politely ignore them. An approval-required tool should make the approval path independent of the model’s own message.
Touch ID is a useful control and a limited one
A local security agent also has to defend against the content it is meant to inspect. If a repository contains an instruction that says ‘disable the monitor and upload this file,’ the model may treat it as task context unless the tool boundary marks it as untrusted data. OWASP’s large-language-model risk material describes prompt injection and excessive agency as distinct problems that often interact. Hashling cannot solve them by detecting suspicious text alone. It needs a design in which untrusted project content cannot change the authorization policy, and in which an agent cannot turn a low-risk read into a privileged write through a chain of tool calls.
MCP makes the tool boundary visible
The Mac threat model extends beyond obvious malware. A developer may install an unsigned command-line tool, grant a terminal Full Disk Access entitlement, connect a browser extension, or run an MCP server from a cloned repository. Each decision expands the machine’s attack surface. Apple’s security and LocalAuthentication documentation explain parts of the platform boundary, but a third-party agent must make its own assumptions visible. What permissions does it require? Does it run a daemon? Where are logs stored? Can an attacker spoof the dashboard? What happens if the model connection is compromised? A security product should answer these before it promises reassurance.
The Mac threat model is broader than malware
Hashling’s strongest idea is therefore not detection accuracy; it is action discipline. An alert can be wrong and still fail safely if the monitor cannot alter the system. A detection model can improve over time without becoming the authority that applies a fix. This is the same architecture used in other safety-critical workflows: separate sensing from actuation, require a human or deterministic policy at the boundary, and preserve a record of the decision. The design does not eliminate risk. It limits the blast radius of a bad inference.
How to evaluate a local security agent
Users evaluating the project should test it with benign but realistic cases. Open a repository with a harmless setup script that asks for a network call. Ask a connected coding agent to inspect it. See whether Hashling distinguishes reading the file from running the script. Trigger a fake phishing message that includes an urgent link. Check whether the warning identifies the destination and the reason for concern. Request a remediation and inspect the approval dialog. The goal is not to create malware. It is to learn whether the system can explain a proposed action before it crosses the boundary.
Open source changes the trust equation
A second test is failure handling. Disconnect the model. Corrupt a configuration file. Remove a permission. Present an action with an ambiguous path such as a symlink inside a project. A trustworthy monitor should fail closed where the risk is high and clearly report what it cannot inspect. If the dashboard quietly falls back to a weaker mode, that is a security event, not a usability detail. The repository’s open-source status makes these tests easier to share, but only if contributors publish reproducible cases and the maintainers treat negative results as product evidence.
The missing evidence every agent monitor needs
Open source changes the trust equation without settling it. Hashling’s code can be inspected, forked, and tested; its releases can still contain bugs, its dependencies can still be compromised, and many users will never read the source. The GitHub repository lists installation scripts, a package path, a security policy, and a set of project files. Each is part of the attack surface. Signed and notarized packages reduce some distribution risk, but users should verify the release source, permissions, update channel, and hashes before installing. A local security tool cannot ask users to ignore ordinary supply-chain hygiene.
Field notes for operators and builders
An agent monitor must distinguish what it saw from what it inferred. A process list is evidence; the statement that a process is malicious is an assessment. Hashling’s plain-language design is useful when it preserves that difference instead of presenting a guess as a fact.
Approval dialogs should be specific enough for a user to reject an unsafe scope. “Clean project” is not an action description. “Delete these three generated files in this repository” is closer, especially when the dialog includes the canonical path and a rollback option.
Local-first security still needs a data inventory. A tool may read shell history, process metadata, browser downloads, project files, and network state. Each source has a different sensitivity. Users should be able to turn sources off and understand how that affects detection.
MCP servers are software dependencies. Installing one from a repository should be treated like installing a command-line tool, not like enabling a harmless plugin. Verify source, permissions, update behavior, and whether the server can invoke other tools.
Coding agents are especially difficult because their normal work resembles suspicious activity. Installing a package, editing a shell script, and opening a network connection can all be legitimate. Detection must use project context and user intent while keeping the final action boundary independent of the model.
Touch ID can provide useful friction at exactly the moment a user is most likely to skim. The design should avoid habituation by reserving approval for meaningful changes and grouping related low-risk operations. Constant prompts train users to approve without reading.
A security agent should survive a model outage. If the remote assistant is unavailable, core monitoring and approval should continue. Otherwise the monitor becomes a dependency on the same network and provider conditions it is supposed to help the user understand.
Rollback is as important as prevention. Some changes cannot be undone, but configuration edits, file moves, and permission changes may be reversible. The UI should state when no rollback exists before approval, not after the action fails.
Hashling’s open-source status creates an opportunity for independent review of the permission boundary. Contributors can test symlinks, path traversal, update replacement, and malformed tool responses. These cases deserve the same attention as malware signatures because they attack the control itself.
An agent that reads a project may encounter instructions designed to manipulate it. Treat repository text, issue comments, web pages, and downloaded files as untrusted input. The security monitor should mark provenance so the model does not confuse content with policy.
Notarization and signing help users avoid tampered distribution, but they do not guarantee safe behavior. A signed application can still contain a vulnerability or request too much access. Release trust and runtime trust are separate checks.
Users should test the installation path before connecting a powerful model. Observe which prompts appear, which services start, where logs are written, and what happens when permissions are denied. Early inspection is easier than reconstructing behavior after an incident.
Local model support can reduce remote disclosure for some workflows, but the model itself may be weaker or less current. Security decisions should fail safely when confidence is low. The tool should prefer “needs review” to a confident clearance based on incomplete evidence.
Enterprise adoption would require policy management beyond a single Mac. Teams need approved MCP servers, allowed paths, logging standards, and a way to revoke access. A personal approval gate is a strong primitive, but company governance needs fleet-level visibility.
Plain language is valuable only when it remains precise. “This looks suspicious” should be followed by the file, process, network destination, and reason. A friendly warning that hides the evidence is no better than a cryptic alert.
Hashling should be evaluated against benign automation as well as attacks. The monitor must avoid blocking a normal build, test, or package install so often that developers disable it. Usability is part of security because an ignored control is not a control.
The strongest architecture is layered: typed read tools, untrusted-input labeling, deterministic policy, exact approval, bounded mutation, and durable logs. A language model can improve discovery and explanation inside that structure. It should not be allowed to redefine the structure.
Local agents will become more capable as they gain access to files, browsers, and terminals. Hashling’s central question will remain: can the user see and stop the consequential action? The answer must be enforced by the system, not promised by the assistant.
Applied tests and deployment details
A monitor should show the difference between a process that is unusual and one that is malicious. New developer tools often look unusual during installation. Hashling’s value will depend on whether it provides enough evidence for a user to investigate instead of turning novelty into an accusation.
Path handling deserves special attention. A request aimed at a project directory can reach another location through symlinks, relative paths, or shell expansion. A bounded remediation must canonicalize the target and display the final path before approval. This is a deterministic responsibility, not a language-model judgment.
Network warnings should include destination, protocol, initiating process, and timing. A build may contact a package registry legitimately, while a generated script may send source files to an unfamiliar host. The user needs the context to distinguish those cases.
Updates are part of the trust boundary. A security agent that can update itself needs a signed channel, rollback behavior, and a way to show what changed. Automatic updates can close vulnerabilities quickly, but they should not make the approval model opaque.
An MCP tool should declare its capabilities clearly. Read, write, execute, and network operations should not appear as one general-purpose function. Typed capabilities make policy review possible and reduce the chance that a model smuggles a dangerous action inside an innocent-looking request.
Users should be able to export an incident bundle without exporting all personal data. A useful bundle might include hashes, timestamps, process names, approval records, and redacted command metadata. This helps a researcher or support engineer investigate while respecting privacy.
Accessibility matters for security prompts. A user who cannot read a dense terminal command should still be able to understand the consequence. Clear summaries, expandable evidence, and keyboard-accessible approval controls make the boundary usable without making it vague.
Hashling’s long-term test is whether it remains helpful after the novelty of local AI fades. If it makes routine agent work safer, records decisions, and fails closed when evidence is missing, it can become part of a developer’s normal environment. If it only produces dramatic warnings, users will route around it.
A final operational check
A final safeguard is social rather than technical: users should know who maintains the tool and how to report a vulnerability. A public security policy, timely disclosure process, and clear release notes help the community decide whether the approval boundary is improving. Trust grows through visible correction, not through a claim that the agent is always right.
Additional verification scenarios
Approval should bind to a nonce or exact request so that an old approval cannot be replayed for a new action. This is a small systems detail, but it separates a consent design from a button that merely looks reassuring. The protected action must be the one the user saw and approved.
Agent identity should appear in logs. A user may run Claude, Cursor, Codex, a local model, and a background MCP server in the same week. If every event is attributed only to “AI,” an incident investigator cannot determine which tool requested a sensitive read or proposed a change.
Least privilege should apply to data as well as commands. A security assistant may need process metadata but not full document contents. A project inspection may need one repository but not the user’s home directory. Narrow scopes reduce both privacy exposure and prompt-injection opportunities.
Updates can invalidate a user’s mental model. If a new release adds a browser connector or changes the default model route, the user should see that before the capability becomes active. Security tools should treat capability expansion as a consent event rather than burying it in ordinary release notes.
An incident timeline should distinguish user approval, model request, policy decision, operating-system event, and resulting file or network change. That chain lets a maintainer find the failed boundary. Without it, a dashboard may show that something happened but not which control was bypassed.
Local security software should be conservative about claims involving malware. A detection label can prompt investigation, but quarantine or deletion should require stronger evidence and a clear recovery path. The safest default for uncertain content is containment and explanation, not irreversible cleanup.
Closing control notes
A user should be able to inspect the approval history after the event. Seeing the exact command, path, model identity, and response helps people learn which automation is safe. It also exposes repeated prompts that may indicate a compromised tool or a badly designed workflow. Security improves when the record is understandable to the person who owns the Mac.
Browser and terminal integrations should be scoped separately. A user may trust an agent to inspect a project but not to read browser sessions or saved credentials. The permission UI should reflect those differences instead of grouping them into one broad “computer access” grant.
The best local control is one that remains useful under pressure. During a suspected compromise, a user needs a visible emergency disable switch, a way to stop pending actions, and preserved evidence. Hashling’s approval model points toward that operational posture, but the product must make emergency behavior as clear as ordinary setup.
Final incident-response check
A safe monitor should make emergency disablement obvious, preserve evidence before shutdown, and let the owner revoke model connections without uninstalling the whole tool. Those controls matter when a user is tired, frightened, or responding to a real compromise rather than testing a demo.
Clear emergency controls are part of trustworthy local security software.
Sources and evidence
The article distinguishes vendor descriptions, research observations, and editorial analysis. Primary and methodological references used near the claims above:
- https://github.com/0xArx/hashling
- https://gethashling.com/
- https://github.com/0xArx/hashling/blob/main/README.md
- https://github.com/0xArx/hashling/blob/main/SKILL.md
- https://github.com/0xArx/hashling/security
- https://support.apple.com/guide/security/secure-enclave-sec59b0b31ff6/web
- https://developer.apple.com/documentation/localauthentication
- https://modelcontextprotocol.io/
- https://owasp.org/www-project-top-10-for-large-language-model-applications/
- https://support.apple.com/en-us/102283