d17fd89e405489ab43411a2389e6452b7223db4a
Scratching Post — Sunbeam Digital Signage
A self-hosted digital notice board / signage system built on ASP.NET Core 8, designed for IIS on Windows Server 2019/2022.
Terminology
| Component | Name | Description |
|---|---|---|
| Individual slide | Meow | A single content slide — WYSIWYG, embed, or calendar |
| Slide collection | PURR | Persistent User Requests and Reminders — a device playlist |
| Priority slide | ASK | Attention Seeking Kitty — overrides collection order (planned) |
| Display node | Kitten | A device that plays a playlist of Meows |
| Backend | Scratching Post | The admin panel where all content is managed |
| Framework | Sunbeam | The underlying system powering everything |
Features
- WYSIWYG Editor — TinyMCE with image upload, tables, rich text
- Embed Web Content — iframe any URL as a slide
- ICS Calendar — display upcoming events from any .ics feed
- Device Playlists — assign slides to specific devices with individual durations
- Per-Device Resolution — configure display resolution per device
- URL-Based Devices — access displays via
http://server/frontofhouse,http://server/staffroom - Drag-and-Drop Playlist — reorder slides in the admin
- Live Updates — display polls for changes every 30 seconds
- Full-Screen Display — hidden cursor, clock overlay, progress bar
- Smooth Transitions — fade or slide transitions
Requirements
- Windows Server 2019 or 2022
- IIS with ASP.NET Core Hosting Bundle
- .NET 8 SDK (for building) / .NET 8 Runtime (for hosting)
Quick Start
1. Install Prerequisites
Download and install:
- .NET 8 SDK
- ASP.NET Core Hosting Bundle (under Hosting Bundle)
2. Build
cd ScratchingPost
dotnet restore
dotnet publish -c Release -o ./publish
3. Deploy to IIS
- Open IIS Manager
- Create a new Site (e.g. ScratchingPost)
- Set the physical path to the
publishfolder - Set the binding (e.g. port 80, or a hostname like
sign.local) - Set the Application Pool to No Managed Code (the Hosting Bundle handles .NET)
- Ensure the App Pool identity has write access to the publish folder (for SQLite DB and uploads)
4. First Run
The SQLite database (noticeboard.db) is created automatically on first start with two demo devices seeded:
- Front of House at
http://server/frontofhouse - Staff Room at
http://server/staffroom
5. Access
| URL | Purpose |
|---|---|
http://server/admin |
Scratching Post admin panel |
http://server/admin/slides |
Manage Meows (slides) |
http://server/admin/devices |
Manage Kittens (devices) |
http://server/frontofhouse |
Front of House display |
http://server/staffroom |
Staff Room display |
Configuration
Edit appsettings.json:
{
"MaxUploadSizeMB": 20
}
How It Works
- Create Meows (slides) — use the WYSIWYG editor for rich content, embed external URLs, or point to an ICS calendar feed
- Create Kittens (devices) — give each a name, URL slug, and display resolution
- Build PURRs (playlists) — assign Meows to Kittens with individual durations and drag-and-drop ordering
- Display — point a browser at
http://server/{slug}and it runs full-screen with smooth transitions
The display page polls for changes every 30 seconds, so updates appear on devices without restarting.
Display Controls
Keyboard shortcuts on display pages (useful during setup):
| Key | Action |
|---|---|
| Right Arrow or Space | Skip to next slide |
| Left Arrow | Go to previous slide |
| F or F11 | Toggle fullscreen |
| C | Toggle cursor visibility |
Data Storage
- Database: SQLite (
noticeboard.db) — created automatically, zero config - Uploads:
wwwroot/uploads/— images uploaded via TinyMCE or the file upload API - Both need write permissions for the IIS App Pool identity
TinyMCE Note
The WYSIWYG editor uses TinyMCE CDN with no-api-key. This shows a small notification banner. For production, register for a free TinyMCE API key at tiny.cloud and replace no-api-key in Views/Slides/Create.cshtml and Edit.cshtml.
Project Structure
ScratchingPost/
├── Controllers/ # MVC controllers
│ ├── AdminController # Dashboard
│ ├── SlidesController # Meow CRUD
│ ├── DevicesController # Kitten CRUD + Playlist management
│ ├── DisplayController # Device display + playlist API
│ └── ApiController # Image upload, ICS parsing
├── Data/ # EF Core DbContext + seed data
├── Models/ # Slide, Device, DeviceSlide
├── Routing/ # DeviceSlugConstraint
├── Views/ # Razor views (Admin, Slides, Devices, Display)
├── wwwroot/ # Static files
│ ├── css/ # admin.css, display.css
│ ├── js/ # admin.js, display.js (Sunbeam engine)
│ └── uploads/ # User-uploaded images
├── appsettings.json # Configuration
├── web.config # IIS configuration
└── NoticeBoard.csproj # Project file
Version History
- v1.0.0 — Initial release: WYSIWYG slides, embed, ICS calendar, device playlists, drag-and-drop ordering, live polling, IIS-ready deployment
Description
Sunbeam Digital Signage — A self-hosted notice board system for IIS. WYSIWYG slides, embeds, ICS calendars, device playlists.
Releases
1
Languages
JavaScript
83.5%
HTML
10%
C#
4.5%
CSS
2%