Launched this week

Sora UI
Motion-first React components for the shadcn registry
24 followers
Motion-first React components for the shadcn registry
24 followers
Sora UI is a motion-first React component registry on the shadcn model. Install @soralabs/* primitives with the CLI, own the code in your repo, and ship scroll reveals, text effects, magnetic UI, and more — powered by Motion and GSAP with reduced-motion support built in. Includes a docs MCP server so Cursor and Claude can search components and install guides while you build. Free to use at ui.soralabs.io.vn.







Hey PH! 👋
I'm Axyl, maker of Sora UI.
We built a motion-first component distribution for React — copy-paste install via shadcn CLI, fully owned source in your repo. Think shadcn/ui, but animation is the default, not an afterthought.
Built with Tailwind, Framer Motion, and GSAP.
Docs: ui.soralabs.io.vn
I started this because porting complex vanilla animations into React and making them production-ready (handling cleanups, lifecycles, and performance) kept being harder than it should be. Sora UI is our answer:
Accessible Defaults: Built-in support for prefers-reduced-motion out of the box.
AI-Native / MCP Ready: We built a dedicated remote MCP server https://mcp.soralabs.io.vn. If you use Cursor or Claude, your AI assistant can contextually browse our docs, search primitives, and install components for you via natural language!
Would love to know: what's the one UI animation you always wished was a one-liner install?
Feedback, questions, roast the docs — all welcome. Thanks for checking us out today!
how does the MCP server actually work in practice, like does Cursor automatically suggest Sora components when im building or do I have to invoke it manually?
@ali51725738983 MCP doesn’t auto-suggest Sora components in the editor. You enable the sora-ui server in Cursor; then the AI agent can query live docs and the component catalog when relevant. For installing @soralabs/* into a project, you also need the shadcn MCP. Explicit prompts like “list Sora components” or “get install info for scroll-gallery” work best — the agent won’t always hit MCP on its own.
How does the MCP server handle updates when you push new components, does it auto refresh inside Cursor or do I need to restart the agent each time?
@englsz56 Great question! You do not need to restart Cursor or the AI agent every time a new component is pushed.
Here is how Sora UI’s remote MCP server handles updates under the hood:
* Dynamic Live Fetching: The remote MCP server doesn't hardcode the components. Instead, it is connected directly to our live registry and documentation API. Every time you ask Cursor/Claude to find or inject a component, the MCP server queries the live registry in real-time.
* Instant Availability: Because the LLM interacts with the live API through the MCP tools, any new primitives or updates we push to the repository are instantly "hot-swappable" and available to your agent without any manual refresh.
Note: The only time you would ever need to hit the "Refresh" button in Cursor's MCP settings is if we modify the underlying MCP tool definitions themselves (e.g., adding a brand new tool/function to the server). But for pushing new UI components into the existing registry, it is 100% automatic!
The shadcn-style ownership of the code is what sold me, and the reduced-motion fallback actually feels thoughtful rather than tacked on. Wish the GSAP bundle was a bit lighter but the magnetic button primitives alone are worth grabbing.
@ahmet4316897505 Thanks so much for the feedback! I'm really glad the code ownership model and the reduced-motion fallbacks resonated with you. We firmly believe that high-performance motion should never compromise accessibility or leave developers fighting external wrapper limitations. Regarding the GSAP bundle weight—you actually hit on the exact reason why we chose the shadcn-style architecture! Because you copy and own the code directly, you only pay the bundle cost for what you actually choose to install. If you stick to our vanilla primitives (like the Cursor Trail, which runs on zero dependencies), your bundle stays completely untouched. GSAP is strictly isolated to the complex physics primitives like the Magnetic Button where CSS transitions hit a wall. That being said, we are definitely looking into ways to optimize or even offer ultra-light vanilla alternatives for those physics-heavy primitives in future updates.
Motion-first approach feels right for modern sites, and having reduced-motion baked in by default is something more libraries should do.
@keremkazlmqir Spot on! Thank you so much for calling this out.
You perfectly highlighted the exact balance we tried to strike with Sora UI. For modern websites, motion isn't just "eye candy" anymore—it’s a fundamental part of user experience, micro-interactions, and visual storytelling.
However, the biggest tragedy of modern web animation is that "cool effects" often come at the expense of performance and accessibility. We strongly believe that accessibility shouldn't be a premium feature or an afterthought that you tack on at the end of a project. It needs to be baked straight into the foundational primitives from line one.
Building `prefers-reduced-motion` directly into the hook listeners ensures that developers can ship beautiful, motion-first experiences without alienating users who prefer or need a static interface.
Really appreciate your thoughtful feedback! 🚀
finally a motion library that doesn't fight me on accessibility, the reduced-motion fallbacks are baked in which is rarer than it should be. the docs MCP idea is genuinely clever too
@erhanporl Thanks — that means a lot. Reduced motion isn't an afterthought here; it's wired into the primitives from the start so you don't have to bolt it on later. And yeah, the docs MCP idea was basically "what if the assistant could read the registry directly instead of guessing from outdated docs or training data" — glad it landed.