README.md

April 28, 2026 · View on GitHub

Modular Grid Page

A modular, themeable browser start page built with React and Vite

Demo Website

Multitheme

preview-1 preview-2 preview-3


About

Modular Grid Page is a fast, customizable browser homepage built as a React app. The layout is a responsive auto-sizing tile grid. Every tile, theme, and data source is configurable through the built-in settings panel — no config files to edit by hand.


Installation

git clone https://github.com/timothypholmes/startup-page.git
cd startup-page
make setup

make setup installs dependencies and produces a production build. Then start the dev server:

make dev

All make commands

CommandDescription
make setupInstall dependencies and build — run this first
make devStart the Vite development server (opens browser)
make buildProduction build → dist/
make build-localBuild with base path / for local serving
make build-vercelBuild for Vercel deployment
make serveBuild and serve dist/ locally on port 8000
make previewPreview the last production build
make deployDeploy to GitHub Pages
make cleanRemove dist/ and Vite cache
make installInstall frontend dependencies only
make helpPrint all available targets

Configuration

All settings are managed through the in-app Settings panel (gear icon on the dashboard). Settings are persisted in IndexedDB with a localStorage mirror, and can be exported/imported as a JSON backup file.

There is no config file to edit manually.


Features

Dashboard

  • Responsive tile grid — column count adjusts to viewport width; tile size is adjustable via a slider in Settings → Layout (7–14 rem)
  • Tile visibility — show or hide any tile from Settings → Layout without losing its position
  • Command palette — press ⌘K / Ctrl+K to navigate the dashboard by keyboard (powered by kbar)

Tiles

TileDescription
Photo tiles (×6)Unsplash or Wikimedia photos, one per configurable topic list. Images are cached locally (Cache API + localStorage) for instant display on return visits.
Bookmarks (×5)Editable link groups with title, name, and URL per entry
WeatherCurrent conditions and temperature via OpenWeather API
Solar graphCanvas-drawn arc showing today's sun position, twilight events, and a hover scrubber
ClockLive local time
Feature panelCycles between Headlines (Reddit), Windy map, Pomodoro timer, and a photo tile. Arrow buttons or dots switch modes.
Decorative video (×2)Looping background video; tall and small viewport into the same shared scene
SearchMulti-engine search box

Appearance

  • Theme palettes — several built-in palettes plus a custom theme editor (paste shadcn-compatible CSS variables)
  • Light / Dark / System mode
  • Card shape — soft, rounded, or sharp corners
  • Image effects — per-photo-tile GPU filters: Paper Texture, Fluted Glass, Water, Image Dithering, Halftone Dots, Halftone CMYK (via Paper Design shaders)

Settings panel tabs

  • Appearance — theme mode, palette, custom themes, grid density, card shape, decorative media toggle, image effects
  • Layout — tile visibility toggles, tile size slider
  • Content — location (lat/lng), units (imperial/metric), API keys, video URLs, video zoom/offset, headline source (subreddit + rotation speed), Unsplash topic tags per tile, bookmarks, timer duration

Settings can be exported to a timestamped JSON file and re-imported at any time.


API Keys

Both keys are optional — the page works without them using fallback data sources.

KeyWhere to get itUsed for
OpenWeather API keyopenweathermap.orgCurrent weather conditions
Unsplash Access Keyunsplash.com/developersHigh-quality photo tiles (falls back to Wikimedia without it)

Enter keys in Settings → Content → Location and API Settings.


Tech Stack

LibraryRole
ReactUI framework
ViteBuild tool and dev server
Tailwind CSS v4Utility styling
Radix UIAccessible dialog, tabs, slider, switch primitives
shadcn-style componentsComposed UI components (Button, Card, Input, etc.)
kbarCommand palette
Paper Design ShadersWebGL image filter effects
axiosUnsplash API requests

Deploying

GitHub Pages:

npm run deploy

Update the base field in vite.config.js to match your repository name before deploying.

Vercel / Netlify:

npm run build:vercel

Point your host's publish directory to dist/.