Skip to content

Repository files navigation

KuroBox — Universal Kanban & Spreadsheet Engine

KuroBox Banner

Next.jsSupabaseThemeTypeScriptVercelVersion

A Japanese Tech Minimalist workspace for tracking anything — jobs, tasks, projects — with a fully dynamic schema, dual views, 7-profile theme engine, 職人 onboarding wizard, and a real-time Supabase backend.


Table of Contents


Overview

KuroBox is a full-stack productivity app that combines the flexibility of a kanban board with the structure of a spreadsheet. Every board has its own dynamic schema — define the columns, field types, and status pipeline without touching code.

Built for speed and extensibility: spin up a "Job Tracker", a "Sprint Board", or a blank canvas in seconds. Import data from CSV or Markdown, drag cards between stages, and switch seamlessly between Kanban and Table views. The 7-profile theme engine spans three dark industrial themes, three soft Japanese pastel light themes, and a manga-inspired comic panel mode — all with instant CSS-variable-driven repaints and cross-device persistence via Supabase.


What's New

v4.0 — Production SEO & OpenGraph Engine

AreaChange
Production metadataFull OpenGraph + Twitter card metadata with KuroBanner.png as the social preview image
Theme-aware faviconsprefers-color-scheme: light → dark-ink icon; prefers-color-scheme: dark → white icon — auto-swaps in browser tabs
Apple touch iconapple-touch-icon.png at 180×180 from Kuroboxfavicon/Icons/
metadataBaseReads NEXT_PUBLIC_SITE_URL env var; falls back to https://kurobox.vercel.app
Static asset pipelineAll favicon assets staged into public/Kuroboxfavicon/ for Next.js static serving

v3.95 — Hover Contrast & Onboarding Language Refresh

