pixel-openspace

Your cron jobs, at their desks.

pixel-openspace shows your scheduled jobs, CI pipelines and AI agents as a pixel-art office. Running jobs sit down and type, idle ones go get coffee, and when one fails its PC starts to smoke and the lead walks over.

$
Star it on GitHubBuy me a coffeeMIT

A shadcn/ui component for Next.js and React. Free and open source under the MIT license.

Sky
Try it:

Read the room

Each job gets a desk and a status. You set the status from whatever you already track: an exit code, a queue, a last run date. The room does the rest, so one glance tells you what is running, what is stuck and what broke.

working
Sits at its desk and types. Code scrolls on its screen, its keyboard and fans light up.
ok
Up to date. Gets up now and then for a coffee, a round of arcade or a chat with a colleague.
late
Missed its run. Dozes at its desk until it catches up.
failed
Red screen, smoking PC. The lead walks over and stays until it recovers.
off
Not loaded. An empty chair and a post-it on a dark screen.
never
Hired, but has not run yet.
on-demand
Only works when asked. Lives its life in between.

Set it up in three steps

  1. 1

    Add the component

    The shadcn CLI copies the component’s files into your components folder, yours to read and change. The labels in the room use Pixelify Sans: load it with next/font into a --font-pixel variable.

    $
  2. 2

    Feed it your jobs

    Expose your jobs’ state, poll it every few seconds and pass it down. When a status changes, the room reacts: the job sits down to work, or stands up, stretches and says its last log line in a speech bubble.

    // app/api/jobs/route.ts
    export async function GET() {
      const jobs = await db.job.findMany()
      return Response.json(
        jobs.map((job) => ({
          id: job.id,
          name: job.name,
          emoji: job.emoji,
          status: job.running ? 'working' : job.lastExitCode ? 'failed' : 'ok',
          lastRun: job.lastRunAt,
          nextRun: job.nextRunAt,
          lastMessage: job.lastLogLine,
        })),
      )
    }
  3. 3

    Leave it on a screen

    It is made to stay open all day on a side screen, in fullscreen. The room runs at 30 frames per second and only redraws what moved. After twenty quiet seconds everything freezes until someone gets up, and at night everybody stays at their desk.

Also in the room

None of this is needed to watch your jobs. It is there because an office you look at every day should be a nice place.

Five themes

A geek open space with RGB towers, a 1986 corporate office with green-phosphor CRTs, a gym where every job rides an exercise bike, a bright modern office in light oak with standing desks and a ping-pong table, or a restaurant kitchen where a failed job burns its pan.

Two arcade cabinets

Component Snake and Chip Breaker, both playable. High scores hang on the wall.

A wall screen

Up to four numbers of your own: jobs today, errors, queue size, budget.

The lead

Does its rounds while it runs, then reports in front of the wall screen and reads your announcements.

A window on the weather

Sun, rain, snow or storm, day or night, with the temperature you pass it.

Visitors and couriers

Bump a counter and someone walks in: a visitor greets the lead, a courier drops a parcel.

Seasons

Pumpkins and a ghost all October, a Christmas tree and garlands all December, hidden eggs and a hopping bunny at Easter.

The office cat

Naps on whichever desk was left empty.

CI pipelines too

A GitHub Actions workflow, a GitLab pipeline, a deploy: it types while it runs, and a broken build smokes like any failed job.

The day timeline

Under the room, one dot per run since midnight, red when it failed. Pass each job its runs.

A settings gear

Whoever watches the room renames the sign, picks the weather city, the theme and the language, and turns things on or off. Saved in their browser.

Alerts and sound

Browser notifications when a job fails, 8-bit beeps for starts and failures. Both off until you turn them on.