Skip to content

itsP33t/bento

Repository files navigation

Bento

A modular productivity dashboard you can make your own.

Next.js React TypeScript Tailwind CSS License: AGPL v3

Live Demo · Report Bug · Request Feature


About

Bento is a personal dashboard built around a simple idea: a grid of cards you arrange yourself. Each card does one thing well — track time, manage tasks, view your calendar, check the weather. No accounts, no cloud dependency. Everything stays in your browser's localStorage, and you can export/import your workspace as a .bento file whenever you want.

The whole thing is built on a card registry pattern, so adding new cards is straightforward — create a component, register it, done.

Light & Dark Mode

Bento ships with full light and dark theme support. Toggle with the D key or through the command palette.

Bento light and dark mode comparison

Features

Cards

Card Description
Time Tracker Stopwatch with a configurable daily goal (0.5–24h). Visual progress fill, estimated completion time, daily logs that persist across days, and a celebratory animation when you hit your target.
Calendar Week view with hourly grid. Supports iCalendar (ICS) URLs, color-coded events, configurable start/end hours, and shows your tracked hours from the time tracker.
Tasks Full CRUD with three priority levels (high, medium, low). Tag system with autocomplete from previously used tags, tag-based filtering, and bulk clear options.
Motivational Quotes Pulls quotes from my own API that requires no auth and will always be free. Hit refresh for a new one.
Web Embed Embed any website via iframe. Point it at docs, dashboards, or anything else you want at a glance.
Weather Real-time weather via geolocation or manual coordinates. Temperature in Celsius or Fahrenheit, humidity, wind speed, and configurable refresh intervals with caching.
Pomodoro Classic Pomodoro timer with a circular progress ring. Configurable work/break durations, auto-start options, session tracking with visual dots, and sound/notification alerts.
Notes Rich text editor powered by Tiptap. Formatting toolbar with bold, italic, strikethrough, headings, lists, code, and blockquotes. Auto-saves to localStorage with debounced writes.

Dashboard

  • Drag-and-drop grid — 2x3 responsive layout powered by @dnd-kit. Swap cards between slots freely.
  • Row spanning — First-row cards can expand to double height for more room.
  • Edit mode — Toggle via Ctrl+K to rearrange, configure, add, or remove cards.
  • Per-card settings — Each card type can define its own settings (numbers, text, dropdowns, toggles) that render automatically in edit mode.
  • Command paletteCtrl+K / Cmd+K opens a searchable command menu for timer controls, theme toggling, workspace actions, and more.

Data & Privacy

  • Fully local — All data lives in localStorage. No accounts, no telemetry, no server-side storage.
  • Workspace export/import — Save your entire setup as a .bento JSON file. Restore it on another browser or share it with someone.
  • Cross-tab sync — Changes propagate between tabs via a custom sync event.

Other

  • Responsive — Works on mobile (single column) and desktop (3 columns).
  • Keyboard shortcutsD for theme toggle, Ctrl+K for command palette.
  • Console bridgewindow.os exposes state for debugging and scripting from the browser console.

Getting Started

Feel free to use the hosted version at https://bento.p33t.net, it will always stay free and up to date

Prerequisites

  • Node.js 18+
  • npm

Installation

git clone https://github.com/itsP33t/bento.git
cd bento
npm install

Development

npm run dev          # Dev server with Turbopack (localhost:3000)
npm run build        # Production build
npm run lint         # ESLint
npm run format       # Prettier
npm run typecheck    # TypeScript type checking

Adding a New Card

  1. Create a folder and component at components/cards/<name>/<name>.tsx
  2. Add a CardRegistryEntry to lib/card-registry.ts
  3. Add the new type string to the CardType union in lib/types.ts

Cards receive no props — they access state through the useOs() context and useCardSettings() hook. Check components/cards/_template-card/ for a starting point.

Tech Stack

  • Framework — Next.js 16 (App Router) + React 19
  • Language — TypeScript (strict mode)
  • Styling — Tailwind CSS 4 + shadcn/ui (Radix)
  • Drag & Drop — @dnd-kit
  • Command Palette — cmdk
  • Icons — Lucide React
  • Theming — next-themes with oklch() CSS variables

Roadmap

Cards

  • Timer card (without any goal)
  • GitHub issues card
  • Kanban board card
  • Service uptime card (ping monitoring)
  • Snippet manager card
  • Quick links launchpad
  • Now Playing card (Spotify integration)

Platform

  • Cloud backup & sync (privacy first)
  • Full app reset option

Contributing

Contributions are welcome. If you're planning something bigger than a bug fix, open an issue first so we can discuss the approach.

  1. Fork the repo
  2. Create your branch (git checkout -b feat/something)
  3. Commit your changes
  4. Push to the branch
  5. Open a Pull Request

License

Distributed under the GNU Affero General Public License v3.0. See LICENSE for details.


Built with ☕ && ♥️ by Petr Koukal (P33t)

About

A modular productivity dashboard you can make your own.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

Packages

 
 
 

Contributors