CASE STUDY · CG SIGNS

A sign shop that knows when someone’s at the door.

I turned the TVs, speakers and security cameras at Custom Graphics & Sign Designs into one self-hosted system that informs the team, plays the music and announces visitors on its own — on hardware the shop owns, with no subscriptions.

CLIENT
CG Signs
INDUSTRY
Custom sign manufacturing
TIMELINE
July – August 2026
MY ROLE
Design, hardware selection, software, installation and integration
SCOPE
Office signage, multi-zone audio, camera viewer, visitor announcements
HARDWARE
$550, once
SERVICES
FACILITIESSOFTWAREAI
Office TV running the signage: the current weather for Orange Park, a four-part forecast, the date and time, and a ticker showing the song playing in the office.
Office TV — weather, time, and the song playing in the office on the ticker.

01 — THE CHALLENGE

The building had all the right equipment, and none of it talked to anything else.

The TV signage apps charged per screen, per month. Checking a camera meant opening a vendor app, so nobody did. The speakers played one stream for the whole building, and a visitor at an empty front desk could wait with no one knowing.

02 — WHAT I BUILT

One system now runs the screens, the music and the front door — visitors and deliveries are announced over the speakers on their own.

Raspberry Pi · Python · PipeWire · AirPlay · Person detection · Offline text-to-speech · Claude Code

03 — THE RESULT

$0/mo

Signage, audio, cameras and visitor announcements run on $550 of hardware the shop owns, bought once — no subscriptions.

WHAT FEEDS IT
  • Cameras Live video for the team, and person detection at the front desk and the shop door.
  • Signage editor One page for the playlist, ticker, portfolio and announcements.
  • CGSigns OS The live production board for the staff screens.
SELF-HOSTED

One connected system

  • Camera relay
  • Person detection
  • Announcements
  • Signage feeds
  • Audio zones
WHERE IT SHOWS UP
  • Office and shop speakers Separate music zones, with announcements over the top.
  • Staff and lobby TVs Signage, with the production board kept off the lobby screens.
  • Any screen in the building Every camera, live in a browser.
The cameras feed the announcements, the announcements play through the audio system, and the office TV carries both the signage and its own audio zone. Everything runs on hardware the shop owns, on its own network.

The TVs run themselves.

Each TV is driven by a Raspberry Pi — about $110, once — running a full-screen browser that boots straight into the display. Content lives on a small server on the shop’s own network, not in anyone’s cloud.

  • Two feeds from one source. Staff screens show a live production board pulled from CGSigns OS, the shop’s business platform. Lobby screens get a separate feed with that board removed entirely, so a customer in the waiting area never sees what’s on the schedule.
  • One editor for everything. A simple web page manages the playlist, a news ticker, the portfolio, safety messages, announcements and team celebrations. Screens pick up changes within a minute.
  • No remote to hunt for. The Pi wakes the TV, switches it to the right input and puts it to sleep on a daily schedule over HDMI-CEC. New screens are found on the network and added in two clicks.
  • It fails safe. If the production feed can’t be reached, the screens keep showing the last good board instead of going blank.

That frees the Apple TVs the shop already owned for rooms where AirPlay is actually useful.

Every zone plays its own music, and announcements cut through.

A single Raspberry Pi 5 runs the building’s sound. Each zone is one USB audio interface feeding one amplifier, and the office TV doubles as a zone over its own HDMI cable.

  • Independent zones. The office and the shop each appear as their own AirPlay speaker, so anyone on the team can stream to either from a phone — or point both at the same source to play the whole building.
  • Separate music and announcement volumes. Every zone has its own music level and its own announcement level, set from a phone. Turning the music down never makes announcements quieter.
  • Announcements that don’t step on the music. Spoken announcements and live push-to-talk from a team phone duck the music, play, then bring it back mid-track instead of restarting it.
  • No clipped first words. The announcement path stays open and silent between uses, so a page starts instantly — the difference between “Jamie, line two” and “amie, line two.”
  • Listen from your desk. Any zone can be heard in a browser exactly as its speakers play it, announcements included.

Announcements are generated by an offline text-to-speech voice once, at startup, so pressing a button plays the clip immediately. Changing the wording regenerates it on the next restart.

Every camera, on any screen in the building.

One web page shows every shop camera live — on a phone, a laptop or the wall TV — without a separate app. The existing recorder keeps recording exactly as before; this is a live view layered on top, and it stays inside the shop’s network.

  • Each camera streams once. A small relay server holds a single connection per camera and shares it with every viewer. Ten people watching still means one stream per camera, and the video is repackaged rather than re-encoded, so the server barely notices.
  • Fast where it matters. The grid uses each camera’s lighter substream; clicking a tile opens its full-resolution feed.
  • It looks after itself. The grid resizes to fill any screen, and a tile that drops or freezes reconnects on its own.
  • Setup without the manual. Adding a camera takes a name and one click — the setup page finds the right stream settings on its own.
  • Two buttons that act in the real world. Visitor and Delivery play a spoken announcement over the building speakers — one press, with a short lockout so a double-click can’t fire it twice.

The cameras cover the times nobody is watching.

The buttons cover the times someone is watching the cameras. The cameras cover the rest: two of them watch for people waiting, and announce them over the speakers automatically.

Neither repeats itself, and the desk counts as occupied for a short while after someone was last seen there, so bending down to grab something doesn’t trigger a page.

Detecting people, not motion.

The rule is about people standing still. Someone sitting at the front desk makes no motion, and neither does someone patiently waiting. Motion detection answers the wrong question, so each camera runs a person-detection model on the shop’s own server — no video goes to an outside service.

The detector takes about half a second per frame. Instead of queueing frames it can’t keep up with, it always grabs the newest one and drops the rest. Otherwise a 15-second wait would gradually be measured against video that was older and older.

The detector draws a box around each person, and the real decision is which point in that box has to be inside a zone. Every camera sees people differently, so each zone chooses for itself.

  • Feet. Where the floor is visible — the most precise, because it keys on where someone actually stands.
  • Head. Where vehicles or furniture block the lower half of the frame and cut the box off at a different height every time.
  • Any part. At the front desk, where the camera only sees part of whoever is sitting there.

Zones are drawn by clicking points on a live frame, with the detections drawn over it, so tuning a camera takes minutes rather than guesswork.

Running in the building today.

The signage, audio, camera viewer and visitor announcements are in daily use. The last piece is paging from the desk phones through the same speakers. The audio side is built and tested; it’s waiting on a paging device for the phone system.

NEXT PROJECT Building the operating system for a sign shop START YOURS Have equipment in your building that should be working together? Let’s talk. Book a call →