Dutis logo

Dutis

Community
tsonglew
dutis

Inspect or manage macOS default applications and file associations with Dutis. Use when asked which app opens a file type, to change its default app, find installed apps that support it, manage URL scheme handlers, or restore previous associations. Covers extensions, UTIs, MIME types, and URL schemes. Use for macOS 默认打开方式、文件关联、默认应用或链接的默认处理程序. Do not use just to open or edit one file without changing its default association.

Overview

Publishertsonglew
Repositorydutis
Skill namedutis
Stars
255
Forks
9
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by tsonglew on GitHub. Read the source before you install it.

Installation

Install the Dutis AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/tsonglew/dutis/tree/master/skills/dutis
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/tsonglew/dutis.git /tmp/dutis
mkdir -p .claude/skills
cp -r /tmp/dutis/skills/dutis .claude/skills/dutis
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Dutis in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Dutis on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Dutis is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Dutis

Use Dutis for macOS Launch Services associations. Preserve its inspect -> plan -> policy check -> approval -> apply -> verify boundary.

Workflow

  1. Start read-only. Check readiness with dutis doctor --json and the effective policy with dutis policy show --json, then inspect the requested association targets and installed handlers. Use dutis get <extension> --json for the current default or dutis query <extension> --json for supporting apps. A restricted macOS shell can hide Launch Services associations and make dutis get report no default even when one exists. If that happens, try the read-only dutis_get or dutis_handler_defaults MCP tool when available; otherwise report the uncertainty instead of concluding that no default is set. Use dutis handler get or dutis_handler_get for UTIs, MIME types, URL schemes, and role-specific defaults. Use dutis handler query or dutis_handler_query to discover apps that explicitly register the requested kind and compatible role. Treat imported or exported UTI definitions as type evidence, not handler capability. When roles may differ, use dutis handler defaults or dutis_handler_defaults to inspect the native Launch Services role matrix before planning a change. If an event command reports a delivery failure, inspect events health (dutis_event_health over MCP), then inspect events pending only when event-level details are necessary. Use events replay only after confirming the configured sink is healthy. Preview events archive and events purge before using --yes; purge is permanent and applies only to events already moved into dead-letter storage.
  2. If the user asks for a general setup or is unsure which application to use, inspect dutis_profiles / dutis_profile, then use dutis_recommend (or the equivalent CLI commands). Present candidate evidence and treat the recommendation strictly as a proposal, never as approval. Treat profiles returned by Dutis as the effective catalog: local profiles.toml overlays may extend built-ins or add custom typed profiles. Never accept caller-supplied overlay contents through MCP. Treat candidate policy_eligible, policy_reasons, and source fields as required evidence; do not substitute caller-provided preferences for the effective local policy. For UTI, MIME, and URL-scheme recommendations, require declares_target = true; typed fleet preferences apply to every profile recommendation but never authorize a mutation.
  3. Express multi-target changes as version 2 TOML. Build a fresh plan and run the policy check. Treat unresolved selectors or policy violations as a stop condition.
  4. Show the user the exact changed kinds, identifiers, roles, target bundle IDs, plan digest, and any policy constraints. Run dry-run before requesting approval.
  5. Ask for explicit approval immediately before a write. Never infer approval from an earlier inspection request.
  6. Apply only the reviewed digest, include a meaningful requester identity, and report the resulting safety snapshot and audit IDs.
  7. Verify with dutis get, then use dutis audit when the user needs the full local record.

When the user requests integration with another local tool, prefer the global --event-log or --event-command sink. Treat an event command as executable code: require a user-chosen trusted absolute path, and never generate or enable one implicitly. Events may contain application paths, bundle IDs, requester identity, and complete plans, but never approval tokens.

For HTTPS delivery, prefer the packaged dutis-event-http external command. Keep DUTIS_HTTP_ENDPOINT and DUTIS_HTTP_BEARER_TOKEN out of Dutis TOML, plans, prompts, and audit records. Run dutis-event-http --check --json before enabling it, and use a Keychain-backed wrapper for a LaunchAgent rather than persisting transport credentials in its plist.

For monitoring requests, use dutis_drift or dutis watch <config> --once first. Explain whether the report is in_sync, drift_detected, or unresolved. Do not enable --remediate or install a remediating LaunchAgent without explicit user authorization for continuous system changes. A notification-only LaunchAgent is the safe default.

For CLI workflows, prefer dutis plan, dutis policy check, and dutis apply --dry-run before the confirmed dutis apply command with --yes, --plan-digest, and --requester. For rollback, preview with dutis rollback <id> --dry-run before the confirmed command.

For MCP workflows, use dutis_diff and dutis_policy_check before dutis_apply, or dutis_rollback_plan before dutis_rollback. Mutation tools must be advertised by the server and require a fresh digest, an approval token, and requester. Never invent, persist, echo, or request disclosure of a secret token; use only a token supplied through the authorized workflow.

Do not pass recommendation output directly to a write tool. Rebuild the plan from the reviewed proposed TOML so current state and policy are checked again.

Do not bypass Dutis with raw duti mutation commands. Do not weaken or rewrite the local policy unless the user explicitly asks to change that policy.

Frequently asked questions

What does the Dutis AI skill do?

Inspect or manage macOS default applications and file associations with Dutis. Use when asked which app opens a file type, to change its default app, find installed apps that support it, manage URL scheme handlers, or restore previous associations. Covers extensions, UTIs, MIME types, and URL schemes. Use for macOS 默认打开方式、文件关联、默认应用或链接的默认处理程序. Do not use just to open or edit one file without changing its default association.

Why use Dutis on TypingMind?

Because you install it once and use it with any model. Dutis is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Dutis in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/tsonglew/dutis/tree/master/skills/dutis. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Dutis?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Dutis?

As many as you like. As long as a model supports skills, you can use Dutis with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Dutis AI skill free?

It is published on GitHub by tsonglew. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