An OpenCode skill for converting React components to Svelte 5 using modern runes syntax.
This skill provides comprehensive instructions for migrating React components to Svelte 5, covering:
useState → $state, useReducer patternsuseMemo → $derived, useCallback simplificationuseEffect → $effect, useLayoutEffect → $effect.pre$props() with TypeScript support{#if} and {#each}createContext/useContext → setContext/getContextuseRef → bind:thisbind:valuemkdir -p .opencode/skills/react-to-svelte
cp SKILL.md .opencode/skills/react-to-svelte/
mkdir -p ~/.config/opencode/skills/react-to-svelte
cp SKILL.md ~/.config/opencode/skills/react-to-svelte/
Once installed, OpenCode agents can load this skill automatically or you can invoke it:
/skill react-to-svelte
Then ask the agent to convert a React component:
Convert this React component to Svelte 5:
[paste your React code]
React:
function Counter({ initial = 0 }) {
const [count, setCount] = useState(initial);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
Svelte 5:
<script>
let { initial = 0 } = $props();
let count = $state(initial);
</script>
<button onclick={() => count++}>
{count}
</button>
React:
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(`/api/users/${userId}`)
.then(r => r.json())
.then(data => {
setUser(data);
setLoading(false);
});
}, [userId]);
if (loading) return <div>Loading...</div>;
return <div>{user.name}</div>;
}
Svelte 5:
<script>
let { userId } = $props();
let user = $state(null);
let loading = $state(true);
$effect(() => {
fetch(`/api/users/${userId}`)
.then(r => r.json())
.then(data => {
user = data;
loading = false;
});
});
</script>
{#if loading}
<div>Loading...</div>
{:else}
<div>{user.name}</div>
{/if}
.jsx/.tsx to .svelteuseState to $stateuseEffect to $effectuseMemo to $derived$props(){#if} blocks.map() to {#each} blocksuseContext to getContextuseRef to bind:thisFeel free to open issues or PRs to improve this skill.
MIT