A highly configurable, aesthetically pleasing personal page in the style of Bento grids. Built with React, Vite, Tailwind CSS, and designed for Cloudflare Pages.
- Configurable: Fully data-driven via
public/config.json. - Bento Objects:
- Text Blocks: Titles, subtitles, quotes.
- Link Blocks: Auto-fetching of OG images and Favicons (via Cloudflare Functions).
- Social Blocks: Icon-based social links.
- Photo Blocks: Full-bleed images.
- Map Blocks: Interactive Leaflet maps (OpenStreetMap).
- Animated Text: Floating/Marquee text bubbles.
- Responsive: Adapts to Mobile, Tablet, and Desktop.
- Accessible: Semantic HTML, visible focus states, ARIA labels.
- Dark Mode: Sleek dark theme by default.
- Custom Icons: Add a decorative background icon to any block using Lucide icon names.
Edit public/config.json to update your profile and grid blocks.
{
"profile": { ... },
"blocks": [
{ "type": "text", "size": "large", "icon": "Sparkles", "content": { ... } },
...
]
}text: text content.link: url card.photo: image.map: leaflet map.social: social icon.- Supported platforms:
github,twitter,linkedin,instagram,facebook,youtube,email,web. - Unsupported platforms: Use
"icon": "IconName"(e.g."icon": "MessageSquare") to use any Lucide icon.
- Supported platforms:
animText: animated text bubbles.time: current local time with day/night theme. Config:timezone(e.g., "America/New_York"),label.music: display a favorite track. Config:query(auto-fetch from iTunes) ORtitle,artist,cover,url.movie: display a movie you're watching. Config:query(auto-fetch) ORtitle,year,cover,url.book: display a book you're reading. Config:query(auto-fetch) ORtitle,author,cover,url.techStack: grid of tools. Config:title,tools(array of{name, icon}).github: fetching GitHub stats. Config:usernameORusername+repo.newsletter: email subscription form. Config:title,placeholder,buttonText.project: status card for a project. Config:title,description,status("Live", "Beta", "Building"),repo,url.calendar: link to booking page with date visual. Config:url.video: autoplay loop video. Config:url(mp4 link),poster(optional image).divider: horizontal separator.
small: 1x1medium: 2x1large: 2x2wide: 4x1tall: 1x2full: 4x2square-sm: 1x1square-md: 2x2 (responsive)square-lg: 3x3 (responsive)square-xl: 4x4 (responsive)
- Clone the repository:
git clone https://github.com/halans/bento-page.git cd bento-page - Install dependencies:
npm install
- Run development server (UI only, no link previews):
npm run dev
- Recommended: Run with Wrangler (supports Link Previews & Cloudflare Functions):
npm run pages:dev
- Connect your repository to Cloudflare Pages.
- Build command:
npm run build - Build output directory:
dist - Cloudflare will automatically detect the
functions/directory.
You can deploy directly from your terminal:
npm run deployThis command builds the project and uploads the dist folder to Cloudflare Pages.
- Framework: React + Vite
- Styling: Tailwind CSS
- Icons: Lucide React
- Maps: React Leaflet
- Animations: Framer Motion
- SEO: React Helmet Async