A Mac app that ships 17 local AI agents, one per markdown file in the bundle
Every top result for this keyword points at a framework: LocalAI, LocalAGI, Letta, AutoGPT, Ollama-plus-Python. Useful, and also the wrong shape for someone who just wants a travel planner, a deep researcher, a pdf agent, and a social autoposter running on their Mac this afternoon. Fazm is the other shape. It is a consumer macOS app that arrives with 17 specialised agents already bundled, one per .skill.md file, and an installer that copies the whole library to ~/.claude/skills/ on first launch. This page walks through what those 17 agents are, how the installer routes them, and why the plural matters.
“Fazm's Desktop/Sources/BundledSkills/ directory contains exactly 17 .skill.md files on 2026-04-19. SkillInstaller.swift enumerates them at bundledSkillNames (line 30), hashes each with SHA-256 against the installed copy at ~/.claude/skills/<name>/SKILL.md (lines 114-131), and groups them into 7 categories declared in the categoryMap dictionary at line 14. Category order: Personal, Productivity, Documents, Creation, Research & Planning, Social Media, Discovery.”
Desktop/Sources/SkillInstaller.swift + Desktop/Sources/BundledSkills/
What the top search results actually recommend
Every one of these is a runtime or a framework. Useful if you want to build an agent. Less useful if you want to open an app and have one.
How your chat reaches the right local agent
When you type a prompt into Fazm, the runtime does not guess. It takes your text, compares it against the YAML description field of every installed agent, and routes to whichever matches. The description field contains explicit trigger phrases the agent author wrote themselves (for example the pdf agent fires on any mention of a .pdf). Your prompt enters on the left, one of 17 agents picks it up, and that agent returns the answer.
Prompt in, one of 17 agents out
The installer that makes local AI agents plural
This is the function Fazm runs every time you open the app. It walks its own app bundle for *.skill.md files, compares each to the version on your disk, and writes the updated ones into ~/.claude/skills/. No telemetry, no version numbers, just SHA-256.
The 17 local AI agents Fazm ships with
Every entry below corresponds to a real file in Desktop/Sources/BundledSkills/. The description text in each YAML header is what the dispatcher matches your prompt against, so the wording matters. I have paraphrased it here to keep the cards skimmable.
ai-browser-profile
Personal · Queries your own browser-extracted profile (identity, accounts, contacts, payments) so the rest of the agents have context about who you are and what tools you use.
google-workspace-setup
Productivity · One-shot wizard that creates your personal Google Cloud OAuth app via browser automation so Gmail / Calendar / Drive / Docs / Sheets agents can actually read and write your data.
telegram
Productivity · Sends and receives Telegram messages. Handles the one-time auth and then your chat agent can simply say send Alice a message, it goes out.
Documents · Read, extract text and tables, split, merge, annotate PDFs. Fired by any prompt that involves a .pdf file as input or output.
docx
Documents · Create, read, edit Microsoft Word files. Triggers on any mention of a .docx, any contract, proposal, or letter with Word-specific formatting.
xlsx
Documents · Spreadsheet agent. Opens, edits, generates .xlsx files with real formulas, charts, and formatting, not CSV hacks.
pptx
Documents · Slide decks. Uses python-pptx to build real .pptx files with layouts, images, and speaker notes instead of markdown dumps.
doc-coauthoring
Creation · Structured co-authoring workflow for long-form docs, proposals, technical specs. Enforces outline first, draft second, revise third.
canvas-design
Creation · Visual art in .png and .pdf, via a design-philosophy-driven pipeline. Posters, cards, printed pages.
frontend-design
Creation · Production-grade frontend components and pages. Opinionated on typography, spacing, motion, and colour.
video-edit
Creation · Edits long videos into short story-driven clips using transcript analysis plus ffmpeg. No manual timeline work.
deep-research
Research & Planning · Eight-phase research pipeline with source-credibility scoring and citation tracking. Reserved for comprehensive comparisons, not quick lookups.
travel-planner
Research & Planning · Plans trips end to end: itinerary, budget, bookings, destination research. Uses web tools and a calendar model.
web-scraping
Research & Planning · Python-based web scraping and structured data extraction. The one that does the heavy lifting for deep-research and travel-planner.
social-autoposter
Social Media · Posts and comments on Reddit, X, LinkedIn. Finds relevant threads, drafts comments, tracks engagement stats in a local SQLite DB.
social-autoposter-setup
Social Media · Interactive wizard that installs social-autoposter via npm, creates its database, configures accounts, and verifies the browser cookies.
find-skills
Discovery · The meta-agent. When you ask can you do X, it searches skillhu.bz and skills.sh for a community agent that matches and installs it for you.
What the installer does on every launch
Every single launch of the app runs the six steps below. No background job, no cron, no update server. The contract is simple: whatever is in the app bundle becomes the canonical truth, and whatever is on disk lines up with it within milliseconds of the window appearing.
1. App bundle scan at bundledSkillNames
On launch, Fazm enumerates its own app bundle for every .skill.md file under BundledSkills/. File names become agent names. Seventeen agents, seventeen files, no config. Source: SkillInstaller.swift line 30.
2. SHA-256 comparison per agent
For each bundled agent it hashes the bundled copy and the already-installed copy at ~/.claude/skills/<name>/SKILL.md. If the hash matches, skip. If it differs, overwrite. No version numbers, no release notes. Source: SkillInstaller.swift lines 114-131.
3. New agents get a fresh directory
If ~/.claude/skills/<name>/ does not exist yet, Fazm creates it, copies the .skill.md in as SKILL.md, and flags it as installed in the run summary. Source: SkillInstaller.swift lines 132-141.
4. Obsolete agents get removed
Anything in the obsoleteSkills list (currently just hindsight-memory) gets deleted from ~/.claude/skills/ on every launch so old agents do not stay around after the app drops them. Source: SkillInstaller.swift line 66.
5. npm-backed agents update in the background
A handful of agents (right now just social-autoposter) live as npm packages. Fazm runs npm view to check the remote version, compares to the local package.json, and fires npx <package> update if a newer version exists, all on a background queue. Source: SkillInstaller.swift lines 183-248.
6. Toast on update, log for audit
Every install/update emits a Toast (Skill updated: <name>) and a line to the app log. The daily PostHog state report includes installed_skills_count and the full comma-joined list, so support can reproduce the exact agent set a user is running. Source: SkillInstaller.swift lines 160-168 and 253-287.
What the install log looks like on a real Mac
This is the one line Fazm writes to the log every launch, pulled from /private/tmp/fazm.log. It tells you which agents were installed new, which were updated because the SHA changed in a release, and which were skipped because nothing had changed since the last launch.
Fazm vs. the local-agent frameworks the SERP recommends
This is not a vs-framework fight. Frameworks are wonderful, and I run a couple of them on the side. It is a shape comparison. Fazm is shaped like an app; LocalAI, Letta, AutoGPT are shaped like toolkits. Pick by the shape that matches the afternoon you have.
| Feature | Typical local-agent framework | Fazm |
|---|---|---|
| Shape of the product | Python framework or Docker stack | Consumer macOS app, signed and notarized |
| What you get on day one | Empty runtime, you write the agents | 17 specialized agents installed for you |
| Where agents live | Framework-specific classes, YAML, or graphs | ~/.claude/skills/<name>/SKILL.md plain markdown |
| How agents get updated | pip install -U or git pull, manual | SHA-256 diff on app launch, automatic overwrite |
| How you add an agent | Write a Python class, wire it into a graph | Drop a .skill.md in ~/.claude/skills or run find-skills |
| Category / onboarding UX | No onboarding, you hunt on GitHub | Grouped into 7 categories in the onboarding list |
| Where agents can act | Browser-only or custom-integration-only | Any app on your Mac via accessibility APIs |
Adding your own agent or pulling one from a marketplace
The 17 agents are the default library. They are not a ceiling. The dispatcher scans every sub-directory of ~/.claude/skills/, not just the ones Fazm installed, so anything with a valid SKILL.md becomes available. Here is how the two paths work.
Hand-write one
Three things make it a valid agent
- YAML frontmatter with name and description
- Markdown body with instructions and examples
- Saved at ~/.claude/skills/<name>/SKILL.md
Install from a marketplace
The find-skills agent does it for you
- Asks what capability you need
- Searches skillhu.bz and skills.sh in parallel
- Installs the one you pick into ~/.claude/skills/
Open the app, skip the framework
Fazm for Mac arrives with 17 local AI agents already installed, grouped into 7 categories, ready to fire the moment you type a prompt. Free to start, open source, signed and notarized.
Download Fazm →Frequently asked, answered against the source
Frequently asked questions
What are local AI agents in the way Fazm uses the term?
A local AI agent in Fazm is a single .skill.md file sitting on your disk. The file contains YAML frontmatter with a name and a description, followed by instructions that tell the model when to act and how. When your chat arrives, the runtime scans the description fields of every installed agent, picks the one whose trigger language matches your request, and hands control to that agent. Fazm ships with 17 of these files pre-bundled and installs them to ~/.claude/skills/ on first launch. That is the plural in local AI agents: not one assistant, a library of them, each specialised.
Where exactly do the 17 bundled agents live in the Fazm source?
Desktop/Sources/BundledSkills/ in the open-source repository at github.com/mediar-ai/fazm. One file per agent. The current list, pulled from that directory on 2026-04-19: ai-browser-profile, canvas-design, deep-research, doc-coauthoring, docx, find-skills, frontend-design, google-workspace-setup, pdf, pptx, social-autoposter, social-autoposter-setup, telegram, travel-planner, video-edit, web-scraping, xlsx. The dispatcher that installs them is Desktop/Sources/SkillInstaller.swift.
How does Fazm decide whether to re-install an agent on launch?
SHA-256 checksum. For every bundled .skill.md, the installer hashes the bundled copy and the already-installed copy at ~/.claude/skills/<name>/SKILL.md. If the hashes match, it skips. If they differ, it overwrites. No version numbers, no release notes, no manifest. The logic is in SkillInstaller.swift lines 114-131. The obsolete list (currently just hindsight-memory) is deleted on every launch so retired agents do not linger.
Which seven categories do the agents get grouped into, and who decides?
Categories are defined by the categoryMap dictionary at SkillInstaller.swift line 14. In onboarding order: Personal, Productivity, Documents, Creation, Research & Planning, Social Media, Discovery. Anything not in the map falls into Other. The mapping is UI-only, it is not stored in the agent files themselves, so moving an agent to a different category is a one-line code change rather than editing every .skill.md. The order comes from categoryOrder at line 25.
Can I add my own local AI agent, or am I stuck with what Fazm ships?
Drop any .skill.md into ~/.claude/skills/<your-agent-name>/SKILL.md and it becomes available. The YAML frontmatter needs name and description. Everything else is markdown instructions. Fazm never deletes files it did not install; the obsoleteSkills list is narrow and explicit. If you want to discover new agents instead of writing them, the bundled find-skills agent searches skillhu.bz and skills.sh, two community marketplaces, and installs whatever you pick.
Do the agents run offline?
The agent library itself is 100 percent offline. Installation, dispatch, and the .skill.md contents never hit a network. Individual agents can still call out, deep-research does web searches, travel-planner hits flight APIs, telegram talks to Telegram, but the routing layer and the agent definitions are local. That is the honest answer. If you pair this with a local inference runtime like Ollama or LM Studio, you get a fully offline agent stack. If you use Fazm's default Claude backend, the model round trip is the only cloud dependency.
How does Fazm handle an npm-backed agent like social-autoposter?
One of the agents (social-autoposter) lives as an npm package rather than a static markdown file, because it needs code, a database, and a CLI. At app launch, a background queue runs npm view social-autoposter version, compares to the local package.json, and if newer fires npx --yes social-autoposter update. A Toast pops on success. The registry is the npmSkills array at SkillInstaller.swift line 177, so adding another npm-backed agent is one entry. Source: lines 183-248.
How is this different from running Ollama or Letta locally?
Ollama and Letta are runtimes. They give you an inference engine plus a framework for building agents; you still have to write the agents. Fazm is the opposite orientation: it is a consumer Mac app that arrives with 17 agents already written, installed, and categorised, and a routing layer that sends your prompt to the right one. If you want infinite flexibility, run Ollama plus a Python framework and write your own. If you want to open the app and have a travel planner, a social autoposter, a pdf editor, and a deep researcher the same afternoon, Fazm is the shorter path.
What stops a bad agent from silently overwriting my work?
Three things. One, the SkillInstaller only ever writes to ~/.claude/skills/<name>/SKILL.md, a dedicated agent-definition directory that does not touch your documents. Two, the installer never runs code from the .skill.md at install time, it just copies a markdown file. Three, every agent runs under Fazm's broader tool-gating: the SQL tool blocks DROP/ALTER/CREATE/PRAGMA/ATTACH/DETACH/VACUUM, write tools go through Claude Code with permission prompts per action, and the session replay pipeline records what each agent did so you can inspect any run after the fact.
Is Fazm's agent library open source? Can I audit these claims?
Yes. The desktop app is MIT-licensed at github.com/mediar-ai/fazm. Every line referenced here is a real line in Desktop/Sources/SkillInstaller.swift and every agent file is a real .skill.md in Desktop/Sources/BundledSkills/. The 17-agent number comes from ls Desktop/Sources/BundledSkills/*.skill.md | wc -l, which returned 17 on 2026-04-19.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.