Design Import
yonatangross/orchestkit
Scaffolds React components from a Claude Design handoff bundle and stops at files on disk: no stories, no tests, no pull request.
Create new applications for ryOS following established patterns and conventions.
$ npx skills add ryokun6/ryos --skill create-ryos-app -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ryokun6/ryos create-ryos-app --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/create-ryos-app .claude/skills/create-ryos-app && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .claude/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-appType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ryokun6/ryos --skill create-ryos-app -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ryokun6/ryos create-ryos-app --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.cursor/skills/create-ryos-app .agents/skills/create-ryos-app && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .agents/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ryokun6/ryos --skill create-ryos-app -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ryokun6/ryos create-ryos-app --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.cursor/skills/create-ryos-app .cursor/skills/create-ryos-app && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .cursor/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ryokun6/ryos.git --path .cursor/skills/create-ryos-app--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ryokun6/ryos --skill create-ryos-app -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ryokun6/ryos create-ryos-app --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.cursor/skills/create-ryos-app .gemini/skills/create-ryos-app && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .gemini/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ryokun6/ryos create-ryos-appInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ryokun6/ryos --skill create-ryos-app -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .github/skills && cp -r skills-src/.cursor/skills/create-ryos-app .github/skills/create-ryos-app && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .github/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ryokun6/ryos --skill create-ryos-app -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ryokun6/ryos create-ryos-app --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ryokun6/ryos.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.cursor/skills/create-ryos-app .opencode/skills/create-ryos-app && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-ryos-app" agent skill from https://github.com/ryokun6/ryos/tree/main/.cursor/skills/create-ryos-app into .opencode/skills/create-ryos-app/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-ryos-app", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-ryos-appCreate new applications for ryOS following established patterns and conventions.
Create Ryos App is an agent skill from ryokun6/ryos. Create new applications for ryOS following established patterns and conventions. Use when building a new app, adding an application to the desktop, creating app components, or scaffolding app structures.
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Project scaffolding and React components. The repository describes itself as: ryOS, made with Cursor. The licence is AGPL-3.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4a6e61e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bunFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
ryo.luFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Create Ryos App loads about 3.7k tokens when it runs. Until then it costs about 55 tokens; SKILL.md has 621 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ryokun6/ryos at commit 4a6e61e, republished under its AGPL-3.0 licence (© ryokun6). 621 words, ~3,726 tokens.
.claude/skills/create-ryos-app/SKILL.md (or your agent's skills folder).- [ ] 1. Create app directory: src/apps/[app-name]/
- [ ] 2. Create main component: components/[AppName]AppComponent.tsx
- [ ] 3. Create menu bar: components/[AppName]MenuBar.tsx
- [ ] 4. Create logic hook: hooks/use[AppName]Logic.ts
- [ ] 5. Create metadata: metadata.ts (appMetadata + exactly 6 help items)
- [ ] 6. Create app definition: index.tsx (re-export metadata, declare initialData type)
- [ ] 7. Add icon: choose from existing icons or the resource catalogs, then place active assets under `public/icons/<theme>/[app-name].png`
- [ ] 8. Register the app id: add to appIds + appNames in src/config/appRegistryData.ts
- [ ] 9. Register the app: lazy component + registry entry in src/config/appRegistry.tsx
- [ ] 10. Register help key order in src/hooks/useTranslatedHelpItems.ts
- [ ] 11. Add translation keys to src/lib/locales/en/translation.json
- [ ] 12. Localize (last): add en strings, sync locales; use the localize skill to finishsrc/apps/[app-name]/
├── components/
│ ├── [AppName]AppComponent.tsx # Main component (required)
│ └── [AppName]MenuBar.tsx # Menu bar (required)
├── hooks/
│ └── use[AppName]Logic.ts # Logic hook (recommended)
├── metadata.ts # appMetadata + helpItems (required)
└── index.tsx # App definition: re-export metadata, initialData types (required)appRegistry.tsx imports appMetadata/helpItems eagerly so the dock, About/Help dialogs, and search can show app info without loading the (lazy) component bundle. Keep these in a tiny metadata.ts that imports nothing heavy. Most current apps follow this split (@/apps/<id>/metadata). index.tsx then re-exports from metadata.ts and is the home for initialData types and any app-specific exported types.
metadata.ts)Keep app metadata and help items in metadata.ts so the registry can load them eagerly without pulling in the component.
export const appMetadata = {
name: "[App Name]",
version: "1.0.0",
creator: { name: "Ryo Lu", url: "https://ryo.lu" },
github: "https://github.com/ryokun6/ryos",
icon: "/icons/default/[app-name].png",
};
// Always include exactly 6 help items (icon, title, description each).
export const helpItems = [
{ icon: "🚀", title: "Getting Started", description: "How to use this app" },
{ icon: "📂", title: "Open & Save", description: "Open and save files from the File menu" },
{ icon: "✏️", title: "Editing", description: "Use the Edit menu for cut, copy, paste" },
{ icon: "👁️", title: "View Options", description: "Adjust view and layout from the View menu" },
{ icon: "⌨️", title: "Shortcuts", description: "Use keyboard shortcuts for faster workflows" },
{ icon: "❓", title: "Help & About", description: "Open Help from the Help menu for more info" },
];Before creating a new app icon from scratch, check the active icon themes and the historical icon resource catalogs:
public/icons/default, public/icons/macosx, public/icons/win98, and public/icons/xp.public/resources/macos-icon-catalogs/{panther,tiger}/catalog.mdpublic/resources/windows-icon-catalogs/{win98,xp}/catalog.mdpublic/icons/<theme>/...) instead of referencing public/resources/... directly from app metadata.public/icons/default/[app-name].png; add theme-specific variants when the catalog has a better era-matched asset.bun run generate:icons after adding or moving active files under public/icons.Keep public/resources/*-icon-catalogs as source libraries. Do not replace unrelated active icons just because a catalog contains a historical equivalent.
index.tsx)Re-export the metadata and declare any initialData type. This is what other files import as @/apps/[app-name].
export { appMetadata, helpItems } from "./metadata";
// Optional: typed startup payload for launchApp("[app-name]", { ... })
export interface [AppName]InitialData {
// e.g. filePath?: string;
}[AppName]AppComponent.tsx)import { WindowFrame } from "@/components/layout/WindowFrame";
import { [AppName]MenuBar } from "./[AppName]MenuBar";
import { AppProps } from "@/apps/base/types";
import { use[AppName]Logic } from "../hooks/use[AppName]Logic";
import { HelpDialog } from "@/components/dialogs/HelpDialog";
import { AboutDialog } from "@/components/dialogs/AboutDialog";
import { appMetadata } from "..";
export function [AppName]AppComponent({
isWindowOpen,
onClose,
isForeground,
skipInitialSound,
instanceId,
}: AppProps) {
const {
t,
translatedHelpItems,
isHelpDialogOpen,
setIsHelpDialogOpen,
isAboutDialogOpen,
setIsAboutDialogOpen,
isWindowsTheme,
} = use[AppName]Logic({ isWindowOpen, isForeground, instanceId });
const menuBar = (
<[AppName]MenuBar
onClose={onClose}
onShowHelp={() => setIsHelpDialogOpen(true)}
onShowAbout={() => setIsAboutDialogOpen(true)}
/>
);
if (!isWindowOpen) return null;
return (
<>
{!isWindowsTheme && isForeground && menuBar}
<WindowFrame
title={t("apps.[app-name].title")}
onClose={onClose}
isForeground={isForeground}
appId="[app-name]"
skipInitialSound={skipInitialSound}
instanceId={instanceId}
menuBar={isWindowsTheme ? menuBar : undefined}
>
<div className="flex flex-col h-full bg-os-window-bg font-os-ui">
{/* App content */}
</div>
</WindowFrame>
<HelpDialog
isOpen={isHelpDialogOpen}
onOpenChange={setIsHelpDialogOpen}
appId="[app-name]"
helpItems={translatedHelpItems}
/>
<AboutDialog
isOpen={isAboutDialogOpen}
onOpenChange={setIsAboutDialogOpen}
metadata={appMetadata}
appId="[app-name]"
/>
</>
);
}use[AppName]Logic.ts)import { useState } from "react";
import { useTranslation } from "react-i18next";
import { useTranslatedHelpItems } from "@/hooks/useTranslatedHelpItems";
import { useThemeStore } from "@/stores/useThemeStore";
import { helpItems } from "..";
export function use[AppName]Logic({ instanceId }: { instanceId: string }) {
const { t } = useTranslation();
const translatedHelpItems = useTranslatedHelpItems("[app-name]", helpItems);
const currentTheme = useThemeStore((state) => state.current);
const isWindowsTheme = currentTheme === "xp" || currentTheme === "win98";
const [isHelpDialogOpen, setIsHelpDialogOpen] = useState(false);
const [isAboutDialogOpen, setIsAboutDialogOpen] = useState(false);
return {
t,
translatedHelpItems,
isWindowsTheme,
isHelpDialogOpen,
setIsHelpDialogOpen,
isAboutDialogOpen,
setIsAboutDialogOpen,
};
}[AppName]MenuBar.tsx)Match existing app menubars: structure, classes, and spacing.
<MenuBar inWindowFrame={isWindowsTheme}> — no extra gap between menus (layout uses space-x-0).MenubarTrigger className="text-md px-2 py-1 border-none focus-visible:ring-0".MenubarContent align="start" sideOffset={1} className="px-0".MenubarItem className="text-md h-6 px-3".MenubarSeparator className="h-[2px] bg-black my-1".import { MenuBar } from "@/components/layout/MenuBar";
import {
MenubarMenu,
MenubarTrigger,
MenubarContent,
MenubarItem,
MenubarSeparator,
} from "@/components/ui/menubar";
import { useThemeStore } from "@/stores/useThemeStore";
import { useTranslation } from "react-i18next";
interface [AppName]MenuBarProps {
onClose: () => void;
onShowHelp: () => void;
onShowAbout: () => void;
}
export function [AppName]MenuBar({ onClose, onShowHelp, onShowAbout }: [AppName]MenuBarProps) {
const { t } = useTranslation();
const currentTheme = useThemeStore((state) => state.current);
const isWindowsTheme = currentTheme === "xp" || currentTheme === "win98";
const isMacOSTheme = currentTheme === "macosx";
return (
<MenuBar inWindowFrame={isWindowsTheme}>
<MenubarMenu>
<MenubarTrigger className="text-md px-2 py-1 border-none focus-visible:ring-0">
{t("common.menu.file")}
</MenubarTrigger>
<MenubarContent align="start" sideOffset={1} className="px-0">
<MenubarSeparator className="h-[2px] bg-black my-1" />
<MenubarItem onClick={onClose} className="text-md h-6 px-3">
{t("common.menu.close")}
</MenubarItem>
</MenubarContent>
</MenubarMenu>
<MenubarMenu>
<MenubarTrigger className="text-md px-2 py-1 border-none focus-visible:ring-0">
{t("common.menu.help")}
</MenubarTrigger>
<MenubarContent align="start" sideOffset={1} className="px-0">
<MenubarItem onClick={onShowHelp} className="text-md h-6 px-3">
{t("apps.[app-name].menu.help")}
</MenubarItem>
{!isMacOSTheme && (
<>
<MenubarSeparator className="h-[2px] bg-black my-1" />
<MenubarItem onClick={onShowAbout} className="text-md h-6 px-3">
{t("apps.[app-name].menu.about")}
</MenubarItem>
</>
)}
</MenubarContent>
</MenubarMenu>
</MenuBar>
);
}appRegistryData.ts)The AppId union type, dock/search ordering, and store lookups all derive from src/config/appRegistryData.ts. Add the id here first — otherwise appRegistry.tsx (and everything typed against AppId) will not compile.
// src/config/appRegistryData.ts
export const appIds = [
// ...existing ids...
"[app-name]",
] as const;
export const appNames: Record<AppId, string> = {
// ...existing names...
"[app-name]": "[App Name]",
};If you ever rename an app's id, add the old id to LEGACY_APP_ID_ALIASES so persisted/bookmarked references still resolve.
appRegistry.tsxcreateLazyComponent lives in src/config/lazyAppComponent.tsx (already imported at the top of appRegistry.tsx) and registers the chunk for intent-based prefetch. Import metadata from the lightweight metadata.ts, not the component.
// Metadata import (eager, lightweight) — note the /metadata path
import { appMetadata as [appName]Metadata, helpItems as [appName]HelpItems } from "@/apps/[app-name]/metadata";
// Lazy component (loaded on open). Use your initialData type instead of unknown if you declared one.
const Lazy[AppName]App = createLazyComponent<unknown>(
() => import("@/apps/[app-name]/components/[AppName]AppComponent")
.then(m => ({ default: m.[AppName]AppComponent })),
"[app-name]" // cache key = app id, keeps refs stable across HMR + enables prefetch
);
// Add to the appRegistry object
["[app-name]"]: {
id: "[app-name]",
name: "[App Name]",
icon: { type: "image", src: [appName]Metadata.icon },
description: "App description",
component: Lazy[AppName]App,
helpItems: [appName]HelpItems,
metadata: [appName]Metadata,
windowConfig: {
defaultSize: { width: 650, height: 475 },
minSize: { width: 400, height: 300 },
} as WindowConstraints,
},useTranslatedHelpItems("[app-name]", helpItems) needs a matching key list in APP_HELP_I18N_KEYS in src/hooks/useTranslatedHelpItems.ts. Keep the list in the same order as metadata.ts helpItems; the hook preserves the icons and swaps in apps.[app-name].help.[key].title and .description.
For longer help lists, create src/apps/[app-name]/helpKeys.ts and spread that exported list into APP_HELP_I18N_KEYS. Calculator, Maps, and Internet Explorer are good examples.
Run bun test tests/unit/i18n/test-help-i18n-alignment.test.ts after adding the app. It catches missing help keys and row-count drift across every registered app.
| Prop | Type | Description |
|---|---|---|
isWindowOpen | boolean | Window visibility |
onClose | () => void | Close handler |
isForeground | boolean | Window is active |
instanceId | string | Unique instance ID |
skipInitialSound | boolean | Skip open sound |
initialData | TInitialData | Optional startup data |
isForegroundmenuBar prop to WindowFrameconst isWindowsTheme = currentTheme === "xp" || currentTheme === "win98";
return (
<>
{!isWindowsTheme && isForeground && menuBar}
<WindowFrame menuBar={isWindowsTheme ? menuBar : undefined}>| Prop | Values | Use |
|---|---|---|
material | "default", "transparent", "notitlebar" | Window style |
interceptClose | boolean | Show save dialog before close |
keepMountedWhenMinimized | boolean | Preserve state when minimized |
interface ViewerInitialData { filePath: string; }
export function ViewerAppComponent({ initialData }: AppProps<ViewerInitialData>) {
const filePath = initialData?.filePath ?? "";
}import { useLaunchApp } from "@/hooks/useLaunchApp";
const launchApp = useLaunchApp();
launchApp("photos", { path: "/image.png" });// src/stores/use[AppName]Store.ts
import { create } from "zustand";
import { persist } from "zustand/middleware";
export const use[AppName]Store = create<State>()(
persist((set) => ({ /* state and actions */ }), { name: "[app-name]-storage" })
);After the app is built and wired up, finish by localizing:
apps.[app-name].* in src/lib/locales/en/translation.json.bun run i18n:sync:mark-todo.bun run i18n:sync:dry-run, bun run i18n:audit, and the help alignment test.Use the localize skill for the full workflow: extract strings → t() calls → en keys → sync. Do this step last so all UI copy is stable before extracting and syncing.
© ryokun6, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .cursor/skills/create-ryos-app of ryokun6/ryos.
Open the folder on GitHubat commit 4a6e61e
Create Ryos App next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Create Ryos App this skillryokun6/ryos | 1.3k | — | ~3.7k | Automated safety check: Pass | AGPL-3.0 | |
| Design Importyonatangross/orchestkit | 289 | — | ~2.9k | Automated safety check: Notes | MIT | |
| South Admin CRUD Generatorsouthliu/south-admin-react | 580 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Creating Luna Appmizchi/luna.mbt | 173 | — | ~1.4k | Automated safety check: Pass | None | |
| Component Refactoringlangflow-ai/langflow | 156k | — | ~3.5k | Automated safety check: Pass | MIT | |
| @pierre/diffs Code Renderingpierrecomputer/pierre | 6.2k | 2 repos | ~803 | Automated safety check: Pass | Apache-2.0 |
yonatangross/orchestkit
Scaffolds React components from a Claude Design handoff bundle and stops at files on disk: no stories, no tests, no pull request.
southliu/south-admin-react
Generates a full CRUD page - page component, data model and API client - from the south-admin-react project's own VS Code snippet templates.
mizchi/luna.mbt
A skill your agent uses when scaffolding a new standalone CSR app that uses luna (@lunaui/luna) outside the luna.mbt monorepo — running npx @lunaui/luna new, choosing TSX vs MoonBit, or fixing a…
langflow-ai/langflow
Refactor high-complexity React components in Langflow frontend.
pierrecomputer/pierre
Guides an agent through using @pierre/diffs to render syntax-highlighted files and diffs, and to build editing and review surfaces in React or plain JavaScript.
darknecrocities/DomoDomo---All-in-one-Tool
Mandatory end-to-end procedure for adding or materially changing a DomoDomo tool or category.
ryokun6/ryos
Add or modify an AI chat tool ("Ask Ryo" capability) in ryOS.
ryokun6/ryos
Create or modify ryOS Zustand stores following repo conventions — persist middleware, partialize, versioned migrations, the debounced write-behind storage adapter for large slices, and cloud-sync…
ryokun6/ryos
Cut and publish ryOS Electron desktop releases on GitHub. An agent skill from ryokun6/ryos.
ryokun6/ryos
Localize ryOS apps and components by extracting hardcoded strings, replacing with translation keys, and syncing across languages.
ryokun6/ryos
React performance optimization guidelines from Vercel Engineering (vercel-labs/agent-skills).
ryokun6/ryos
Design and style ryOS UI using the current OS theme token system, Tailwind variants, shared primitives, Aqua Glass, dark mode, and accent conventions.
Categories
Create new applications for ryOS following established patterns and conventions. Create Ryos App is an agent skill from ryokun6/ryos. Create new applications for ryOS following established patterns and conventions.
Create Ryos App fits situations like: building a new app; adding an application to the desktop; creating app components; scaffolding app structures.
Run `npx skills add ryokun6/ryos --skill create-ryos-app -a claude-code`. Or copy the skill folder (.cursor/skills/create-ryos-app in ryokun6/ryos) into .claude/skills/create-ryos-app in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ryokun6/ryos --skill create-ryos-app -a codex`. Or copy the skill folder (.cursor/skills/create-ryos-app in ryokun6/ryos) into .agents/skills/create-ryos-app in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ryokun6/ryos --skill create-ryos-app -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-ryos-app, .gemini/skills/create-ryos-app, .github/skills/create-ryos-app and .opencode/skills/create-ryos-app in your project.
Going by SKILL.md and its folder, Create Ryos App needs the command-line tools its instructions call (bun).
SKILL.md names 1 domain. In commands or code: ryo.lu; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Create Ryos App is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Create Ryos App: Design Import (yonatangross/orchestkit, 289 stars), South Admin CRUD Generator (southliu/south-admin-react, 580 stars), Creating Luna App (mizchi/luna.mbt, 173 stars) and Component Refactoring (langflow-ai/langflow, 156k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ryokun6 (a GitHub user) maintains it in ryokun6/ryos, which has 1,264 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.
Source: ryokun6/ryos on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.