The Problem
Teams need a lightweight, zero‑runtime‑dependency project‑management UI that can be deployed as a static site and can be customized without a heavy framework. The repo delivers a ready‑to‑run SPA that can be forked and tweaked for internal dashboards or as a demo for new clients.
What This Does
The application renders a project‑management workspace with a home dashboard, inbox, task lists, and multiple project‑view modes (board, list, table, calendar, timeline, files).
src/main.jspulls insrc/styles/index.cssand imports the routing and action modules.src/shell/render.jsbuilds the shell (sidebar, topbar, layout) and injects the current page or view.src/pages/...modules export a function that returns an HTML string built from the global store (S).src/views/...provide specialized renderers for board, calendar, etc.src/actions/...modifySand trigger a re‑render via the event tableAdefined insrc/actions/actions.js.- UI helpers in
src/ui/provide toasts, selects, and generic render functions.
The UI is built with plain ES modules and CSS; no React or Vue runtime is bundled. Icons are pulled from Lucide via the Vite virtual:icons plugin, so only used icons are bundled.
How It Is Wired
Entry point – index.html loads src/main.js.
main.jsimportssrc/styles/index.cssand thensrc/actions/actions.js.actions/actions.jsimports eachactions/*.jsmodule, each of which registers a handler on the shared action tableA.main.jsalso importssrc/shell/render.js,src/shell/view-engine.js, and the page modules.- The router in
view-engine.jslistens to the URL hash and calls the appropriate page or view function. - The page/view returns an HTML string;
render()injects it into the shell, then dispatches arenderedevent. actions/events.jsattaches a delegated click handler todocument.body; when an element withdata-a="actionName"is clicked,A.actionName()executes, potentially updating the store and callingrender()again.
Wiring hotspots –
src/actions/actions.jsis the hub; most state changes flow through its table.src/shell/render.jsis the blast radius for UI changes; a single call rebuilds the whole DOM subtree.src/core/store.jsholds the immutable state; any function that mutates it (e.g.,actions/teams.js) triggers a re‑render.
The graph is acyclic except for the action table’s self‑referencing A object, which is safe because handlers are pure functions.
How To Use It
Setup –
git clone https://github.com/moses-y/gr8r-studio
cd gr8r-studio
npm install
The .nvmrc pins Node 22, but the README accepts Node 18+.
Configuration – No environment variables needed; all data is in src/data/seed.js.
Running –
npm run dev # http://localhost:5173, hot reload
npm run build # dist/ production bundle
npm run preview # serve the build locally
The build output is a static SPA; deploy dist/ to any static host or Vercel (via vercel.json).
Real‑World Use
A product‑manager can fork the repo, replace src/data/seed.js with their workspace JSON, and publish it on an internal portal. Because all logic lives in the browser, no API backend is required for a demo; switching to a real API would involve swapping out src/core/store.js and the action modules.
// Example: replace seed data
import { S } from './core/store.js';
S.projects = loadFromServer(); // fetch JSON, then re‑render
Code Health & Issues
- Missing test suite – No
__tests__folder; all paths are untested. - No license – Repository lacks a
LICENSEfile; usage rights unclear. - CI –
.github/workflows/ci.ymlruns lint, format check, and a production build, but does not run tests. - Documentation – Only
README.mdand a screenshot; no API docs or component description.
These observations come from scanning the file tree and CI configuration; no static analysis run has been performed.
The Bottom Line
Gr8r Studio is a clean, framework‑free SPA that demonstrates a full project‑management UI in plain JavaScript. It is ideal for rapid internal demos or as a base for a custom static dashboard. However, the lack of tests, a license, and runtime support for server‑side data limits its use in production environments without further investment.