A free file explorer built out of modules

Mutka keeps a tiny core and lets everything else (even copy-paste) snap on as modules. Create one and plug it.

$ curl -fsSL https://mutka.app/install/latest.sh | bash

macOS only · Windows coming soon

Prefer to build it yourself or grab the notarized app?

Trusted by employees at

What is Mutka?

Mutka is a community-driven, modular file explorer for macOS, built with Tauri 2 and React. The core ships only infrastructure - a module registry, an event bus, a shortcut manager and a permission-checked gateway. Every real feature is a module: copy and paste, file creation, navigation, list columns, cloud mounts. The features that ship in the box and the ones you install from the community are written the same way.

deep dives

Explore the features

Deep dives on the ideas behind Mutka - the architecture, the sandbox, the extension manager, declarative UI, virtual filesystems and AI-built modules.

All features →

Why build it this way?

Three guarantees fall out of the architecture for free - each one true because of a single line of code.

01 no fork

Community-first

Anyone can extend the app without forking it or touching core code. A module is a single file that imports nothing from Mutka.

import { } from "mutka" // nothing
02 deny by default

Safe by design

A module only gets the capabilities it declares. Anything it didn't ask for is denied at the gateway.

host.fs.write() → ✗ blocked
03 no special API

Built-in = community

There is no privileged “official” API. The features Mutka ships with use the exact same defineModule shape you would.

core.clipboard === defineModule()

How a module works

One format, two runtimes, one gateway - the whole architecture in three ideas.

01

One format

export default defineModule({ id, permissions, commands, openHandlers, setup }). Built-ins and community add-ons are byte-identical.

02

Two runtimes

Trusted built-ins run in-process; untrusted community modules run isolated in a Web Worker. Same source, swapped in one line.

03

One gateway

Every host.* call is checked against the module's declared permissions before it can reach the system.

Read the documentation →
export default defineModule({
  id: "com.nextcloud",
  permissions: ["network"],
  sidebarItems: [
    { category: "Cloud",
      label: "Nextcloud",
      path: "nextcloud://" },
  ],
  setup(host) {
    host.onList("nextcloud", (path) =>
      host.net.dav.list(path)); // gated by "network"
  },
});
Built for the AI era

Modules are designed to be built by AI

Because a module is one self-contained file with a tiny, declared surface - no imports, no build step, no hidden globals - it's the perfect shape for a language model to generate. Describe what you want, get a working module, drop it in ~/.mutka/modules/. No glue. Just plug it in.

  • ✅ One file, zero core imports - nothing to wire up
  • ✅ Permissions are explicit, so the AI can't overreach
  • ✅ The same shape powers every built-in feature
prompt to your AI

“Write a Mutka module that adds a Word count column for .txt files.”

export default
defineModule({ id: "ai.wordcount", … })

Go a little crazy

The core is small on purpose - so the wild ideas live in modules. Here's what a folder of them looks like:

~/.mutka/modules6 items
NameWhat it doesPermission
SQLcom.sqlite-browserindex.js
Claims every .sqlite file and renders its tables & rows right in the pane.database
MCPcom.mcp-bridgeindex.js
Exposes the current folder as tools an AI agent can call - let Claude act on your files.network
DAVcom.webdavindex.js
Mounts WebDAV, S3 or Nextcloud as a Place in the sidebar - a virtual filesystem.filesystem
IMGcom.thumbsindex.js
Swaps native icons for live thumbnails, waveform strips or EXIF badges.ui
com.dir-statsindex.js
Computes folder sizes, duplicates or git status into the status bar.statusbar
+your.next-ideaindex.js
Encrypted vaults, batch renamers, terminal launchers… if the core exposes it, a module can do it.anything