Cursor BYOK Frontend
SkillDev toolsLets your agent build and review React/Tauri desktop app UI like routing, layouts, settings, and charts.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Cursor BYOK Frontend skill
About this capability
Implement and review the Cursor BYOK React/Tauri desktop frontend. Use for changes under apps/desktop involving routing, page layout, window chrome, settings UI, scrolling, virtualization, charts, themes, or frontend component architecture.
What this skill tells your AI
The instructions your AI receives, as published by leookun/cursor-byok in .agents/skills/frontend/SKILL.md and read by ahel’s review.
Build on the components and theme system already present in apps/desktop. Preserve the Tauri HTTP boundary; frontend management features call /__byok-api__/api and never add IPC business APIs.
Desktop HTTP communication
- Treat the Rust management server as the single HTTP origin for the desktop UI. The main WebView and browser-opened detail pages must use
http://127.0.0.1:<dynamic-port>/__byok-api__/; do not load the main UI fromtauri://localhostor expose a second frontend origin. - Make every frontend management request relative to
/__byok-api__/api. Do not discover, inject, persist, or pass anapiOrigin, and do not construct management URLs from a fixed port. - Keep the
/__byok-api__/namespace reserved for this boundary:/__byok-api__/api/*is handled locally by the Rust management API.- Other
/__byok-api__/*paths are frontend documents, assets, modules, and development resources.
- In production, serve the frontend embedded by Tauri's
frontendDistthrough the Rust server. Reuse Tauri's asset resolver rather than bundling or copying a second set of frontend resources. - In development, let the Rust server reverse-proxy non-API
/__byok-api__/*requests to Vite. Preserve the request path and query string. Do not configure Vite to proxy management API requests back to Rust. - Configure Vite's base path as
/__byok-api__/so generated assets, module imports, and development client URLs stay under the reserved namespace. - Bind the development Vite server to an explicit loopback address compatible with the Rust proxy target; do not rely on
localhostresolving to the same IP family. - Open external detail pages with their normal loopback HTTP URL and hash route. Because the page and API are same-origin, do not add Tauri URL workarounds, API-origin query parameters, or CORS-dependent browser flows.
- Use Tauri commands only for native desktop capabilities such as opening Terminal, tray integration, or operating-system actions. Do not create IPC mirrors for HTTP business APIs.
Component boundaries
- Keep Provider, Model, Call, Usage, and persisted settings state outside presentation components.
- Let components receive business snapshots and dispatch actions. Local React state is allowed for transient UI behavior such as focus, open state, drag state, and input drafts.
- Split pages, layouts, charts, forms, and reusable controls into focused components. Do not collect an entire feature set in
App.tsx. - Keep
App.tsxas the route composition root.
Page layout
- Build every full-height page with
components/layout/PageLayout.tsx; do not hand-roll page shells with grid rows. - Put page-level commands and controls such as create, import, export, filtering, sorting, and view options in the shared page action region through
PageActions. Keep only operations that target one concrete list item, such as edit and delete, inside that item's row. Do not add duplicate action bars or panel-header controls inside page content. - Never render a title region above a data table or flat data list. Use the page title for context, keep column labels in the table header, place page-level controls in
PageActions, and wrap the table in a titlelessCard. A hierarchy label that identifies parent data in a grouped parent-child view is not a table title. - Keep the main scroll viewport full-height and
position: relative; place the page title and action region absolutely over it. - Reserve the absolute title/action region with
padding-topon the scroll content, never by shortening or offsetting the scroll viewport itself. - Keep the menu Card fixed and reserve it with the content area's
margin-left; do not place Header, menu, and content in a flow grid. - Do not use child or section padding to create external spacing. Use flex/grid gaps between siblings and margins or fixed offsets at container boundaries; the scroll-content top padding is reserved only for its absolute title/action overlay.
- Use a vertical flex layout with these invariants:
- Header:
flex: 0 0 auto. - Footer:
flex: 0 0 auto. - Content:
flex: 1 1 auto,min-height: 0, andoverflow: hidden.
- Header:
- Keep Header and Footer outside the scroll viewport. They must never grow or shrink with content.
- Apply macOS, Windows, and Linux window-corner safe-area variables only to edge chrome that can enter native rounded corners.
- Keep macOS traffic-light space and the top fixed drag strip free of interactive controls.
- Avoid decorative brand text and explanatory copy when it does not help the user perform an action or interpret state.
Typography
- Write component styles in SCSS and source every
font-sizefromsrc/styles/_typography.scss; never hardcode a font size in SCSS, React styles, or chart options. - Use
basefor normal UI text and ordinary titles, including title bars, panels, cards, and section headings. Do not increase a font merely because its element ish1orh2. - Use
xsonly for secondary information. Reservelgfor an explicitly oversized display title; do not use it for routine headings. - Audit all typography-token usages after changing the scale, not only raw numeric font sizes.
Scrolling and virtualization
- Use
components/layout/VirtualPage.tsxfor vertically scrolling page content. - Use
components/virtual/VirtualList.tsxfor data collections and menus that can grow. - Treat
ScrollAreaas the low-level primitive owned by the virtual scrolling implementation. Do not importScrollAreadirectly in pages or layouts. - Use the global
scroll-shadow-topandscroll-shadow-bottommasks for scroll-edge shadows. When a scroll content inset reserves an absolute overlay, source the top shadow distance from the same CSS variable as itspadding-top. - Model non-list pages as a short sequence of measurable top-level virtual sections.
- Do not use document scrolling, native page
overflow: auto, or nested vertical scroll containers. - Ensure every flex/grid ancestor of a virtual viewport has
min-height: 0and the viewport has an explicit bounded height.
Routing and pages
- Use
HashRouterfor Tauri compatibility. - Keep
/as the statistics dashboard and expose every primary page through the persistent menu in the sharedAppLayout. - Use top-level routes for primary pages:
/,/providers,/models,/calls, and/settings. - Do not create separate Home and Settings shells or add a Home-switching control.
- Keep route content independent of the window Header and Footer.
Charts
- Use ECharts through
components/charts/EChart.tsx. - Register only required ECharts Core charts, components, and renderers.
- Keep chart components declarative: accept domain data and construct an option without fetching or persisting data.
- Let
ResizeObserverresize the chart with its layout container and dispose the instance on unmount.
Validation
Run from apps/desktop:
npm run check
npm run tauri:build -- --debug --no-bundle
Verify that Header and Footer remain fixed, only the virtual content viewport scrolls, settings navigation remains reachable at minimum window size, and macOS controls stay outside rounded-corner and traffic-light unsafe regions.
Signals
- GitHub stars
- 3k
- Forks
- 447
- Last commit
- Sep 2026
- Hacker News mentions
- 20
Advanced
- Catalog kind
- skill
- Gateway key
frontend-leookun- Source
- github.com/leookun/cursor-byok