花びら 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