Skip to content

Overview

Campus Hub is a modular digital signage platform built for campus and building displays. It lets you design widget-based layouts in a visual configurator and deploy them to any screen — all without a backend server.

  • Widgets — Self-contained UI components (clocks, event lists, weather, video players, etc.) that you drag onto a grid layout.
  • URL-based configuration — The entire display state is encoded into the URL. Share a link and any browser opens the exact same display. No database required.
  • CORS proxy — Widgets that pull external data (RSS feeds, iCal calendars, weather APIs) route requests through an optional CORS proxy you control.
  • Static export — The app compiles to a static site (next build with output: "export"), so it can be hosted on any CDN, GitHub Pages, or Cloudflare Pages.
┌──────────────┐ ┌──────────────────┐
│ Configurator │──URL──▶│ Display Page │
│ /configure │ │ /display?config= │
└──────────────┘ └──────────────────┘
┌────────────┼────────────┐
▼ ▼ ▼
WidgetA WidgetB WidgetC
(clock) (events) (weather)
│ │
▼ ▼
iCal feed Weather API
(via CORS (via CORS
proxy) proxy)
  1. You design a layout in the Configurator at /configure.
  2. Click Generate URL@firstform/json-url tries multiple codecs, keeps the shortest token, and appends it as a query parameter.
  3. Open the URL on any display screen. The Display page at /display decodes the config and renders widgets in a CSS grid that scales to fit the screen.
  4. Widgets that need external data fetch it client-side, optionally routing through a CORS proxy.
WidgetType keyDescription
ClockclockDigital clock with date, 12/24h formats
Poster Carouselposter-carouselRotating image slides with titles
Events Listevents-listUpcoming events from static data or iCal feeds
News Tickernews-tickerScrolling headline bar from RSS feeds
WeatherweatherCurrent conditions via Open-Meteo
YouTubeyoutubeEmbedded YouTube player
Web EmbedwebAny website in an iframe
ImageimageSingle image display
Media Playermedia-playerHTML5 audio/video player
SlideshowslideshowFull-screen image slideshow with transitions
Poster Feedposter-feedImages loaded from an RSS feed
Bus Connectionbus-connectionGTFS real-time transit departures
QR CodeqrcodeDynamic QR code generation
Climbing Gymclimbing-gymClimbing gym occupancy display
Widget Stackwidget-stackStack multiple widgets with auto-rotation
  • Next.js 16 with static export (output: "export")
  • React 19 with TypeScript
  • Tailwind CSS 4 for styling
  • GridStack.js for the drag-and-drop editor
  • @firstform/json-url for URL compression