Axiom records you filling the form once. Fazm reads the four SQLite files your browser already has and fills any new form on any site on day one.
Every top-ten result for “axiom browser automation” assumes you will teach the tool what to type by recording yourself typing it. That is a tax on every new workflow. Fazm skips it by reading your Chromium profile database on the first run: Web Data, Login Data, History, and Bookmarks from Arc, Chrome, Brave, and Edge. The agent then has a real profile of you before the first click, so form-filling on any site, including sites you have never automated, works from turn one. No recording, no CSV, no hard-coded steps.
The shape of the pipeline
Four browsers get read locally by one small Swift library. The library writes a normalized profile to a SQLite file on your Mac, and Fazm's agent turns that profile into real values it types into any form on any site.
BrowserProfileLight, in one picture
“The thing no competitor page mentions: Fazm does not keep its own identity form. Instead, BrowserProfileLight iterates ~/Library/Application Support/{Arc/User Data, Google/Chrome, BraveSoftware/Brave-Browser, Microsoft Edge} (Constants.swift lines 95-104), and for every profile inside opens four files: Web Data, Login Data, History, and Bookmarks. The Web Data SQLite schema stores autofill as integer type codes (3 first_name, 5 last_name, 9 email, 14 phone, 33 city, 77 street_address; Constants.swift lines 3-17). Fazm decodes those into a normalized profile and writes it to ~/ai-browser-profile/memories.db. That is the file the agent queries every time you say 'fill this form'. Nothing leaves the machine (fazm-tools-stdio.ts:342).”
/Users/matthewdi/fazm/ai-browser-profile-swift-light/Sources/AutofillExtractor/Constants.swift
The four files Fazm opens on every run
Chromium already stores a very good profile of you locally. It just does not expose that profile to any agent. BrowserProfileLight reads it directly, file by file, in a single ~1-2s pass.
Web Data
SQLite file at ~/Library/Application Support/<browser>/**/Web Data. Fazm pulls addresses, autofill field history, and saved credit cards. Each row is keyed by a type code (3 first_name, 9 email, 14 phone, 77 street_address, per Constants.swift:3-17) and tagged for search.
Login Data
SQLite file with logins.origin_url and logins.username_value. Fazm reads only the username column, never passwords. The output gives the agent a map of 'I am m13v on GitHub, matt@mediar.ai on Vercel, i@m13v.com on Notion'.
History
SQLite file with urls.url and urls.visit_count. Fazm collapses to hosts, keeps the top ~50 by visit count, and translates known domains to friendly names (github.com to GitHub, chatgpt.com to ChatGPT, per Constants.swift serviceNames map).
Bookmarks
JSON file, not SQLite. Fazm walks the tree, extracts the bookmarked hosts, and adds them to the tools list with a 'bookmark' tag. Gives the agent a second signal for which SaaS tools you actually use.
Authoring a fresh workflow, two ways
The browser is the same. The target page is the same. The cost of the first run is different.
First run of a new form-fill workflow
You open the site, open the Axiom panel, and record every click. You hand-type your own email, your own phone, your own address into each field. Then you save the recording with hard-coded values. The workflow is the recording. When the site ships a redesign, the recording breaks and you re-record.
- You fill the form manually, once, while recording
- Your identity is frozen into the steps as plain strings
- Every new workflow is a new recording pass
- A redesign means you re-record
What happens during a single form-fill turn
This is the full message trace when you type “register me for the webinar” into the Fazm floating bar. No new authoring, no recording. Every step maps to a real MCP call in the acp-bridge logs.
Agent turn: snapshot, resolve, type, submit
The exact paths Fazm walks on your Mac
This is copy-pasteable from the open-source Swift library. If you want to audit what Fazm looks at before running it, read this file and run ls against the paths.
The Chromium type-code map, decoded
Every autofill row in Chromium's Web Data is keyed by an integer (the address_type_tokens code). Fazm has a single Swift map that turns those integers into human keys plus tags. The same map normalizes dozens of real-world field-name spellings.
Same workflow, two authoring contracts
Pinning a recording to a selector and a literal string works until the site renames either. The profile-plus-LLM version binds at runtime.
Sign up for a webinar
# Axiom: authoring a "sign me up for this webinar" workflow
#
# You do this by hand, one time, in the Axiom recorder:
open https://webinar.example.com/register
click [data-test="email-input"]
type [data-test="email-input"] "matt@mediar.ai"
click [data-test="first-name-input"]
type [data-test="first-name-input"] "Matthew"
click [data-test="last-name-input"]
type [data-test="last-name-input"] "Diakonov"
click [data-test="company-input"]
type [data-test="company-input"] "Mediar"
click [data-test="phone-input"]
type [data-test="phone-input"] "+1 555 0142"
click [data-test="role-select"]
select [data-test="role-select"] "Founder"
click [data-test="submit-button"]
# Webinar site redesigns next month. Every selector 404s.
# You re-record the whole thing.What extract_browser_profile actually does on your Mac
One way to see what Fazm reads is to run the open-source CLI directly. Same code path the desktop app uses, just without the chrome.
Axiom Browser Automation versus Fazm, dimension by dimension
Both run on a Mac. Both can fill a HubSpot lead form or register for a webinar. What happens the first time you point them at a new site is different.
| Feature | Axiom Browser Automation | Fazm |
|---|---|---|
| What the first run of a new workflow requires from you | A training pass. You open Axiom, record every click, and type real values into every field by hand. | Nothing. The agent already has your profile from the Chromium SQLite files it scanned when you opened Fazm. |
| Where the values that get typed come from | Hard-coded strings inside the recorded macro, or a spreadsheet you pipe in per run. The bot does not know who you are. | ~/Library/Application Support/{Arc, Chrome, Brave, Edge} Web Data table (autofill_profile_addresses, credit_cards), Login Data table (logins.username_value), History (top 50 visited hosts), Bookmarks JSON. |
| Chromium address type code mapping | Not applicable. Axiom does not read the browser's local identity store. | addressTypeMap in Constants.swift:3-17 maps 3 to first_name, 5 to last_name, 9 to email, 14 to phone, 33 to city, 77 to street_address. Matches the Chromium source. |
| How the live Web Data SQLite is read without locking Chrome | N/A. Axiom runs as a Chrome extension in the page, not against the profile store on disk. | AutofillExtractor.swift:53-54 copies each SQLite file to a temp path before opening it. Your browser is never locked, even mid-session. |
| Supported browsers | Chrome extension first, Firefox port second. No native Mac scope. | Arc, Chrome, Brave, Edge out of the box. Same code path, same normalization (Constants.swift:95-104). Extensible to Safari and Firefox via separate extractors. |
| When a site adds a new field you have never filled | The recorded macro has no rule for that field. It stops, or you edit the recording and add a step. | The agent reads the snapshot, sees a label like 'Postal code', and pulls zip from the profile (normalized via autofillFieldMap in Constants.swift line 51-55: zip, zipcode, postal, postalcode, postal_code, postcode all map to zip). |
| Freshness guarantee | Whatever you typed into the recording is frozen. A new credit card or moved address means re-recording the macro. | query_browser_profile auto-triggers a new extract if the profile is missing, stale (>24h), or incomplete. You do not maintain a data source. |
| Where the data lives | A recorded macro, plus any CSVs you supply, plus whatever session cookies Chrome has. The bot does not keep a profile. | ~/ai-browser-profile/memories.db on your Mac. Zero network calls during extraction. extract_browser_profile tool description says 'nothing leaves the machine' (fazm-tools-stdio.ts:342). |
| Authoring cost per new workflow | One recording pass per workflow, plus a re-record whenever the site redesigns. | One sentence. The agent binds fields to profile values at runtime from autofillFieldMap plus the snapshot labels. |
| What you can edit after the fact | Every hard-coded value in every recorded step has to be edited by hand. | edit_browser_profile delete|update lets the agent or you correct any memory by query string. Wrong old phone? One call removes it. |
Where having a real profile on tap actually matters
Any form where “who am I” has to be answered correctly. A recording is fine for a spreadsheet row. Your identity is not a row.
Six steps, from first launch to first fill
All six happen on your Mac. The first five run once, in about two seconds. The sixth is every form you ever fill from that moment on.
Open Fazm on your Mac
The first time it runs, Fazm asks for Full Disk Access. That is the only way macOS lets one app read another app's sandboxed files, including Chrome's Web Data.
The agent calls extract_browser_profile
One of two tools in Fazm's ALWAYS_AVAILABLE set (the other is ask_followup), per acp-bridge/src/fazm-tools-stdio.ts:265-268. Takes ~1-2 seconds. Runs locally.
BrowserProfileLight walks the Chromium paths
Iterates ~/Library/Application Support/{Arc/User Data, Google/Chrome, BraveSoftware/Brave-Browser, Microsoft Edge}. For each profile inside, opens Web Data, Login Data, History, and Bookmarks. Copies the SQLite files to a temp path first, reads them, deletes the temp path.
Values get normalized against a type map
Chromium's address_type_tokens code 9 becomes 'email' with tags ['identity', 'email', 'communication']. Messy form-field names like 'emailaddress' and 'email-form-field' all collapse to the same 'email' key via autofillFieldMap in Constants.swift.
Profile is written to ~/ai-browser-profile/memories.db
A small SQLite file on your disk. This is the structured identity the agent queries every time you ask it to fill a form. query_browser_profile supports tag filters like 'identity', 'payment', 'address'.
Next time you type a sentence, the agent fills
'Sign me up for this newsletter' triggers a Playwright snapshot of the page, a query_browser_profile('email'), and a browser_type call with the resolved value. No recording step ever happened.
What stays on your Mac, explicitly
People ask about this more than any other question. The short version: extraction is local-only, passwords are never read, and even the temp copies of the SQLite files are deleted on the same function return.
The privacy boundary, point by point
- No network call during browser profile extraction. It is a local SQLite read.
- No password read. LoginsExtractor opens logins but only projects origin_url and username_value.
- The Chromium Web Data file is copied to a temp path before reading, so Chrome is never locked (AutofillExtractor.swift:53-54).
- The extracted profile is written to ~/ai-browser-profile/memories.db on your Mac.
- The temp copies are deleted on the defer path; each extraction leaves no trace in /tmp.
- If you do not grant Full Disk Access, the scan quietly returns nothing. Nothing is silently sent anywhere.
Stop re-typing your own email into every automation.
Fazm extracts your Chromium profile in about one second on first launch, then fills any form on any site without a recording. Free to download, one-time install, MIT-licensed libraries under the hood.
Download Fazm →See the Chromium profile extract on a real Mac, in real time
Book 20 minutes and we'll run extract_browser_profile against your machine, then automate a form you pick during the call.
Book a call →Axiom browser automation, answered against the Fazm source
Is Fazm a replacement for Axiom Browser Automation?
If the job you hired Axiom for was 'fill in this form on this site every time a new row lands in a sheet,' then yes, Fazm replaces that workflow without the record-and-replay step. If the job was 'export this table to CSV every morning,' Fazm does that too. Fazm is a Mac desktop agent that drives your real browser and your Mac apps in the same sentence. What makes the comparison interesting is that Fazm starts with a profile of who you are, pulled from the browser you already use, so the agent can type real values into any form, not just forms it has seen before.
Where exactly does Fazm read browser autofill data from on my Mac?
Four paths: ~/Library/Application Support/Arc/User Data, ~/Library/Application Support/Google/Chrome, ~/Library/Application Support/BraveSoftware/Brave-Browser, and ~/Library/Application Support/Microsoft Edge. For each path, Fazm iterates every Chromium profile inside, and for each profile opens four files: Web Data (autofill addresses, form field history, credit cards), Login Data (origin_url and username_value; passwords are skipped), History (top-visited hosts), and Bookmarks (JSON). The code is ai-browser-profile-swift-light/Sources/AutofillExtractor/Constants.swift lines 95-104 for the browser paths and AutofillExtractor.swift for the extraction loop.
How does Fazm read SQLite files while the browser is running?
It copies the file to a temp path before opening. AutofillExtractor.swift line 53-54 shows the pattern: copyToTemp(webDataPath) returns a temporary URL, a defer block deletes the temp directory on return, and only the copy is passed to SQLiteDatabase. This avoids taking a lock on the live Web Data file that your browser is using, which is the common reason other tools hit 'database is locked' errors. It also means you can use Fazm mid-session with no interruption.
Does Fazm send my browser data to a server?
No. The extraction is pure local: Swift reads SQLite, writes the result to ~/ai-browser-profile/memories.db on your disk. The extract_browser_profile tool description in acp-bridge/src/fazm-tools-stdio.ts line 342 says it verbatim: 'Extracted locally from browser SQLite files, nothing leaves the machine.' The agent can then query that profile over the MCP interface, still locally. Whatever model you connect to (Anthropic, OpenAI, or a local Ollama) will see only the profile fields the agent chose to include in a given prompt, not the raw database.
What does the Chromium address_type_tokens code map look like?
Fazm ships the exact decoding table in ai-browser-profile-swift-light/Sources/AutofillExtractor/Constants.swift lines 3-17: 3 is first_name, 5 is last_name, 7 is full_name, 9 is email, 14 is phone, 33 is city, 34 is state, 35 is zip, 36 is country, 60 is company, 77 is street_address, 79 is address_line_2. This is how Chromium itself stores autofill data. Fazm reads the same integers and maps them to human-friendly keys with tags, so the agent can ask 'give me everything tagged identity' or 'give me email' and get a structured answer.
What if a site uses a field name like 'postalcode' that the Chrome autofill code never saw?
Fazm normalizes via autofillFieldMap in Constants.swift. zip, zipcode, postal, postalcode, postal_code, and postcode all resolve to the same key ('zip'). So do the four ways sites spell first-name (first_name, first-name, firstname, given-name). The agent does not have to care which spelling a given site used. When the site ships a redesign and renames a field, as long as the new name is within the autofillFieldMap aliases, the fill still works. When the name is novel, the agent falls back to reading the snapshot label (human-readable, like 'Postal code'), which usually disambiguates.
How does Fazm know when to refresh the profile?
The tool description for query_browser_profile says it auto-triggers a new extract if the profile is missing, stale (>24h), or incomplete. So a user who adds a new credit card in Chrome on Monday and uses Fazm on Tuesday gets the fresh entry without any manual step. You can also call extract_browser_profile directly to force a refresh, or use edit_browser_profile to delete or update a specific memory by query string.
Does this only work for Chromium browsers, or does Safari and Firefox count?
The Swift library's headline support list is Arc, Chrome, Brave, and Edge (Chromium), because they all share the same Web Data, Login Data, and History SQLite schema plus the Bookmarks JSON shape. Safari stores data in a different set of files under ~/Library/Safari and Firefox profiles live at ~/Library/Application Support/Firefox/Profiles. The code has the path constants for both (Constants.swift lines 107-112) and dedicated extractors can be added. For most new-Mac users in 2026, the Chromium big-four path hits the autofill they actually filled in.
Why read the browser profile instead of just asking me for the values in onboarding?
Two reasons. First, a fresh identity form is friction: users type their own email into the same tool twice. Second, your Chromium autofill is already a living document. It knows your new address before any onboarding form would. Reading it directly means the agent never falls behind on who you are. The alternative, which Axiom does by default, is to hard-code the values into each recording, which is exactly the brittleness Fazm avoids.
How does Fazm actually fill the form once it has the profile?
In the same agent turn as the browser automation. Playwright MCP returns a text snapshot of the current tab where every input carries a human-readable label and a ref like [ref=e12]. The agent reads the snapshot, for each input finds the best match in the profile via query_browser_profile, then calls browser_type(ref='e12', text='matt@mediar.ai'). One of the things that makes the approach durable is that when a site redesigns and renames a selector, the label in the snapshot almost always stays the same ('Email', 'Phone'), so the profile-to-ref binding still resolves.
Is the source for this open?
Yes. The Swift library is github.com/m13v/ai-browser-profile-swift-light (MIT, zero dependencies, Foundation plus system SQLite only). The Fazm desktop app is github.com/mediar-ai/fazm. The three files relevant to this page are ai-browser-profile-swift-light/Sources/AutofillExtractor/AutofillExtractor.swift, Constants.swift, and acp-bridge/src/fazm-tools-stdio.ts. File paths and behaviors on this page are verified against the repos on 2026-04-19.
More on the shape of Mac-native automation
Neighboring guides
Browser Automation Studio compared against a Mac-native agent
Another recorder-first RPA approach, matched against the same extract-once, fill-anywhere profile model.
Accessibility API desktop automation vs screenshot agents
Why the same snapshot that drives form-fill on the web drives every other app on a Mac, without pixel guessing.
Web browser automation tools, organized by how they bind to the page
Selector-bound recorders, vision-bound screenshot agents, label-bound accessibility agents. Fazm sits in the third camp.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.