native-feel-cross-platform-desktop
Use when the user is designing, prototyping, or rewriting a desktop app that must run on multiple OSes (macOS + Windows, optionally Linux) AND feel indistinguishable from a native app to its users — fast launch, native windowing, native input handling, native materials. Trigger words include "cross-platform desktop", "Electron alternative", "Tauri vs native", "WebView wrapper", "near-native performance", "Raycast architecture", "WebKit/WebView2 quirks", "WKWebView", "system tray app", "global hotkey app", "launcher app". Do NOT trigger this skill for pure web apps, pure mobile apps, or for greenfield projects that have no native-feel requirement.
pinned to #9bd88c6updated last month
Ask your AI client: “install skills/native-feel-cross-platform-desktop”.
Requires the metahub MCP server installed in your client. Set up MCP.
mh install skills/native-feel-cross-platform-desktopmetahub onboarded this repo on the author's behalf.
If you own github.com/yetone/native-feel-skill on GitHub, claim the listing to take over publishing. Your claim preserves the existing eval history and badges; only the curator label is replaced with verified-publisher on your next publish.
Stars
1,796
Last commit
last month
Latest release
published
About this skill
Pulled from SKILL.md at publish time.
You are advising on the architecture of a cross-platform desktop app that must *feel native*. This skill captures the philosophy, architecture, and concrete pitfalls — distilled from Raycast's public technical deep-dive on their 2.0 rewrite and verified by reverse-engineering the shipping `Raycast Beta.app` binary on macOS.
Evaluation report
WarningsAutomated checks the publisher passed at publish time — structure, docs, safety, and whether the artifact behaves as claimed.9bd88c6· last month
Documentation
41Description quality
91 words · 654 chars — "Use when the user is designing, prototyping, or rewriting a desktop app that mus…"
README is present and substantial
10,865 chars · 9 sections · 5 code blocks
Tags / topics declaredwarn
No manifest tags and no GitHub repo topics
Add tags to the manifest (or GitHub topics on the repo) so the registry's search and category filters surface this artifact.
README has usage / example sections
no labeled section but 5 code blocks document usage
Homepage / docs URL declared
no homepage declared (registry will use the repo URL) — info-only, not blocking
Release history
1- releasecurrent9bd88c6warnlast month
Contents
A. With skills (any compatible agent):
npx skills add yetone/native-feel-skill -g
The -g flag installs globally (user-level) so every project picks it up.
B. Or paste this prompt to your AI agent:
Install the native-feel skill for me:
1. Clone https://github.com/yetone/native-feel-skill into your
user-level skills directory as `native-feel-cross-platform-desktop/`
(whatever path your agent reads skills from on this machine — e.g.
`~/.claude/skills/` for Claude Code).
2. Verify that SKILL.md plus the references/ and checklists/ subdirs
are present.
3. Confirm the install path when done.
Use cases · What this is · Philosophy · Layout · Sources
Use cases
Once installed, the skill activates automatically whenever the conversation touches cross-platform desktop architecture, WebView quirks, or making a UI feel native. Two common ways to use it:
Case 1 — Refactor an existing app to feel more native
You have an Electron / Tauri / web-wrapped app, and a designer (or your own eye) tells you it feels web-y. You want to know where to start and how far you can take it without a full rewrite.
You ❯ My Electron app feels web-y on macOS — the designer says it
doesn't pass for a real Mac app. Where do I start?
Agent ❯ Quickest path is the 75-item native-feel audit
(checklists/ship-readiness.md). Most Electron apps fail
the same 6–8 items:
- cursor:pointer on rows (item 21)
- web-style modal overlays instead of native sheets (19)
- hardcoded brand accent instead of system accent (33)
- page fade-transitions (40)
- opaque window background instead of platform material (31)
- WebKit context menu still firing (23)
Each is a 5-to-30-minute fix; together they move you most
of the way to "passes the 30-second skeptical user test."
Bigger question first: how far do you need to go? If "good
enough" means passing that 30-second test, Electron + this
audit gets you 80% there without rewriting. If you want
"indistinguishable from a Mac app" — Liquid Glass materials,
native popovers, sub-200ms launch — Electron has a ceiling
you'll hit. Want me to run the decision tree first?
Case 2 — Build a cross-platform native-feel app from scratch
Greenfield project, must run on macOS + Windows, and the native feel is the point — a launcher, a productivity tool, an AI workspace your users live in all day.
You ❯ Starting a new desktop app — macOS + Windows, native feel
is the whole pitch. What architecture should I use?
Agent ❯ Before architecture, the decision tree
(checklists/decision-tree.md) rules this stack out for
several common shapes — quick check first:
- Cold-start budget? (<100ms → build native instead)
- Memory floor? (<150MB → build native instead)
- Extension ecosystem? (yes → need the Node layer)
- Runway? (<3mo → start on Electron)
If you pass, the four-layer architecture is:
┌──────────────────────────────────────────────────┐
│ Native shell Swift/AppKit + C#/WPF │
│ ↕ one IPC schema, codegen for all sides │
│ System WebView WKWebView + WebView2 │
│ running React + TypeScript, shared 1:1 │
│ ↕ │
│ Node backend single long-lived process │
│ ↕ │
│ Rust core UniFFI-bridged, sharable │
│ with iOS and server │
└──────────────────────────────────────────────────┘
The expensive-to-get-wrong decisions, in order:
1. The IPC contract (one schema, codegen). Get this wrong
and you rebuild it later under duress.
2. WebView survival flags (occlusion off, alpha-prewarm,
_doAfterNextPresentationUpdate, font prewarming).
3. Memory hygiene (lazy-load extensions, tear down
secondary windows aggressively).
Want to start with the seam — where to draw the cross-
platform line — or with the IPC contract, since getting
that schema wrong means rebuilding every bridge later?
Other things the skill is good for
- "Why is my WKWebView flickering when I hide and re-show it?" → walks you through
references/03-webview-survival.md(most likely A.1 throttling or A.2 startup flicker). - "How should typed IPC work across Rust, Swift, and TypeScript?" → the UniFFI-based pattern in
references/04-ipc-contract.md, with the exactCoordinator/EventHandlershape Raycast Beta ships. - "My app is at 450 MB resident, is that bad?" → the six common Activity-Monitor mistakes and what to actually measure, in
references/05-memory-truths.md. - "Is my designer's spec ‘native enough’?" → the 70+ item conventions audit in
references/06-native-conventions.md.
"We're not a web app with some native hooks sprinkled on top. We're a native app that uses web for its UI." — Raycast
What this is
A reference for architects, tech leads, and engineers who must build a desktop app that:
- runs on macOS + Windows (optionally Linux) from a single UI codebase,
- launches in under 500 ms and stays under 500 MB resident,
- is indistinguishable from a native app to its users (no
cursor: pointertell-tales, no white-flash on launch, no WebKit context menu, no smooth-scroll JS), - supports a plugin/extension ecosystem in TypeScript,
- can share performance-critical code with iOS and a server backend.
This is the four-layer architecture: native shell → system WebView (WKWebView/WebView2) → Node backend → Rust core, wired together with a single typed IPC schema that generates clients for every runtime.
What this is not
- Not for single-OS apps (just build native).
- Not for Electron-style "good enough" apps (the polish budget here is 5–10× higher).
- Not for apps with strict <150 MB or <100 ms cold-start budgets (the floor is real).
- Not for games, document editors, or media players.
Run checklists/decision-tree.md to find out if this architecture is even right for your project. It rules itself out for several common cases — saying so directly is more useful than over-fitting advice.
Layout
native-feel-skill/
├── SKILL.md # entry point for the agent
├── references/
│ ├── 01-philosophy.md # 8 tenets that drive every decision
│ ├── 02-architecture.md # the four-layer architecture
│ ├── 03-webview-survival.md # WebKit/WebView2 quirks + fixes (the goldmine)
│ ├── 04-ipc-contract.md # typed IPC across Rust/Swift/C#/TS
│ ├── 05-memory-truths.md # why Activity Monitor lies
│ ├── 06-native-conventions.md # 70+ items the native-feel audit checks
│ └── 07-evidence-raycast.md # what a reverse-eng. of Raycast Beta shows
└── checklists/
├── decision-tree.md # should you use this architecture?
└── ship-readiness.md # 75-item launch audit
Philosophy
The central tension this architecture resolves: how can a desktop app deliver convenient cross-platform development AND near-native performance, when those goals usually pull against each other? Eight tenets name the structural moves:
- Place the seam at the rendering surface — share above the WebView, diverge below it; this is the only altitude where both DX and native feel survive.
- One schema, many languages — pay the polyglot tax once at the declaration, never at the call site.
- Adopt the platform; don't compete with it — the OS draws blur, scrolling, materials, and dark mode better than you can.
- Performance is a property of perception — what the user feels, not what Activity Monitor reports.
- The short iteration loop is the product — 200 ms hot reload vs 30 s native rebuild is a 150× compounding advantage.
- Cross boundaries intentionally — IPC has a cost; design every crossing as async, batched, schema-typed.
- Identity is muscle memory — the hotkey, the rank order, the verbs are the app; everything else is implementation.
- Separate baseline from margin — the WebView+Node floor is rented; only your dirty pages are yours to optimize.
Read references/01-philosophy.md first. Everything else is consequence.
About Agent Skills
Agent Skills are the emerging standard for packaging domain knowledge that any compatible agent (Claude Code, the Claude Agent SDK, or other Agent-Skill-aware runtimes) can discover and load. Once installed via the prompt at the top of this README, the skill activates automatically when the agent's conversation touches cross-platform desktop architecture, WebView quirks, or Raycast-style apps — the trigger conditions are declared in SKILL.md's frontmatter.
Sources
- Raycast's public technical post: A Technical Deep Dive into the New Raycast
- Reverse engineering of
Raycast Beta.appv0.60.0 (macOS 26+ build, Xcode 17, arm64) — seereferences/07-evidence-raycast.mdfor what was found and how.
License
MIT — see LICENSE.
Credits
Authored as an Agent Skill. The architecture this skill describes is Raycast's; the philosophy is the author's synthesis; the evidence is from the shipping app.
Reviews
No reviews yet. Be the first.
Related
Verification Before Completion
Evidence before assertions, always
Writing Plans
Turn specs into phased implementation plans
Test-Driven Development
Red → green → refactor discipline for any feature or bugfix
mh install skills/native-feel-cross-platform-desktop