This document describes how a real deployment would register .skill as a
recognized file type in Finder / Explorer / a Linux file manager, with the
Skillerr brand mark as its icon. It is
documentation only — this repo does not ship an OS installer, .plist,
registry script, or .desktop file. Building one is a good "Next" item;
see ROADMAP.md's "Next (great contribution targets)"
section.
Provenance of the mark:
assets/skillerr-mark.svg(icon only) andassets/skillerr-lockup.svg(icon + "skill" wordmark) are hand-authored vector traces ofassets/source/dot-skill-official.png— the official reference PNG supplied by the brand owner. That source file is kept in the repo as the permanent ground truth the vectors are derived from; re-trace against it (ideally with a proper vectorization tool) if the SVGs ever need to be redone.
As FAQ.md
explains, Claude Desktop already claims the .skill extension on macOS
for its own, unrelated Agent Skills format (a plain zip with SKILL.md
inside). Skillerr's .skill is a different, sealed package format
(typed contract, digests, mint attestation, manifest.content[]) that
happens to share the same file extension. Any OS-level registration for
Skillerr's .skill must be visually and programmatically distinct from
Claude Desktop's claim, not a second app fighting over the same extension
with an ambiguous default handler. Concretely:
- The icon rendered for a Skillerr
.skillfile (the Skillerr mark — scroll + teal wave) must not be confusable with Claude's own.skillicon. - The declared type identifier is namespaced to this project
(
org.dot-skill.skillbelow), not a bare, collidableskillid. - Users should be able to tell the two apart without opening the file —
see FAQ.md's guidance to use
skill inspect/ Open With when unsure.
macOS resolves file-type icons and default-app associations through UTIs
declared in an app's Info.plist, via UTExportedTypeDeclaration (the app
that "owns" the type) or UTImportedTypeDeclaration (an app that merely
understands it). A Skillerr-aware app (e.g. a future Skillerr Desktop, or
any GUI wrapper around the CLI) would export:
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>org.dot-skill.skill</string>
<key>UTTypeDescription</key>
<string>Skillerr .skill package</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.zip-archive</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>skill</string>
<key>public.mime-type</key>
<string>application/vnd.dot-skill+zip</string>
</dict>
<key>UTTypeIconFile</key>
<string>skillerr-mark.icns</string>
</dict>
</array>Notes:
-
application/vnd.dot-skill+zipis the exact media type this repo already declares — seeMEDIA_TYPEinpackages/protocol/src/types.ts. -
UTTypeIconFilepoints at an.icnsicon container built fromassets/skillerr-mark.svg.scripts/build-brand.mjsdeliberately does not generate the.icnsitself (see the comment in that script) — producing one requires Apple'siconutil, which only runs on macOS and isn't installable on Linux/Windows CI. Build it locally when packaging a real macOS app:mkdir skillerr-mark.iconset sips -z 16 16 assets/skillerr-mark-32.png --out skillerr-mark.iconset/icon_16x16.png sips -z 32 32 assets/skillerr-mark-64.png --out skillerr-mark.iconset/icon_16x16@2x.png sips -z 32 32 assets/skillerr-mark-32.png --out skillerr-mark.iconset/icon_32x32.png sips -z 64 64 assets/skillerr-mark-128.png --out skillerr-mark.iconset/icon_32x32@2x.png sips -z 128 128 assets/skillerr-mark-128.png --out skillerr-mark.iconset/icon_128x128.png sips -z 256 256 assets/skillerr-mark-256.png --out skillerr-mark.iconset/icon_128x128@2x.png sips -z 256 256 assets/skillerr-mark-256.png --out skillerr-mark.iconset/icon_256x256.png sips -z 512 512 assets/skillerr-mark-512.png --out skillerr-mark.iconset/icon_256x256@2x.png sips -z 512 512 assets/skillerr-mark-512.png --out skillerr-mark.iconset/icon_512x512.png sips -z 1024 1024 assets/skillerr-mark-1024.png --out skillerr-mark.iconset/icon_512x512@2x.png iconutil -c icns skillerr-mark.iconset -o assets/skillerr-mark.icns
-
Because Claude Desktop already exports its own type for
.skill, macOS Launch Services resolves the default app for a given file by per-file/last-registered-wins heuristics when two apps claim the same extension with different UTIs. A real Skillerr Desktop app should not assume it wins by default — document the Open With workaround (as FAQ.md already does) rather than relying on silently becoming the default handler.
Windows associates extensions through HKEY_CLASSES_ROOT (or
per-user HKEY_CURRENT_USER\Software\Classes):
HKEY_CLASSES_ROOT\.skill
(Default) = "DotSkill.SkillFile"
HKEY_CLASSES_ROOT\DotSkill.SkillFile
(Default) = "Skillerr .skill package"
HKEY_CLASSES_ROOT\DotSkill.SkillFile\DefaultIcon
(Default) = "C:\Program Files\Skillerr\skillerr-mark.ico,0"
HKEY_CLASSES_ROOT\DotSkill.SkillFile\shell\open\command
(Default) = "\"C:\Program Files\Skillerr\skillerr-gui.exe\" \"%1\""
skillerr-mark.icohere is exactlyassets/favicon.ico(already a multi-resolution.ico— 256/48/32/16 — generated byscripts/build-brand.mjs); WindowsDefaultIconaccepts the same.icocontainer format browsers use for favicons, so no separate build step is needed on this platform.- Writing to
HKEY_CLASSES_ROOTrequires elevation; a real installer would use an MSI/NSIS/Inno Setup script with a proper uninstall path that removes the registration, not a barereg addone-liner. - Prefer a ProgID like
DotSkill.SkillFileover squatting a bare.skillclaim silently — if another installed app (e.g. a Claude Desktop Windows build, should one register.skillthere too) already owns the extension, Windows will prompt the user to choose, rather than one installer silently overwriting the other's association.
Linux desktop environments (GNOME, KDE, …) resolve icons/handlers via the
shared MIME database (update-mime-info / xdg-mime) plus a .desktop
file's MimeType= key. A Skillerr GUI would ship:
/usr/share/mime/packages/org.dot-skill.skill.xml:
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/vnd.dot-skill+zip">
<comment>Skillerr .skill package</comment>
<glob pattern="*.skill"/>
<icon name="org.dot-skill.skill"/>
</mime-type>
</mime-info>/usr/share/applications/org.dot-skill.skillerr.desktop:
[Desktop Entry]
Type=Application
Name=Skillerr
Exec=skillerr-gui %f
MimeType=application/vnd.dot-skill+zip;
Icon=org.dot-skill.skill
Categories=Development;Utility;application/vnd.dot-skill+zipis, again, the exactMEDIA_TYPEconstant frompackages/protocol/src/types.ts— the same media type is cited on all three platforms so tooling agrees on one identity for the format regardless of OS.- The icon named
org.dot-skill.skillwould be installed into the hicolor icon theme at the standard sizes (/usr/share/icons/hicolor/{16x16,32x32,64x64,128x128,256x256,512x512}/apps/org.dot-skill.skill.png), sourced directly fromassets/skillerr-mark-{16,32,64,128,256,512}.png(note: 16px isn't one ofscripts/build-brand.mjs's current sizes — derive it fromskillerr-mark-32.pngor add 16 toMARK_SIZESif a Linux packaging effort needs it). - After installing both files,
update-mime-databaseandupdate-desktop-databaserefresh the caches so file managers pick up the association without a logout/login.
No .plist, registry .reg/install script, or .desktop file is
committed to this repo — the above is a specification for a future
installer to implement, not a working one. See
ROADMAP.md for where this kind of contribution fits.