Project goal: build a digital signage system for our college (Communications and Information Studies, University of Kentucky) that meets the following requirements:

- the content is modular and is easily re-arranged or re-styled
- existing content from the college CMS / web site can be displayed
- external content can be displayed (RSS, XML, etc)
- system can be controlled remotely by multiple users with different levels of access
- only open standards are used (ruling out Flash, PowerPoint), leaving the content open and accessible
- content is stored locally rather than by a third party
- system is running on open source code rather than expensive commercial software

Only local images are allowed.
- Apple Xserve
- Apple mac mini (any model will do)
- mac mini mount
- an LCD panel with 1080p resolution - 40" TV in our case
- LCD mount
- an HDMI cable
- a Mini Display Port / HDMI adapter

- Mac OS X Server / Apache / PHP / MySQL enabled
- Drupal 6.16 with various additional modules (details below)
- Apple Remote Desktop for remotely administering server and player machines
- Mac OS X on the player machines
- Plainview on the player machines
- a custom written Apple Script on the player machines

Problem 1: Web site styling must be different from signage styling

Install ThemeKey module that allows different themes to be applied to different areas of the site. Load two themes of your choice - one for the site, one for the signage. Under Blocks, disable all navigation and menus (=all interactive items that require the user input) in the signage theme. If it produces orphan elements, kill those elements in code by editing template.php file in your theme's folder. Keep a backup of the file in case you cut too much and break everything.

Problem 2: Need to have control over what content is displayed in signage

Install the CCK module. Create a new content type and give it a memorable name - like Signage slide. Make sure it has an image field for the actual slide and and a text field for the story to go with it. Set the image to resize to the size you want so that it doesn't mess up your layout. In our case, everything is sampled to 800x600 pixels.

Problem 3: Need to have scrolling effects without locking the content in a proprietary format

Install Views module. Install Views Slideshow module. Create a slideshow using your Signage Slides. Decide where and how you want to display titles, stories and thumbnails. Set the times for the transition duration and time each slide is displayed. Once you have created multiple slides, you don't want to show all of them. Set the display properties to a reasonable number of slides and thumbnails (9 in our case because that's how many fit under the 800 pixel wide image in one row) and arrange them in descending order by creation date so only the newest ones are shown.

Problem 4: Need to have external content (e.g. news items from a newspaper)

Find the newspaper RSS address. Add it using the Aggregator module that is part of the default Drupal 6 package (Core optional). Create a separate view for the feed using Views, styling and titling it the way you want (display it as a list, table, etc).

Problem 5: Need to have weather information

Install Weather of Yahoo Weather Forecast Module. Customize it to your location. You now have a weather block that you can put on any page

Problem 6: Need to have a clock with date and time

Install the Clock module. Make sure you get the Libraries API and the jquerytimers.js script and put them in appropriate places. Set the clock to display the time the way you want - which means you might have to create a new custom date and time format (Administer > Site Configuration > Date and time > Formats tab). Set the clock to update continuously using Javascript.

Problem 7: Need to assemble various pieces of content and display them on one page.

Install Panels. Create a new page in panels. Give it a memorable name (like Signage) and a memorable path (like Choose the layout for your page - number of columns, fluid / fixed layout, and so on. Add content to the page - signage slideshow in one column, RSS in another, clock and weather in the third one in our case. They can always be re-arranged / re-sized / re-styled later as your system evolves. Your signage page is ready - you can test in a browser from anywhere (huge advantage for troubleshooting).

Problem 8: Need to feed the content to my signage displays.

Create a barebones Mac OS X installation - no iLife, no fonts, no multiple language support, no extra software. Install a free app called Plainview that allows to run web content in kiosk mode. Clone the installation to all your player machines, as many as you choose to have. Open Plainview and set it to display your page on application startup (, or whatever path you decide to have).

Problem 9: Need to make sure signage works even after a power failure and that it pulls new content from the server automatically as it is added.

You need your system to load Plainview on startup and to show nothing else (no dock, address bar, etc). You also need to able to reload the page periodically to retrieve new content, especially if you are using RSS / weather forecasts and other time sensitive materials. Both tasks can be achieved by a simple AppleScript:

on idle
-- the applescript only calls attention to itself when the idle period is up

tell application "Plainview"
--confirms your kiosk app is the front application
end tell

tell application "System Events"
tell process "Plainview"
keystroke "r" using {command down}
end tell
end tell
--sets the idle period in seconds. i.e. plainview will refresh every 1800 seconds (= every 30 minutes)
return 1800

end idle

Cut and paste the above code into an AppleScript editor (part of the default Mac OS X install, to be found in Applications > Utilities). Hit Compile. Save the script as an Application (look for that option in the File Format menu). Give your script a memorable name (like Refresh). Add your Refresh app to your startup items (System Preferences > Accounts - click on your user account, open Login Items tab, hit the plus button below, navigate to your Refresh app).

Problem 10: Need to administer the player machines remotely.

Install Apple Remote Desktop on the machine from which you will control everything. ARD is expensive but it quickly pays for itself because it saves so much time. Connect your player machines using Ethernet cables rather than wireless. Hard code the IP addresses (DHCP with manual address option). Install ARD clients on player machines, enable remote access. Connect to player machines using ARD from your control machine.

Problem 11: Need to save energy.

On your player machines go to System Preferences > Energy Saver. Hit the Schedule button and set your boxes to run 9 to 5 on week days only - or whatever schedule you need. While you are at it, disable display sleep and screen savers so your signage display is not disrupted.

Problem 12: Need to allow several people to add various types of signage content, controlling access and the level of privileges.

You can assign access to the Signage Slide content type in Drupal administration. (Administer > User Management > Permissions). For finer gradations, install Content Access module or if that is still not enough, ACL.

Problem 13: Need to display an urgent message

Create a node with a memorable path (such as yoursite/urgent). Restrict access to it to people who are allowed to send urgent messages - i.e. main administrator and the big bosses. Keep it empty by default. Using the Panels module functionality, edit your signage page (see Problem 7) and add the urgent message node to one of your columns. When the bad things happen, the big boss logs in, edits the empty urgent message to include the actual message (CLASSES CANCELLED TODAY or whatever else it might be), saves the modules. On the next refresh (in our case within 30 minutes), the message is displayed on your signage screens.

Problem 14: I have other needs but you didn't write about them. Can't figure out how to get things to work

Post your question as a comment here.

Our signage system, full resolution screenshot (1920 pixels wide)