花びら React, simplified

React without the
overengineering ⚡️

No server component BS, no infinite boilerplate, just React, Vite and all the tools you love.

Get Started Visit Leaf PHP
              
                npx create-hana-app@latest
                
                
                
                
              
            
LikeButton.jsx
import { useStore } from '@hanabira/store';

// likes starts at 0 — set once in createStore()
const LikeButton = () => {
  const [likes, setLikes] = useStore('likes');
  const addLike = () => setLikes((prevLikes) => prevLikes + 1);

  return (
    <button onClick={addLike}>
      ❤️ {likes}
    </button>
  );
};
store { likes: 0 }
app.hanajs.dev
🌸 my-app ❤️ 0

Hana makes state global by default

This button and the navbar badge are two separate components reading the same store. Try it.

Two components, one useStore('likes') — no context, no providers, no prop drilling. Go on, click it.

機能 What's in the box

Instead of server components, we give you...

Hana gives you strong foundations without the overhead

Routes from files

Your file system is the router.

Drop a file in pages/ and it's a route. Click a file to see where it takes you — dynamic params included.

pages/

app.hanajs.dev/

🌸 Welcome home

pages/index.jsx renders at /. No config, no route table.

About us

pages/about.jsx becomes /about. That's the whole story.

Flower #42

Brackets are dynamic params — useParams() gives you { id: '42' }.

404, gracefully

_404.jsx catches anything that doesn't match. Loading pages work the same way.

仲間 Backed by the best

Used & sponsored by the very best.

Community voices

Feedback From Our Community

Grow with us

Connect with our community of devs.

Discord logo