AreaChange
Light-theme card hoverPer-theme CSS overrides: Sakura→#F3EBEB, Matcha→#ECF0EC, Shinto→#E9ECF3, Panel-X→#FFFFFF — no more dark-overlay contrast fail
Panel-X tactile pop.kb-card:hovertranslate(-2px,-2px) shadow-[6px_6px_0px_#000000] manga panel lift
Stepper progress tracker[ 満 | 満 | 空 ] STEP 02/03 with kanji fill indicators replacing plain progress bars
Step 1 — 職人署名Boot lines in Japanese; placeholder → 職人名を入力...; label → 職人署名 · SHOKUNIN SIGN-OFF REGISTRY
Step 2 — 空間意匠Header → 空間意匠; subtext → カラープロファイルとキャンバスを選択 — LIVE PREVIEW
Step 3 — 起動プロトコルHeader → 起動プロトコル; finalize button → 黒箱を起動する →

v3.9 — Column Layout & Asset Updates

AreaChange
Column widthw-[300px] shrink-0 — uniform fixed width, no content-stretch blowout
Column vertical scrollmax-h-[calc(100vh-240px)] overflow-y-auto — long columns scroll internally, header stays pinned
Empty drop zonesZero-card columns: compact min-h-[80px] h-auto with dashed border — expands as cards land
README bannerKuroBanner.gif animated banner + title updated to "Universal Kanban & Spreadsheet Engine"

v3.8 — Kanban Clipping & Icon Quality

AreaChange
Kanban horizontal scrollRemoved max-w-7xl justify-center — now w-full justify-start overflow-x-auto — columns never clip at viewport edges
Panel-X ViewToggle contrastInactive → bg-zinc-100 text-zinc-700; Active → bg-zinc-950 text-white font-bold shadow-[2px_2px_0px_#000000]
Hi-res brand logoKuroBoxLogo component upgraded to KuroBlack.png / KuroWhite.png — crisp, unblurred at any size
Auth logo sizeLogin/Signup emblems: w-16 h-16 md:w-20 md:h-20; App headers: size={32}

v3.5 — Soft Light Palettes & Favicon Pipeline

AreaChange
3 new light themesSakura (#FAF5F5 / #C05674), Matcha (#F5F7F5 / #3A6645), Shinto (#F4F6F9 / #3D5080) — replaced White-Out
Panel-X redesignLight comic-book gray #EFEFEF + #1A1A1A ink accent + Dela Gothic One manga typography
KuroBoxLogo componentReplaces all placeholder accent squares — theme-aware, auto-switches dark/light icon variant
Favicon pipelineTheme-aware <link> tags: dark OS → White icon; light OS → Black icon
Wallpaper transparencyOuter containers use bg-transparent — wallpaper canvas shows through properly
Japanese subtextsコントロールセンター, 職人署名 labels in dashboard header; 看板/台帳 kanji in ViewToggle
Login page redesignTactical card layout, KuroBoxLogo, SECURE WORKSPACE INTERFACE ACCESS // ログイン, theme-aware inputs

v3.0 — Shokunin Onboarding & Interface Settings

AreaChange
3-step Shokunin wizardIdentity (shokunin tag) → Calibration (live theme + wallpaper picker) → Data Deck (board template)
/settings/interfaceDedicated theme + wallpaper settings page accessible post-onboarding
Dashboard centeringBoards grid centered with max-w-5xl mx-auto — no full-width stretch
DB schema v3.0profiles.active_wallpaper, profiles.shokunin_tag, initialize_starter_board() function

v2.5 — UI/UX & Functional Overhaul

AreaChange
Kanban card bordersStatus-based semantic outlines — Interview → violet, Offer → emerald, Rejected → crimson
Table slab layoutFloating structural slabs (border-separate border-spacing-y-1.5 + rounded-md) — collapsible by status group
Double-click cell editTable cells render display mode by default; double-click activates inline editor
Badge filter toolbarText search + tag popover + active badge tokens with ✕ clear — works across both views
Dashboard Command Center4 metric widgets, board list with pipeline progress bars, live Activity Log feed
Canvas wallpaper presetsMatrix Grid, Dot Matrix, Subtle Static — chosen in onboarding, persisted to Supabase

Features

FeatureDescription
Dual viewsToggle between Kanban (drag-and-drop) and Table (slab layout with inline editing)
Dynamic schemaAdd, rename, drag-reorder, hide, or delete fields per board — text, select, date, URL, markdown
Pipeline column CRUDAdd, rename, delete status columns with migrate-or-destroy reallocation modal
Board templates"Job Tracking", "Task Board", "Blank Canvas" — pre-configured schemas with one click
Board CRUDCreate, rename (inline), and delete boards from the Command Center dashboard
Card detail modalFull overlay with status pills, all field editors, and delete
Schema ManagerTwo-tab UI: Data Fields (draggable, position-0 = Kanban card title) and Pipeline Columns
Universal ImporterDrag-drop CSV or Markdown files to import cards in bulk
Badge filter toolbarText search + multi-select tag filter popover + active badge tokens — works across both views
Status-based card outlinesSemantic low-opacity border tints based on pipeline status
Canvas wallpaper presetsGrid, Dots, Noise — persisted to Supabase profiles
Command Center dashboardMetrics widgets + per-board pipeline progress bars + Activity Log feed
7-profile ThemeEngineStealth · Radiation · Overdrive · Sakura · Matcha · Shinto · Panel-X — CSS var themes with localStorage + Supabase sync
Anti-flicker themesInline <script> reads localStorage before first paint — zero flash on reload
AuthEmail/password signup + Google OAuth via Supabase Auth
Shokunin onboarding wizard3-step 職人セットアップ: sign-off tag → workspace design → starter ledger deploy
Interface settings page/settings/interface — change theme and wallpaper post-onboarding
KuroBoxLogo componentTheme-aware brand logo — auto-switches KuroBlack.png / KuroWhite.png based on active theme
OpenGraph & Twitter cardsKuroBanner.png social preview; theme-aware browser tab favicons
RLSRow-Level Security — each user only sees their own boards and cards
Optimistic UILocal state updates instantly on mutation; background DB sync

Tech Stack

LayerTechnology
FrameworkNext.js 15 (App Router, RSC + Client Components)
LanguageTypeScript 5
Database & AuthSupabase (PostgreSQL + RLS + Auth)
Supabase client@supabase/ssr (server + browser split, lazy init)
StylingTailwind CSS 3 + CSS custom properties (theme engine)
Drag & Drop@hello-pangea/dnd
IconsLucide React
CSV parsingPapaParse
Markdown parsinggray-matter
FontsPlus Jakarta Sans (body) · Dela Gothic One (Panel-X headings)
DeploymentVercel

Architecture

KuroBox
├── Next.js App Router
│ ├── (auth) → /login, /signup — public pages with Google OAuth
│ ├── (app) → /dashboard, /board/[boardId], /settings/interface — protected
│ └── auth/callback → OAuth + email confirmation code exchange
│
├── Server Components (RSC)
│ ├── Fetch boards / cards via server Supabase client
│ └── Redirect unauthenticated users
│
├── Client Components
│ ├── useBoard() → board state + CRUD with optimistic updates
│ ├── useCards() → card state + CRUD with optimistic updates
│ ├── ThemeProvider → CSS var switching, localStorage, Supabase sync
│ └── All Supabase clients instantiated LAZILY inside event handlers
│
├── Middleware (middleware.ts)
│ └── Redirects /dashboard and /board/* to /login if no session
│
└── Supabase
├── profiles → 1-1 with auth.users (auto-created via trigger)
├── boards → title, config (JSONB schema), pipeline_columns, owner
└── cards → attributes_data (JSONB), status, sort_order

Key Architectural Decision: Lazy Client Initialization

In Next.js App Router, client components still render server-side for the HTML shell. Any browser-only SDK that calls window or document at module scope will crash during SSR.

Solution: createClient() is always called inside event handlers and async callbacks — never at the component body level.

// ✅ Correct — called inside the handlerasyncfunctionhandleLogin(){constsupabase=createClient()awaitsupabase.auth.signInWithPassword({ email, password })}// ❌ Wrong — crashes SSRconstsupabase=createClient()

Theme Engine Architecture

Themes are driven by CSS custom properties set on html[data-theme="…"]. Tailwind classes like bg-zinc-900 are remapped to CSS vars via high-specificity html .class overrides in globals.css. The entire UI theme-switches without touching component code.

User picks theme
→ setTheme(id) in ThemeContext
→ document.documentElement.setAttribute('data-theme', id) // instant CSS repaint
→ localStorage.setItem('kurobox-theme', id) // persist locally
→ supabase.from('profiles').update({ active_wallpaper }) // cross-device sync

Anti-flicker: an inline <script> in the root layout reads localStorage and sets data-theme synchronously before any content paints.


Getting Started

Prerequisites

1. Clone and Install

git clone https://github.com/RuumiDev/KuroBox.git
cd KuroBox
npm install

2. Set Up Environment Variables

cp .env.local.example .env.local

Edit .env.local:

NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.coNEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keyNEXT_PUBLIC_SITE_URL=https://your-domain.vercel.app

Find the Supabase values in Supabase Dashboard → Project Settings → API.

3. Apply the Database Schema

In your Supabase dashboard, open the SQL Editor and run the full contents of supabase/schema.sql. This creates:

  • profiles — auto-created for each new user via trigger
  • boards — with JSONB config and schema_definition columns
  • cards — with JSONB attributes_data column for dynamic fields
  • RLS policies ensuring users only access their own data
  • v2.0 → v3.5 migration blocks (safe to run on a fresh schema)

4. Configure Auth

In your Supabase dashboard:

  1. Authentication → Settings → Site URL: http://localhost:3000 (dev) or your Vercel domain (prod)
  2. Authentication → Settings → Redirect URLs: add both:
    • http://localhost:3000/auth/callback
    • https://your-domain.vercel.app/auth/callback

For Google OAuth (optional):

  1. Create OAuth credentials in Google Cloud Console
  2. Supabase Dashboard → Authentication → Providers → Google → paste Client ID + Secret
  3. Add the Supabase callback URL shown there to your Google app's Authorized redirect URIs

5. Run the Dev Server

npm run dev

Open http://localhost:3000. First-time users go through the 3-step Shokunin onboarding wizard.


Environment Variables

VariableRequiredDescription
NEXT_PUBLIC_SUPABASE_URLYour Supabase project URL
NEXT_PUBLIC_SUPABASE_ANON_KEYYour Supabase anon/public key
NEXT_PUBLIC_SITE_URLRecommendedFull production URL — used for OpenGraph metadataBase

Never commit .env.local — it's in .gitignore.


Database Schema

profiles

ColumnTypeNotes
iduuidFK → auth.users.id
usernametextSet during onboarding (shokunin tag)
shokunin_tagtextCraftsman sign-off displayed in dashboard header (v3.0)
background_patterntextCanvas preset: none | grid | dots | noise (v2.5)
active_wallpapertextExtended wallpaper key (v3.0)
canvas_contrast_modetextsoft-ink for light themes (v3.5)
updated_attimestamptz

boards

ColumnTypeNotes
iduuidPK
user_iduuidFK → profiles.id
titletextBoard display name
configjsonbView, column_order[], visible attributes
schema_definitionjsonbFull field schema (types, options, drag order)
pipeline_columnsjsonbDedicated column sequence store (v2.0)
created_attimestamptz

cards

ColumnTypeNotes
iduuidPK
board_iduuidFK → boards.id
statustextMaps to a value in config.column_order (NOT NULL)
sort_orderintegerPosition within a status column
schema_layout_orderintegerField render ordering (v2.0)
attributes_datajsonbDynamic field values keyed by AttributeField.id
created_attimestamptz
updated_attimestamptzDrives the Activity Log feed

Project Structure

src/
├── app/
│ ├── (auth)/
│ │ ├── login/page.tsx → Tactical card login + Google OAuth + KuroBoxLogo
│ │ └── signup/page.tsx → Signup form + Google OAuth + KuroBoxLogo
│ ├── (app)/
│ │ ├── layout.tsx → Auth guard (server)
│ │ ├── dashboard/
│ │ │ ├── page.tsx → Server component — fetches boards
│ │ │ └── DashboardClient.tsx → Command Center: metrics, board grid, Activity Log
│ │ ├── board/[boardId]/
│ │ │ ├── page.tsx → Server component — fetches board + cards
│ │ │ └── BoardClient.tsx → Kanban / Table + filter toolbar + all modals
│ │ └── settings/interface/
│ │ └── InterfaceSettingsClient.tsx → Theme + wallpaper settings page
│ ├── auth/callback/route.ts → OAuth + email code exchange
│ ├── globals.css → CSS vars for 7 themes + Tailwind overrides + hover fixes
│ ├── layout.tsx → ThemeProvider + anti-flicker script + full OG metadata
│ └── page.tsx → Redirects to /dashboard
│
├── components/
│ ├── ui/ → Button, Modal, Badge
│ ├── navigation/
│ │ ├── ThemeSelector.tsx → Dropdown theme switcher (topbar) — 7 themes
│ │ └── KuroBoxLogo.tsx → Theme-aware brand logo (KuroBlack/KuroWhite PNG)
│ ├── kanban/
│ │ ├── KanbanBoard.tsx → Full-width horizontal scroll, no max-w clip
│ │ ├── KanbanColumn.tsx → w-[300px] fixed + max-h scroll + adaptive empty zone
│ │ └── KanbanCard.tsx → Status borders + kb-card hover class
│ ├── table/ → TableView (slab layout), TableCell (double-click edit)
│ ├── schema/
│ │ ├── SchemaManager.tsx → Two-tab: Data Fields (draggable) + Pipeline Columns
│ │ └── ColumnReallocationModal.tsx → Migrate-or-destroy modal for column deletion
│ ├── importer/ → UniversalImporter (CSV + Markdown)
│ ├── onboarding/
│ │ ├── OnboardingStepper.tsx → 3-step 職人セットアップ wizard with kanji progress tracker
│ │ └── steps/
│ │ ├── StepIdentity.tsx → 職人署名 — shokunin tag input
│ │ ├── StepCalibration.tsx → 空間意匠 — live theme + wallpaper picker
│ │ └── StepDataDeck.tsx → 起動プロトコル — board template selector
│ ├── CardModal.tsx → Card detail overlay
│ └── ViewToggle.tsx → 看板 / 台帳 view switcher with kanji subtexts
│
├── lib/
│ ├── context/
│ │ └── ThemeContext.tsx → ThemeProvider, 7 THEME_PROFILES, backgroundPattern
│ ├── hooks/
│ │ ├── useBoard.ts → Board CRUD + optimistic state
│ │ └── useCards.ts → Card CRUD + optimistic state
│ ├── supabase/
│ │ ├── client.ts → Browser client factory (lazy)
│ │ └── server.ts → Server client (RSC / middleware)
│ └── utils/
│ ├── templates.ts → Board template definitions
│ └── importers.ts → CSV + Markdown parsers
│
├── types/
│ └── index.ts → AttributeType, BoardConfig, Card, ThemeId, etc.
│
middleware.ts → Auth guard for protected routes
public/
├── Kuroboxfavicon/
│ ├── Black/ → Dark-background icon set (used on dark OS)
│ ├── White/ → Light-background icon set (used on light OS)
│ └── Icons/ → KuroBanner.png, KuroBlack.png, KuroWhite.png
supabase/
└── schema.sql → Full DB schema with v2.0 → v3.5 migrations

Design System & Theme Engine

KuroBox uses a Modern Japanese Tech Minimalist visual language with a 7-profile theme engine. All colors are driven by CSS custom properties, making every component theme-aware without code changes.

Theme Profiles

#NameAccentBackgroundVibe
01Stealth#FFDE4D Cyber Yellow#000000 Pure BlackDefault dark workspace
02Radiation#39FF14 Toxic Lime#111411 Deep ForestNeon-matrix energy
03Overdrive#FF5F00 Hot Orange#121214 CharcoalIndustrial smelting core
04Sakura#C05674 Blush Rose#FAF5F5 Petal CreamSoft blossom pastel
05Matcha#3A6645 Bamboo Sage#F5F7F5 Pale Tea WhiteCalm Zen garden
06Shinto#3D5080 Indigo Slate#F4F6F9 Porcelain IceCool misty shrine
07Panel-X#1A1A1A Manga Ink#EFEFEF Comic GrayTactical comic panel

Semantic Color Tokens

TokenCSS varUsage
bg-kb-bg--kb-bgPage background
bg-kb-surface--kb-surfaceCards, panels
bg-kb-surface-alt--kb-surface-altHover states, nested surfaces
border-kb-border--kb-borderCard/input borders
bg-kb-accent--kb-accentPrimary buttons, active indicators
bg-kb-accent-hover--kb-accent-hoverButton hover state
text-kb-accent-fg--kb-accent-fgText on accent-colored backgrounds
text-kb-text--kb-textPrimary text
text-kb-text-muted--kb-text-mutedSecondary/helper text
text-kb-text-dim--kb-text-dimTertiary/placeholder text

Design Rules

  • Border radius: rounded-sm (sharp, geometric — never rounded-full) except auth cards (rounded-lg)
  • Shadows: Crisp shadow-[3px_3px_0px_var(--kb-accent)] on drag; shadow-[6px_6px_0px_#000000] on Panel-X hover
  • Transitions: 150–200ms ease for hover, 120ms cubic-bezier for dropdowns
  • Icons: Lucide React SVGs only — no emoji
  • Typography: Plus Jakarta Sans (all themes) + Dela Gothic One (Panel-X headings + mono)
  • Japanese subtexts: Kanji labels beneath English text in headers and toggles for aesthetic identity

Current Constraints

Data & Persistence

  • Single-user only — RLS is scoped per user_id. No sharing or multi-user board access.
  • No real-time sync — Supabase Realtime is not subscribed to. Two open tabs will not sync without a manual refresh.
  • Card sort order is session-local — Kanban drag-reorder does not persist sort_order to the DB on drag-end.
  • No file attachments — The attachment field type exists but renders no upload UI; no Supabase Storage bucket is wired.

Auth & Security

  • Google OAuth requires manual Supabase setup — Not configurable via env vars alone; requires enabling the provider in the Supabase Dashboard.
  • No password reset flow — "Forgot password" routes do not exist.

UI & Responsiveness

  • No mobile drag-and-drop@hello-pangea/dnd uses mouse events. Kanban drag on touch screens is non-functional.
  • Filter is client-side only — Scans in-memory cards; large boards (1000+ cards) may see latency.

Performance

  • No pagination — All boards and all cards for a board are fetched in a single query.
  • Tailwind CSS override approach — Global html .bg-black { … } overrides may produce unexpected results in edge-case third-party components.

Roadmap

Tier 1 — High Impact, Low Complexity

  • Badge filter toolbar (v2.5)
  • Schema field drag reordering (v2.0)
  • Pipeline column CRUD (v2.0)
  • Canvas wallpaper presets (v2.5)
  • 7-theme engine (v3.5)
  • Shokunin onboarding wizard (v3.0)
  • Production OpenGraph / favicon pipeline (v4.0)
  • 🔲 Kanban sort-order persistence — write sort_order to DB on drag-end
  • 🔲 Password reset flowresetPasswordForEmail email link
  • 🔲 Column sort in Table view — sort rows by clicking any column header
  • 🔲 CSV / JSON export — download a board's cards as a flat file

Tier 2 — Core Product Expansion

  • Activity log feed (v2.5)
  • Operational metrics dashboard (v2.5)
  • Interface settings page (v3.0)
  • 🔲 File attachment uploads — Supabase Storage bucket wired to attachment field type
  • 🔲 Card comments — threaded comments per card
  • 🔲 Board duplication — clone a board with schema and optionally cards
  • 🔲 Keyboard shortcutsN new card, E edit, / search, 1/2 switch view, T cycle theme
  • 🔲 Pagination / virtual scroll — cursor-based pagination for 500+ card boards
  • 🔲 Mobile drag-and-drop — replace @hello-pangea/dnd with dnd-kit

Tier 3 — Collaboration & Scale

  • 🔲 Real-time sync — Supabase Realtime on boards + cards
  • 🔲 Board sharing (read-only links) — public board URL with signed token
  • 🔲 Team workspaces — organisation entity with member roles and shared RLS
  • 🔲 Invitations — email invite flow with accept/reject

Tier 4 — Power Features

  • 🔲 Calendar / Timeline view — Gantt-style view from date field attributes
  • 🔲 AI card generation — natural language → structured card via Edge Function + LLM
  • 🔲 Automation rules — "when status changes to X → trigger webhook / assign field"
  • 🔲 Custom theme builder — user-defined accent / background / surface beyond the 7 presets
  • 🔲 Native mobile app — React Native / Expo sharing business logic

Deployment (Vercel)

1. Push to GitHub

git add .
git commit -m "KuroBox v4.0"
git remote add origin https://github.com/your-username/kurobox.git
git push -u origin main

2. Import to Vercel

  1. Go to vercel.com/new
  2. Import your GitHub repository
  3. Framework preset: Next.js (auto-detected)
  4. Add environment variables:
    • NEXT_PUBLIC_SUPABASE_URL
    • NEXT_PUBLIC_SUPABASE_ANON_KEY
    • NEXT_PUBLIC_SITE_URL — your Vercel domain (e.g. https://kurobox.vercel.app)
  5. Click Deploy

3. Update Supabase Auth URLs

After your Vercel deployment URL is live:

  1. Supabase Dashboard → Authentication → Settings
  2. Add to Redirect URLs: https://your-domain.vercel.app/auth/callback
  3. Update Site URL to your Vercel domain

License

MIT — free to use, fork, and build upon.

About

A Japanese Tech Minimalist workspace that combines Kanban boards, spreadsheets, and custom workflows into one flexible productivity engine.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages