Local AI agents17 bundled, not a frameworkSource-verified, April 19 2026

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.

F
Fazm
10 min read
4.9from 200+
17 agents bundled, counted via ls Desktop/Sources/BundledSkills/*.skill.md
Every claim traced to a file and line in the open-source Fazm Swift repo
Verifies against the April 2026 top-10 SERP for local ai agents
17 agents

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.

LocalAI (framework)LocalAGI (framework)Letta (framework)AutoGPT (framework)Ollama + Python glueLangGraph localCrewAI localn8n self-hostedDify self-hostedCline (coding only)Fazm (17 pre-built agents)

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

Your prompt
Your voice
A dropped file
A scheduled task
Fazm dispatcher
pdf
travel-planner
social-autoposter
deep-research
xlsx
video-edit

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.

Desktop/Sources/SkillInstaller.swift, lines 29-40 and 100-141
0Agents bundled with the app
0Categories in the onboarding list
0File per agent (.skill.md)
0Bits of checksum per agent

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.

pdf

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

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

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

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

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

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

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.

/private/tmp/fazm.log

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.

FeatureTypical local-agent frameworkFazm
Shape of the productPython framework or Docker stackConsumer macOS app, signed and notarized
What you get on day oneEmpty runtime, you write the agents17 specialized agents installed for you
Where agents liveFramework-specific classes, YAML, or graphs~/.claude/skills/<name>/SKILL.md plain markdown
How agents get updatedpip install -U or git pull, manualSHA-256 diff on app launch, automatic overwrite
How you add an agentWrite a Python class, wire it into a graphDrop a .skill.md in ~/.claude/skills or run find-skills
Category / onboarding UXNo onboarding, you hunt on GitHubGrouped into 7 categories in the onboarding list
Where agents can actBrowser-only or custom-integration-onlyAny 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.

fazm.AI Computer Agent for macOS
© 2026 fazm. All rights reserved.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.