Contribute to sensory-ui: extend support to new frameworks, add components, or improve existing ones.
sensory-ui is open source and welcomes contributions. Whether you want to fix a bug, add a component, or extend support to a new framework, this guide covers the process.
| Contribution | Difficulty | Description |
|---|---|---|
| Fix a bug | Easy | Fix an issue in existing components or the engine |
| Add a component | Medium | Add a new shadcn/ui component with sound support |
| Extend framework support | Medium | Add support for Angular, Svelte, Vue, etc. |
| Add a sound pack | Medium | Create a new instrument-based sound pack |
| Improve docs | Easy | Fix typos, clarify explanations, add examples |
| Sponsor | Easy | Support the project financially |
git clone https://github.com/SatyamVyas04/sensory-ui.git
cd sensory-ui
bun install| Command | Purpose |
|---|---|
bun run dev | Start development server |
bun run build | Production build |
bun run check | Lint with Biome/Ultracite |
bun run fix | Auto-fix lint issues |
npx tsc --noEmit | TypeScript check |
bun run registry:build | Build and validate registry |
sensory-ui/
app/
docs/ ← Docs routes (Fumadocs layout + `[[...slug]]` page)
_components/ ← Showcase demo components
content/
docs/ ← Documentation pages (MDX + `meta.json`)
components/
ui/
sensory-ui/ ← Core library (distributed via registry)
config/ ← Engine, provider, config, types
sounds/ ← Sound synthesis modules
*.tsx ← Enhanced shadcn/ui components
*.tsx ← Base shadcn/ui components
registry.json ← Root registry manifestcomponents/ui/components/ui/sensory-ui/:
sound, closeSound, openSound, expandSound, collapseSound, volume, only the ones that fit the interaction model)useSensoryUI from config/provider and call its playSound(role, { volume }) on the appropriate events"use client" directive (all sensory-ui modules are client components)components/ui/sensory-ui/registry.json (and add any new shared modules, e.g. sounds/core/*.ts, to sensory-ui-core files)content/docs/components/ and add it to content/docs/components/meta.jsonChoose sound roles that match the component's interaction model:
| Interaction Type | Recommended Roles |
|---|---|
| Click / Tap | interaction.tap |
| Subtle feedback | interaction.subtle |
| Toggle on/off | interaction.toggle |
| Confirmation | interaction.confirm |
| Open / Close | overlay.open / overlay.close |
| Expand / Collapse | overlay.expand / overlay.collapse |
| Forward navigation | navigation.forward |
| Backward navigation | navigation.backward |
| Tab switching | navigation.tab |
| System notifications | notification.info, notification.success, notification.warning, notification.error |
sensory-ui currently supports Next.js (App Router + Pages Router) via React. To extend support to other frameworks:
engine.ts)playSound (equivalent to the React hook)playSound (equivalent to the React hook)engine.ts) is framework-agnostic: it's pure TypeScriptsounds/) is framework-agnostic: pure functionsSoundRole type and registry structure across all frameworkssounds/core/instruments.ts:
myPack: {
filterFreq: 4000,
q: 5,
oscType: "triangle",
decayMult: 1.0,
gainMult: 0.85,
pitchMult: 1.1,
effects: [],
}sounds/packs.ts: Export the generated pack (use generateSoundPack for the full 17 roles, or generateCustomSoundPack for per-role tune/instrument overrides plus hand-crafted hero sounds) and register it in soundPacksSoundPackName is derived automatically as keyof typeof soundPacksbun run check before committingprefers-reduced-motionbun run dev # Iterate: docs live at http://localhost:3000/docs
bun run build # Verify: every page must prerender cleanlyNew docs pages go in content/docs/ with a title in frontmatter, ordered via the nearest meta.json. New demos go in app/docs/_components/demos/ and render inside <DemoBlock>.
feat/add-angular-support or fix/button-sound-on-enterbun run dev, bun run build, npx tsc --noEmitbun run registry:buildFor large contributions (new framework support, new sound packs), open an issue first to discuss the approach.
If you find sensory-ui useful, consider sponsoring the project. Sponsorship helps maintain and improve the library.